text:
/* *
 *
 *  (c) 2010-2019 Torstein Honsi
 *
 *  License: www.highcharts.com/license
 *
 *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
 *
 * */
'use strict';
import H from './Globals.js';
import U from './Utilities.js';
var defined = U.defined, discardElement = U.discardElement, extend = U.extend, isNumber = U.isNumber, isString = U.isString, pick = U.pick, splat = U.splat, syncTimeout = U.syncTimeout;
/**
 * Callback function to format the text of the tooltip from scratch.
 *
 * In case of single or shared tooltips, a string should be be returned. In case
 * of splitted tooltips, it should return an array where the first item is the
 * header, and subsequent items are mapped to the points. Return `false` to
 * disable tooltip for a specific point on series.
 *
 * @callback Highcharts.TooltipFormatterCallbackFunction
 *
 * @param {Highcharts.TooltipFormatterContextObject} this
 *        Context to format
 *
 * @param {Highcharts.Tooltip} tooltip
 *        The tooltip instance
 *
 * @return {false|string|Array<(string|null|undefined)>|null|undefined}
 *         Formatted text or false
 */
/**
 * @interface Highcharts.TooltipFormatterContextObject
 */ /**
* @name Highcharts.TooltipFormatterContextObject#color
* @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#colorIndex
* @type {number|undefined}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#key
* @type {number}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#percentage
* @type {number|undefined}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#point
* @type {Highcharts.Point}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#points
* @type {Array<Highcharts.TooltipFormatterContextObject>|undefined}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#series
* @type {Highcharts.Series}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#total
* @type {number|undefined}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#x
* @type {number}
*/ /**
* @name Highcharts.TooltipFormatterContextObject#y
* @type {number}
*/
/**
 * A callback function to place the tooltip in a specific position.
 *
 * @callback Highcharts.TooltipPositionerCallbackFunction
 *
 * @param {number} labelWidth
 *        Width of the tooltip.
 *
 * @param {number} labelHeight
 *        Height of the tooltip.
 *
 * @param {Highcharts.TooltipPositionerPointObject} point
 *        Point information for positioning a tooltip.
 *
 * @return {Highcharts.PositionObject}
 *         New position for the tooltip.
 */
/**
 * Point information for positioning a tooltip.
 *
 * @interface Highcharts.TooltipPositionerPointObject
 */ /**
* If `tooltip.split` option is enabled and positioner is called for each of the
* boxes separately, this property indicates the call on the xAxis header, which
* is not a point itself.
* @name Highcharts.TooltipPositionerPointObject#isHeader
* @type {boolean}
*/ /**
* @name Highcharts.TooltipPositionerPointObject#negative
* @type {boolean}
*/ /**
* The reference point relative to the plot area. Add chart.plotLeft to get the
* full coordinates.
* @name Highcharts.TooltipPositionerPointObject#plotX
* @type {number}
*/ /**
* The reference point relative to the plot area. Add chart.plotTop to get the
* full coordinates.
* @name Highcharts.TooltipPositionerPointObject#plotY
* @type {number}
*/
/**
 * @typedef {"callout"|"circle"|"square"} Highcharts.TooltipShapeValue
 */
''; // separates doclets above from variables below
var doc = H.doc, format = H.format, merge = H.merge, timeUnits = H.timeUnits;
/* eslint-disable no-invalid-this, valid-jsdoc */
/**
 * Tooltip of a chart.
 *
 * @class
 * @name Highcharts.Tooltip
 *
 * @param {Highcharts.Chart} chart
 *        The chart instance.
 *
 * @param {Highcharts.TooltipOptions} options
 *        Tooltip options.
 */
H.Tooltip = function () {
    this.init.apply(this, arguments);
};
H.Tooltip.prototype = {
    /**
     * @private
     * @function Highcharts.Tooltip#init
     *
     * @param {Highcharts.Chart} chart
     *        The chart instance.
     *
     * @param {Highcharts.TooltipOptions} options
     *        Tooltip options.
     *
     * @return {void}
     */
    init: function (chart, options) {
        /**
         * Chart of the tooltip.
         *
         * @readonly
         * @name Highcharts.Tooltip#chart
         * @type {Highcharts.Chart}
         */
        this.chart = chart;
        /**
         * Used tooltip options.
         *
         * @readonly
         * @name Highcharts.Tooltip#options
         * @type {Highcharts.TooltipOptions}
         */
        this.options = options;
        /**
         * List of crosshairs.
         *
         * @private
         * @readonly
         * @name Highcharts.Tooltip#crosshairs
         * @type {Array<*>}
         */
        this.crosshairs = [];
        /**
         * Current values of x and y when animating.
         *
         * @private
         * @readonly
         * @name Highcharts.Tooltip#now
         * @type {Highcharts.PositionObject}
         */
        this.now = { x: 0, y: 0 };
        /**
         * Tooltips are initially hidden.
         *
         * @private
         * @readonly
         * @name Highcharts.Tooltip#isHidden
         * @type {boolean}
         */
        this.isHidden = true;
        /**
         * True, if the tooltip is splitted into one label per series, with the
         * header close to the axis.
         *
         * @readonly
         * @name Highcharts.Tooltip#split
         * @type {boolean|undefined}
         */
        this.split = options.split && !chart.inverted;
        /**
         * When the tooltip is shared, the entire plot area will capture mouse
         * movement or touch events.
         *
         * @readonly
         * @name Highcharts.Tooltip#shared
         * @type {boolean|undefined}
         */
        this.shared = options.shared || this.split;
        /**
         * Whether to allow the tooltip to render outside the chart's SVG
         * element box. By default (false), the tooltip is rendered within the
         * chart's SVG element, which results in the tooltip being aligned
         * inside the chart area.
         *
         * @readonly
         * @name Highcharts.Tooltip#outside
         * @type {boolean}
         *
         * @todo
         * Split tooltip does not support outside in the first iteration. Should
         * not be too complicated to implement.
         */
        this.outside = pick(options.outside, Boolean(chart.scrollablePixelsX || chart.scrollablePixelsY));
    },
    /**
     * Destroy the single tooltips in a split tooltip.
     * If the tooltip is active then it is not destroyed, unless forced to.
     *
     * @private
     * @function Highcharts.Tooltip#cleanSplit
     *
     * @param {boolean} [force]
     *        Force destroy all tooltips.
     *
     * @return {void}
     */
    cleanSplit: function (force) {
        this.chart.series.forEach(function (series) {
            var tt = series && series.tt;
            if (tt) {
                if (!tt.isActive || force) {
                    series.tt = tt.destroy();
                }
                else {
                    tt.isActive = false;
                }
            }
        });
    },
    /**
     * In styled mode, apply the default filter for the tooltip drop-shadow. It
     * needs to have an id specific to the chart, otherwise there will be issues
     * when one tooltip adopts the filter of a different chart, specifically one
     * where the container is hidden.
     *
     * @private
     * @function Highcharts.Tooltip#applyFilter
     * @return {void}
     */
    applyFilter: function () {
        var chart = this.chart;
        chart.renderer.definition({
            tagName: 'filter',
            id: 'drop-shadow-' + chart.index,
            opacity: 0.5,
            children: [{
                    tagName: 'feGaussianBlur',
                    'in': 'SourceAlpha',
                    stdDeviation: 1
                }, {
                    tagName: 'feOffset',
                    dx: 1,
                    dy: 1
                }, {
                    tagName: 'feComponentTransfer',
                    children: [{
                            tagName: 'feFuncA',
                            type: 'linear',
                            slope: 0.3
                        }]
                }, {
                    tagName: 'feMerge',
                    children: [{
                            tagName: 'feMergeNode'
                        }, {
                            tagName: 'feMergeNode',
                            'in': 'SourceGraphic'
                        }]
                }]
        });
        chart.renderer.definition({
            tagName: 'style',
            textContent: '.highcharts-tooltip-' + chart.index + '{' +
                'filter:url(#drop-shadow-' + chart.index + ')' +
                '}'
        });
    },
    /**
     * Creates the Tooltip label element if it does not exist, then returns it.
     *
     * @function Highcharts.Tooltip#getLabel
     * @return {Highcharts.SVGElement}
     */
    getLabel: function () {
        var tooltip = this, renderer = this.chart.renderer, styledMode = this.chart.styledMode, options = this.options, className = 'tooltip' +
            (defined(options.className) ? ' ' + options.className : ''), container, set;
        if (!this.label) {
            if (this.outside) {
                /**
                 * Reference to the tooltip's container, when
                 * [Highcharts.Tooltip#outside] is set to true, otherwise
                 * it's undefined.
                 *
                 * @name Highcharts.Tooltip#container
                 * @type {Highcharts.HTMLDOMElement|undefined}
                 */
                this.container = container = H.doc.createElement('div');
                container.className = 'highcharts-tooltip-container';
                H.css(container, {
                    position: 'absolute',
                    top: '1px',
                    pointerEvents: options.style && options.style.pointerEvents,
                    zIndex: 3
                });
                H.doc.body.appendChild(container);
                /**
                 * Reference to the tooltip's renderer, when
                 * [Highcharts.Tooltip#outside] is set to true, otherwise
                 * it's undefined.
                 *
                 * @name Highcharts.Tooltip#renderer
                 * @type {Highcharts.SVGRenderer|undefined}
                 */
                this.renderer = renderer = new H.Renderer(container, 0, 0, {}, undefined, undefined, renderer.styledMode);
            }
            // Create the label
            if (this.split) {
                this.label = renderer.g(className);
            }
            else {
                this.label = renderer
                    .label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, className)
                    .attr({
                    padding: options.padding,
                    r: options.borderRadius
                });
                if (!styledMode) {
                    this.label
                        .attr({
                        fill: options.backgroundColor,
                        'stroke-width': options.borderWidth
                    })
                        // #2301, #2657
                        .css(options.style)
                        .shadow(options.shadow);
                }
            }
            if (styledMode) {
                // Apply the drop-shadow filter
                this.applyFilter();
                this.label.addClass('highcharts-tooltip-' + this.chart.index);
            }
            // Split tooltip use updateTooltipContainer to position the tooltip
            // container.
            if (tooltip.outside && !tooltip.split) {
                set = {
                    x: this.label.xSetter,
                    y: this.label.ySetter
                };
                this.label.xSetter = function (value, key) {
                    set[key].call(this.label, tooltip.distance);
                    container.style.left = value + 'px';
                };
                this.label.ySetter = function (value, key) {
                    set[key].call(this.label, tooltip.distance);
                    container.style.top = value + 'px';
                };
            }
            this.label
                .attr({
                zIndex: 8
            })
                .add();
        }
        return this.label;
    },
    /**
     * Updates the tooltip with the provided tooltip options.
     *
     * @function Highcharts.Tooltip#update
     *
     * @param {Highcharts.TooltipOptions} options
     *        The tooltip options to update.
     *
     * @return {void}
     */
    update: function (options) {
        this.destroy();
        // Update user options (#6218)
        merge(true, this.chart.options.tooltip.userOptions, options);
        this.init(this.chart, merge(true, this.options, options));
    },
    /**
     * Removes and destroys the tooltip and its elements.
     *
     * @function Highcharts.Tooltip#destroy
     * @return {void}
     */
    destroy: function () {
        // Destroy and clear local variables
        if (this.label) {
            this.label = this.label.destroy();
        }
        if (this.split && this.tt) {
            this.cleanSplit(this.chart, true);
            this.tt = this.tt.destroy();
        }
        if (this.renderer) {
            this.renderer = this.renderer.destroy();
            discardElement(this.container);
        }
        H.clearTimeout(this.hideTimer);
        H.clearTimeout(this.tooltipTimeout);
    },
    /**
     * Moves the tooltip with a soft animation to a new position.
     *
     * @private
     * @function Highcharts.Tooltip#move
     *
     * @param {number} x
     *
     * @param {number} y
     *
     * @param {number} anchorX
     *
     * @param {number} anchorY
     *
     * @return {void}
     */
    move: function (x, y, anchorX, anchorY) {
        var tooltip = this, now = tooltip.now, animate = tooltip.options.animation !== false &&
            !tooltip.isHidden &&
            // When we get close to the target position, abort animation and
            // land on the right place (#3056)
            (Math.abs(x - now.x) > 1 || Math.abs(y - now.y) > 1), skipAnchor = tooltip.followPointer || tooltip.len > 1;
        // Get intermediate values for animation
        extend(now, {
            x: animate ? (2 * now.x + x) / 3 : x,
            y: animate ? (now.y + y) / 2 : y,
            anchorX: skipAnchor ?
                undefined :
                animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,
            anchorY: skipAnchor ?
                undefined :
                animate ? (now.anchorY + anchorY) / 2 : anchorY
        });
        // Move to the intermediate value
        tooltip.getLabel().attr(now);
        // Run on next tick of the mouse tracker
        if (animate) {
            // Never allow two timeouts
            H.clearTimeout(this.tooltipTimeout);
            // Set the fixed interval ticking for the smooth tooltip
            this.tooltipTimeout = setTimeout(function () {
                // The interval function may still be running during destroy,
                // so check that the chart is really there before calling.
                if (tooltip) {
                    tooltip.move(x, y, anchorX, anchorY);
                }
            }, 32);
        }
    },
    /**
     * Hides the tooltip with a fade out animation.
     *
     * @function Highcharts.Tooltip#hide
     *
     * @param {number} [delay]
     *        The fade out in milliseconds. If no value is provided the value
     *        of the tooltip.hideDelay option is used. A value of 0 disables
     *        the fade out animation.
     *
     * @return {void}
     */
    hide: function (delay) {
        var tooltip = this;
        // disallow duplicate timers (#1728, #1766)
        H.clearTimeout(this.hideTimer);
        delay = pick(delay, this.options.hideDelay, 500);
        if (!this.isHidden) {
            this.hideTimer = syncTimeout(function () {
                tooltip.getLabel()[delay ? 'fadeOut' : 'hide']();
                tooltip.isHidden = true;
            }, delay);
        }
    },
    /**
     * Extendable method to get the anchor position of the tooltip
     * from a point or set of points
     *
     * @private
     * @function Highcharts.Tooltip#getAnchor
     *
     * @param {Array<Highcharts.Point>} points
     *
     * @param {Highcharts.PointerEventObject} [mouseEvent]
     *
     * @return {Array<number>}
     */
    getAnchor: function (points, mouseEvent) {
        var ret, chart = this.chart, pointer = chart.pointer, inverted = chart.inverted, plotTop = chart.plotTop, plotLeft = chart.plotLeft, plotX = 0, plotY = 0, yAxis, xAxis;
        points = splat(points);
        // When tooltip follows mouse, relate the position to the mouse
        if (this.followPointer && mouseEvent) {
            if (mouseEvent.chartX === undefined) {
                mouseEvent = pointer.normalize(mouseEvent);
            }
            ret = [
                mouseEvent.chartX - chart.plotLeft,
                mouseEvent.chartY - plotTop
            ];
            // Pie uses a special tooltipPos
        }
        else if (points[0].tooltipPos) {
            ret = points[0].tooltipPos;
            // When shared, use the average position
        }
        else {
            points.forEach(function (point) {
                yAxis = point.series.yAxis;
                xAxis = point.series.xAxis;
                plotX += point.plotX +
                    (!inverted && xAxis ? xAxis.left - plotLeft : 0);
                plotY += (point.plotLow ?
                    (point.plotLow + point.plotHigh) / 2 :
                    point.plotY) + (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151
            });
            plotX /= points.length;
            plotY /= points.length;
            ret = [
                inverted ? chart.plotWidth - plotY : plotX,
                this.shared && !inverted && points.length > 1 && mouseEvent ?
                    // place shared tooltip next to the mouse (#424)
                    mouseEvent.chartY - plotTop :
                    inverted ? chart.plotHeight - plotX : plotY
            ];
        }
        return ret.map(Math.round);
    },
    /**
     * Place the tooltip in a chart without spilling over
     * and not covering the point it self.
     *
     * @private
     * @function Highcharts.Tooltip#getPosition
     *
     * @param {number} boxWidth
     *
     * @param {number} boxHeight
     *
     * @param {Highcharts.Point} point
     *
     * @return {Highcharts.Dictionary<number>}
     */
    getPosition: function (boxWidth, boxHeight, point) {
        var chart = this.chart, distance = this.distance, ret = {},
        // Don't use h if chart isn't inverted (#7242) ???
        h = (chart.inverted && point.h) || 0, // #4117 ???
        swapped, outside = this.outside, outerWidth = outside ?
            // substract distance to prevent scrollbars
            doc.documentElement.clientWidth - 2 * distance :
            chart.chartWidth, outerHeight = outside ?
            Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight, doc.body.offsetHeight, doc.documentElement.offsetHeight, doc.documentElement.clientHeight) :
            chart.chartHeight, chartPosition = chart.pointer.getChartPosition(), containerScaling = chart.containerScaling, scaleX = function (val) { return ( // eslint-disable-line no-confusing-arrow
        containerScaling ? val * containerScaling.scaleX : val); }, scaleY = function (val) { return ( // eslint-disable-line no-confusing-arrow
        containerScaling ? val * containerScaling.scaleY : val); },
        // Build parameter arrays for firstDimension()/secondDimension()
        buildDimensionArray = function (dim) {
            var isX = dim === 'x';
            return [
                dim,
                isX ? outerWidth : outerHeight,
                isX ? boxWidth : boxHeight
            ].concat(outside ? [
                // If we are using tooltip.outside, we need to scale the
                // position to match scaling of the container in case there
                // is a transform/zoom on the container. #11329
                isX ? scaleX(boxWidth) : scaleY(boxHeight),
                isX ? chartPosition.left - distance +
                    scaleX(point.plotX + chart.plotLeft) :
                    chartPosition.top - distance +
                        scaleY(point.plotY + chart.plotTop),
                0,
                isX ? outerWidth : outerHeight
            ] : [
                // Not outside, no scaling is needed
                isX ? boxWidth : boxHeight,
                isX ? point.plotX + chart.plotLeft :
                    point.plotY + chart.plotTop,
                isX ? chart.plotLeft : chart.plotTop,
                isX ? chart.plotLeft + chart.plotWidth :
                    chart.plotTop + chart.plotHeight
            ]);
        }, first = buildDimensionArray('y'), second = buildDimensionArray('x'),
        // The far side is right or bottom
        preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984
        /*
         * Handle the preferred dimension. When the preferred dimension is
         * tooltip on top or bottom of the point, it will look for space
         * there.
         *
         * @private
         */
        firstDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329
        point, min, max) {
            var scaledDist = dim === 'y' ?
                scaleY(distance) : scaleX(distance), scaleDiff = (innerSize - scaledInnerSize) / 2, roomLeft = scaledInnerSize < point - distance, roomRight = point + distance + scaledInnerSize < outerSize, alignedLeft = point - scaledDist - innerSize + scaleDiff, alignedRight = point + scaledDist - scaleDiff;
            if (preferFarSide && roomRight) {
                ret[dim] = alignedRight;
            }
            else if (!preferFarSide && roomLeft) {
                ret[dim] = alignedLeft;
            }
            else if (roomLeft) {
                ret[dim] = Math.min(max - scaledInnerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);
            }
            else if (roomRight) {
                ret[dim] = Math.max(min, alignedRight + h + innerSize > outerSize ?
                    alignedRight :
                    alignedRight + h);
            }
            else {
                return false;
            }
        },
        /*
         * Handle the secondary dimension. If the preferred dimension is
         * tooltip on top or bottom of the point, the second dimension is to
         * align the tooltip above the point, trying to align center but
         * allowing left or right align within the chart box.
         *
         * @private
         */
        secondDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329
        point) {
            var retVal;
            // Too close to the edge, return false and swap dimensions
            if (point < distance || point > outerSize - distance) {
                retVal = false;
                // Align left/top
            }
            else if (point < innerSize / 2) {
                ret[dim] = 1;
                // Align right/bottom
            }
            else if (point > outerSize - scaledInnerSize / 2) {
                ret[dim] = outerSize - scaledInnerSize - 2;
                // Align center
            }
            else {
                ret[dim] = point - innerSize / 2;
            }
            return retVal;
        },
        /*
         * Swap the dimensions
         */
        swap = function (count) {
            var temp = first;
            first = second;
            second = temp;
            swapped = count;
        }, run = function () {
            if (firstDimension.apply(0, first) !== false) {
                if (secondDimension.apply(0, second) === false &&
                    !swapped) {
                    swap(true);
                    run();
                }
            }
            else if (!swapped) {
                swap(true);
                run();
            }
            else {
                ret.x = ret.y = 0;
            }
        };
        // Under these conditions, prefer the tooltip on the side of the point
        if (chart.inverted || this.len > 1) {
            swap();
        }
        run();
        return ret;
    },
    /**
     * In case no user defined formatter is given, this will be used. Note that
     * the context here is an object holding point, series, x, y etc.
     *
     * @function Highcharts.Tooltip#defaultFormatter
     *
     * @param {Highcharts.Tooltip} tooltip
     *
     * @return {Array<string>}
     */
    defaultFormatter: function (tooltip) {
        var items = this.points || splat(this), s;
        // Build the header
        s = [tooltip.tooltipFooterHeaderFormatter(items[0])];
        // build the values
        s = s.concat(tooltip.bodyFormatter(items));
        // footer
        s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));
        return s;
    },
    /**
     * Refresh the tooltip's text and position.
     *
     * @function Highcharts.Tooltip#refresh
     *
     * @param {Highcharts.Point|Array<Highcharts.Point>} pointOrPoints
     *        Either a point or an array of points.
     *
     * @param {Highcharts.PointerEventObject} [mouseEvent]
     *        Mouse event, that is responsible for the refresh and should be
     *        used for the tooltip update.
     *
     * @return {void}
     */
    refresh: function (pointOrPoints, mouseEvent) {
        var tooltip = this, chart = this.chart, options = tooltip.options, x, y, point = pointOrPoints, anchor, textConfig = {}, text, pointConfig = [], formatter = options.formatter || tooltip.defaultFormatter, shared = tooltip.shared, currentSeries, styledMode = chart.styledMode;
        if (!options.enabled) {
            return;
        }
        H.clearTimeout(this.hideTimer);
        // get the reference point coordinates (pie charts use tooltipPos)
        tooltip.followPointer = splat(point)[0].series.tooltipOptions
            .followPointer;
        anchor = tooltip.getAnchor(point, mouseEvent);
        x = anchor[0];
        y = anchor[1];
        // shared tooltip, array is sent over
        if (shared &&
            !(point.series &&
                point.series.noSharedTooltip)) {
            chart.pointer.applyInactiveState(point);
            // Now set hover state for the choosen ones:
            point.forEach(function (item) {
                item.setState('hover');
                pointConfig.push(item.getLabelConfig());
            });
            textConfig = {
                x: point[0].category,
                y: point[0].y
            };
            textConfig.points = pointConfig;
            point = point[0];
            // single point tooltip
        }
        else {
            textConfig = point.getLabelConfig();
        }
        this.len = pointConfig.length; // #6128
        text = formatter.call(textConfig, tooltip);
        // register the current series
        currentSeries = point.series;
        this.distance = pick(currentSeries.tooltipOptions.distance, 16);
        // update the inner HTML
        if (text === false) {
            this.hide();
        }
        else {
            // update text
            if (tooltip.split) {
                this.renderSplit(text, splat(pointOrPoints));
            }
            else {
                var label = tooltip.getLabel();
                // Prevent the tooltip from flowing over the chart box (#6659)
                if (!options.style.width || styledMode) {
                    label.css({
                        width: this.chart.spacingBox.width
                    });
                }
                label.attr({
                    text: text && text.join ?
                        text.join('') :
                        text
                });
                // Set the stroke color of the box to reflect the point
                label.removeClass(/highcharts-color-[\d]+/g)
                    .addClass('highcharts-color-' +
                    pick(point.colorIndex, currentSeries.colorIndex));
                if (!styledMode) {
                    label.attr({
                        stroke: (options.borderColor ||
                            point.color ||
                            currentSeries.color ||
                            '#666666')
                    });
                }
                tooltip.updatePosition({
                    plotX: x,
                    plotY: y,
                    negative: point.negative,
                    ttBelow: point.ttBelow,
                    h: anchor[2] || 0
                });
            }
            // show it
            if (tooltip.isHidden && tooltip.label) {
                tooltip.label.attr({
                    opacity: 1
                }).show();
            }
            tooltip.isHidden = false;
        }
        H.fireEvent(this, 'refresh');
    },
    /**
     * Render the split tooltip. Loops over each point's text and adds
     * a label next to the point, then uses the distribute function to
     * find best non-overlapping positions.
     *
     * @private
     * @function Highcharts.Tooltip#renderSplit
     *
     * @param {string|Array<(boolean|string)>} labels
     *
     * @param {Array<Highcharts.Point>} points
     */
    renderSplit: function (labels, points) {
        var tooltip = this, boxes = [], chart = this.chart, ren = chart.renderer, rightAligned = true, options = this.options, headerHeight = 0, headerTop, tooltipLabel = this.getLabel(), distributionBoxTop = chart.plotTop;
        // Graceful degradation for legacy formatters
        if (isString(labels)) {
            labels = [false, labels];
        }
        // Create the individual labels for header and points, ignore footer
        labels.slice(0, points.length + 1).forEach(function (str, i) {
            if (str !== false && str !== '') {
                var point = points[i - 1] ||
                    {
                        // Item 0 is the header. Instead of this, we could also
                        // use the crosshair label
                        isHeader: true,
                        plotX: points[0].plotX,
                        plotY: chart.plotHeight
                    }, owner = point.series || tooltip, tt = owner.tt, series = point.series || {}, colorClass = 'highcharts-color-' + pick(point.colorIndex, series.colorIndex, 'none'), target, x, bBox, boxWidth, attribs;
                // Store the tooltip referance on the series
                if (!tt) {
                    attribs = {
                        padding: options.padding,
                        r: options.borderRadius
                    };
                    if (!chart.styledMode) {
                        attribs.fill = options.backgroundColor;
                        attribs['stroke-width'] = options.borderWidth;
                    }
                    owner.tt = tt = ren
                        .label(null, null, null, (point.isHeader ?
                        options.headerShape :
                        options.shape) || 'callout', null, null, options.useHTML)
                        .addClass(point.isHeader ?
                        'highcharts-tooltip-header ' : '' +
                        'highcharts-tooltip-box ' +
                        colorClass)
                        .attr(attribs)
                        .add(tooltipLabel);
                }
                tt.isActive = true;
                tt.attr({
                    text: str
                });
                if (!chart.styledMode) {
                    tt.css(options.style)
                        .shadow(options.shadow)
                        .attr({
                        stroke: (options.borderColor ||
                            point.color ||
                            series.color ||
                            '#333333')
                    });
                }
                // Get X position now, so we can move all to the other side in
                // case of overflow
                bBox = tt.getBBox();
                boxWidth = bBox.width + tt.strokeWidth();
                if (point.isHeader) {
                    headerHeight = bBox.height;
                    if (chart.xAxis[0].opposite) {
                        headerTop = true;
                        distributionBoxTop -= headerHeight;
                    }
                    x = Math.max(0, // No left overflow
                    Math.min(point.plotX +
                        chart.plotLeft -
                        boxWidth / 2,
                    // No right overflow (#5794)
                    chart.chartWidth +
                        (
                        // Scrollable plot area
                        chart.scrollablePixelsX ?
                            chart.scrollablePixelsX -
                                chart.marginRight :
                            0) -
                        boxWidth));
                }
                else {
                    x = point.plotX + chart.plotLeft -
                        pick(options.distance, 16) - boxWidth;
                }
                // If overflow left, we don't use this x in the next loop
                if (x < 0) {
                    rightAligned = false;
                }
                // Prepare for distribution
                if (point.isHeader) {
                    target = headerTop ?
                        -headerHeight :
                        chart.plotHeight + headerHeight;
                }
                else {
                    var yAxis = series.yAxis;
                    target = yAxis.pos - distributionBoxTop + Math.max(0, Math.min((point.plotY || 0), yAxis.len)); // Limit target position to within yAxis
                }
                boxes.push({
                    target: target,
                    rank: point.isHeader ? 1 : 0,
                    size: owner.tt.getBBox().height + 1,
                    point: point,
                    x: x,
                    tt: tt
                });
            }
        });
        // Clean previous run (for missing points)
        this.cleanSplit();
        if (options.positioner) {
            boxes.forEach(function (box) {
                var boxPosition = options.positioner.call(tooltip, box.tt.getBBox().width, box.size, box.point);
                box.x = boxPosition.x;
                box.align = 0; // 0-align to the top, 1-align to the bottom
                box.target = boxPosition.y;
                box.rank = pick(boxPosition.rank, box.rank);
            });
        }
        // Distribute and put in place
        H.distribute(boxes, chart.plotHeight + headerHeight);
        boxes.forEach(function (box) {
            var point = box.point, series = point.series, yAxis = series && series.yAxis;
            // Put the label in place
            box.tt.attr({
                visibility: box.pos === undefined ? 'hidden' : 'inherit',
                x: (rightAligned || point.isHeader || options.positioner ?
                    box.x :
                    point.plotX + chart.plotLeft + tooltip.distance),
                y: box.pos + distributionBoxTop,
                anchorX: point.isHeader ?
                    point.plotX + chart.plotLeft :
                    point.plotX + series.xAxis.pos,
                anchorY: point.isHeader ?
                    chart.plotTop + chart.plotHeight / 2 :
                    yAxis.pos + Math.max(0, Math.min(point.plotY, yAxis.len))
            });
        });
        /* If we have a seperate tooltip container, then update the necessary
         * container properties.
         * Test that tooltip has its own container and renderer before executing
         * the operation.
         */
        var container = tooltip.container, outside = tooltip.outside, renderer = tooltip.renderer;
        if (outside && container && renderer) {
            // Position the tooltip container to the chart container
            var chartPosition = chart.pointer.getChartPosition();
            container.style.left = chartPosition.left + 'px';
            container.style.top = chartPosition.top + 'px';
            // Set container size to fit the tooltip
            var _a = tooltipLabel.getBBox(), width = _a.width, height = _a.height, x = _a.x, y = _a.y;
            renderer.setSize(width + x, height + y, false);
        }
    },
    /**
     * Find the new position and perform the move
     *
     * @private
     * @function Highcharts.Tooltip#updatePosition
     *
     * @param {Highcharts.Point} point
     */
    updatePosition: function (point) {
        var chart = this.chart, pointer = chart.pointer, label = this.getLabel(), pos, anchorX = point.plotX + chart.plotLeft, anchorY = point.plotY + chart.plotTop, pad;
        // Needed for outside: true (#11688)
        var chartPosition = pointer.getChartPosition();
        pos = (this.options.positioner || this.getPosition).call(this, label.width, label.height, point);
        // Set the renderer size dynamically to prevent document size to change
        if (this.outside) {
            pad = (this.options.borderWidth || 0) + 2 * this.distance;
            this.renderer.setSize(label.width + pad, label.height + pad, false);
            // Anchor and tooltip container need scaling if chart container has
            // scale transform/css zoom. #11329.
            var containerScaling = chart.containerScaling;
            if (containerScaling) {
                H.css(this.container, {
                    transform: "scale(" + containerScaling.scaleX + ", " + containerScaling.scaleY + ")"
                });
                anchorX *= containerScaling.scaleX;
                anchorY *= containerScaling.scaleY;
            }
            anchorX += chartPosition.left - pos.x;
            anchorY += chartPosition.top - pos.y;
        }
        // do the move
        this.move(Math.round(pos.x), Math.round(pos.y || 0), // can be undefined (#3977)
        anchorX, anchorY);
    },
    /**
     * Get the optimal date format for a point, based on a range.
     *
     * @private
     * @function Highcharts.Tooltip#getDateFormat
     *
     * @param {number} range
     *        The time range
     *
     * @param {number} date
     *        The date of the point in question
     *
     * @param {number} startOfWeek
     *        An integer representing the first day of the week, where 0 is
     *        Sunday.
     *
     * @param {Highcharts.Dictionary<string>} dateTimeLabelFormats
     *        A map of time units to formats.
     *
     * @return {string}
     *         The optimal date format for a point.
     */
    getDateFormat: function (range, date, startOfWeek, dateTimeLabelFormats) {
        var time = this.chart.time, dateStr = time.dateFormat('%m-%d %H:%M:%S.%L', date), format, n, blank = '01-01 00:00:00.000', strpos = {
            millisecond: 15,
            second: 12,
            minute: 9,
            hour: 6,
            day: 3
        }, lastN = 'millisecond'; // for sub-millisecond data, #4223
        for (n in timeUnits) { // eslint-disable-line guard-for-in
            // If the range is exactly one week and we're looking at a
            // Sunday/Monday, go for the week format
            if (range === timeUnits.week &&
                +time.dateFormat('%w', date) === startOfWeek &&
                dateStr.substr(6) === blank.substr(6)) {
                n = 'week';
                break;
            }
            // The first format that is too great for the range
            if (timeUnits[n] > range) {
                n = lastN;
                break;
            }
            // If the point is placed every day at 23:59, we need to show
            // the minutes as well. #2637.
            if (strpos[n] &&
                dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {
                break;
            }
            // Weeks are outside the hierarchy, only apply them on
            // Mondays/Sundays like in the first condition
            if (n !== 'week') {
                lastN = n;
            }
        }
        if (n) {
            format = time.resolveDTLFormat(dateTimeLabelFormats[n]).main;
        }
        return format;
    },
    /**
     * Get the best X date format based on the closest point range on the axis.
     *
     * @private
     * @function Highcharts.Tooltip#getXDateFormat
     *
     * @param {Highcharts.Point} point
     *
     * @param {Highcharts.TooltipOptions} options
     *
     * @param {Highcharts.Axis} xAxis
     *
     * @return {string}
     */
    getXDateFormat: function (point, options, xAxis) {
        var xDateFormat, dateTimeLabelFormats = options.dateTimeLabelFormats, closestPointRange = xAxis && xAxis.closestPointRange;
        if (closestPointRange) {
            xDateFormat = this.getDateFormat(closestPointRange, point.x, xAxis.options.startOfWeek, dateTimeLabelFormats);
        }
        else {
            xDateFormat = dateTimeLabelFormats.day;
        }
        return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581
    },
    /**
     * Format the footer/header of the tooltip
     * #3397: abstraction to enable formatting of footer and header
     *
     * @private
     * @function Highcharts.Tooltip#tooltipFooterHeaderFormatter
     * @param {Highcharts.PointLabelObject} labelConfig
     * @param {boolean} [isFooter]
     * @return {string}
     */
    tooltipFooterHeaderFormatter: function (labelConfig, isFooter) {
        var footOrHead = isFooter ? 'footer' : 'header', series = labelConfig.series, tooltipOptions = series.tooltipOptions, xDateFormat = tooltipOptions.xDateFormat, xAxis = series.xAxis, isDateTime = (xAxis &&
            xAxis.options.type === 'datetime' &&
            isNumber(labelConfig.key)), formatString = tooltipOptions[footOrHead + 'Format'], evt = {
            isFooter: isFooter,
            labelConfig: labelConfig
        };
        H.fireEvent(this, 'headerFormatter', evt, function (e) {
            // Guess the best date format based on the closest point distance
            // (#568, #3418)
            if (isDateTime && !xDateFormat) {
                xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);
            }
            // Insert the footer date format if any
            if (isDateTime && xDateFormat) {
                ((labelConfig.point && labelConfig.point.tooltipDateKeys) ||
                    ['key']).forEach(function (key) {
                    formatString = formatString.replace('{point.' + key + '}', '{point.' + key + ':' + xDateFormat + '}');
                });
            }
            // Replace default header style with class name
            if (series.chart.styledMode) {
                formatString = this.styledModeFormat(formatString);
            }
            e.text = format(formatString, {
                point: labelConfig,
                series: series
            }, this.chart.time);
        });
        return evt.text;
    },
    /**
     * Build the body (lines) of the tooltip by iterating over the items and
     * returning one entry for each item, abstracting this functionality allows
     * to easily overwrite and extend it.
     *
     * @private
     * @function Highcharts.Tooltip#bodyFormatter
     * @param {Array<(Highcharts.Point|Highcharts.Series)>} items
     * @return {Array<string>}
     */
    bodyFormatter: function (items) {
        return items.map(function (item) {
            var tooltipOptions = item.series.tooltipOptions;
            return (tooltipOptions[(item.point.formatPrefix || 'point') + 'Formatter'] ||
                item.point.tooltipFormatter).call(item.point, tooltipOptions[(item.point.formatPrefix || 'point') + 'Format'] || '');
        });
    },
    styledModeFormat: function (formatString) {
        return formatString
            .replace('style="font-size: 10px"', 'class="highcharts-header"')
            .replace(/style="color:{(point|series)\.color}"/g, 'class="highcharts-color-{$1.colorIndex}"');
    }
};


text:
16-night Panama Canal Collage - World Voyage Segment Request Quote
Miami Jan 9th, 2021 06:00PM
Key West Jan 10th, 2021 07:00AM Jan 10th, 2021 03:00PM
Cartagena (Colombia) Jan 13th, 2021 08:00AM Jan 13th, 2021 02:00PM
Panama Canal Jan 14th, 2021 Jan 14th, 2021
Puntarenas Jan 16th, 2021 07:00AM Jan 16th, 2021 04:00PM
Puerto Corinto Jan 17th, 2021 10:00AM Jan 17th, 2021 06:00PM
Puerto Quetzal Jan 18th, 2021 09:00AM Jan 18th, 2021 07:00PM
Acapulco Jan 20th, 2021 08:00AM Jan 20th, 2021 05:00PM
At Sea Jan 21st, 2021 Jan 21st, 2021
Cabo San Lucas Jan 22nd, 2021 08:00AM Jan 22nd, 2021 05:00PM
At Sea Jan 23rd, 2021 Jan 23rd, 2021
Ensenada Jan 24th, 2021 09:00AM Jan 24th, 2021 06:00PM
Los Angeles Jan 25th, 2021 08:00AM

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: I have problem with last for loop. It shows me just last student in array, but it should be all 5 I have a problem with for loop. how can I solve it?
Here 3 arrays which I need to put in for loop and print by class:
name = ["Scott", "Liz", "Sarah", "Mark", "Dan"]
address = ["21, old kent road", "13,Trafalgar Square", "45,KingsCross Road", "33,Russel square",
           "56,Lewisham Road"]
telephone = ["02075642222", "02078642123", "02084641111", "02085553234", "02076662123"]
students = []

here I loop and launch my class that print all students:
for i in range(len(name),len(address),len(telephone)):
    stud1 = Studentdetails(name[i], address[i], telephone[I])

I have problem with last for loop. It shows me just last student in array, but it should be all 5.

A: Generally avoid using range(len) you almost always don't need it. Python for works like for each.
If your studentdetails takes the three arguments you can use zip to loop over multiple items and unpack it with *:
for student in zip(name, address, telephone):
    students.append(studentdetails(*student))

This is equivalent to:
for studentname, studentaddress, studenttel in zip(name, address, telephone):
    students.append(studentdetails(studentname, studentaddress, studenttel))

If you are going to be doing this for a larger set of data the fastest way to fill the students list with the results of studentdetails() would be to add a short generator which unpacks the zip and yields the studentdetails() for each set of details:
def createstudents(iter):
    for item in iter:
        yield studentdetails(*item)

students = list(createstudents(zip(name, address, telephone)))

This then reads like the sentence: "students is the list of createstudents for each group of name, address, telephone)"
and createstudents is "for each item in the iterator: yield me the studentdetails object"
For great insights in the pythonic way of doing this sort of thing check out the first 10 minutes of: https://www.youtube.com/watch?v=OSGv2VnC0go

A: All your lists are length 5 (and I assume they will always be the same length), so there's no need to factor in all their different lengths. You just need the length of one of them in order to loop. The way you have it currently, you're doing range(5, 5, 5), which is empty, because of the behavior of range given those arguments. Like I said in my comment, the first number is the starting number, the second number is the ending number, and the third number is the "step". For more info see: https://docs.python.org/3/library/functions.html#func-range
So, your code should work fine if you do:
for i in range(len(name)):
    stud1 = Studentdetails(name[i], address[i], telephone[i])

There are more ways to make this more "Pythonic" but you can feel free to ignore everything below if it's too confusing:
You can use the zip function to iterate through all 3 lists at once, with each item in the zip being a tuple of the 3 list items for that index. So, this would work just as well:
for n, a, t in zip(name, address, telephone):
    stud1 = Studentdetails(n, a, t)

You could also use the asterisk operator to automatically expand the tuple into a list of arguments to pass to Studentdetails:
for s in zip(name, address, telephone):
    stud1 = Studentdetails(*s)

A: I suspect that Studentdetails is a class so I'll emulate it here and show how a list of students could be constructed:
class Studentdetails:
    def __init__(self, name, address, telephone):
        self.name = name
        self.address = address
        self.telephone = telephone
    def __repr__(self):
        return f'Name={self.name}, Address={self.address}, Telephone={self.telephone}'

name = ["Scott", "Liz", "Sarah", "Mark", "Dan"]
address = ["21, old kent road", "13,Trafalgar Square", "45,KingsCross Road", "33,Russel square",
           "56,Lewisham Road"]
telephone = ["02075642222", "02078642123", "02084641111", "02085553234", "02076662123"]
students = []

assert len(name) == len(address) and len(address) == len(telephone)

for name_, address_, telephone_ in zip(name, address, telephone):
    students.append(Studentdetails(name_, address_, telephone_))

for student in students:
    print(student)

Output:
Name=Scott, Address=21, old kent road, Telephone=02075642222
Name=Liz, Address=13,Trafalgar Square, Telephone=02078642123
Name=Sarah, Address=45,KingsCross Road, Telephone=02084641111
Name=Mark, Address=33,Russel square, Telephone=02085553234
Name=Dan, Address=56,Lewisham Road, Telephone=02076662123

A: class Studentdetails:
    def __init__(self, name, address, telephone, address2="London"):
        self.name = name
        self.address = address
        self.telephone = telephone
        self.city = address2

    def __repr__(self):
        return f'Name={self.name}, Address={self.address}, City={self.city}, Telephone={self.telephone}'

class Totalmarks():
    def __init__(self, total=0.0, average=0.0):
        self.totmarks = total
        self.average = average

    def total(self, total):
        self.markslist = total
        for i in range(5):
            self.totmarks = self.totmarks + self.markslist[i]
        return self.totmarks

    def Aver(self):
        self.average = self.totmarks / 5
        return self.average

class Teachercomments():
    def comments(self, average):
        self.average = average
        if self.average <= 30:
            print("Teacher Comments: ", "\n", "Needs to work hard and attend extra sessions to progress.")
        elif self.average >= 31 and self.average <= 50:
            print("Teacher Comments: ", "\n", "Needs to improve the quality of work produced to make a progression")
        elif self.average >= 51 and self.average <= 70:
            print("Teacher Comments: ", "\n",
                  "Making good progress but need to focus on certain topics to achieve high marks")
        elif self.average >= 71 and self.average <= 80:
            print("Teacher Comments: ", "\n", "Needs to be carefully")
        else:
            print("Teacher Comments: ", "\n", "Well done for making an excellent progress.")

def report():
    s = "*" * 65
    studtotal = Totalmarks()
    print(s, "\n", " " * 20, "Student Report", "\n", s)
    marks = []
    for i in range(5):
        smarks = int(input("please enter your mark"))
        marks.append(smarks)
    print(marks)
    sumtot = studtotal.total(marks)
    av = studtotal.Aver()
    print("Total marks:", sumtot)
    print("Average:", av)
    tcom = Teachercomments()
    tcom.comments(av)
report()

name = ["Scott", "Liz", "Sarah", "Mark", "Dan"]
address = ["21, old kent road", "13,Trafalgar Square", "45,KingsCross Road", "33,Russel square",
           "56,Lewisham Road"]
telephone = ["02075642222", "02078642123", "02084641111", "02085553234", "02076662123"]
students = []

assert len(name) == len(address) and len(address) == len(telephone)

for name_, address_, telephone_ in zip(name, address, telephone):
    students.append(Studentdetails(name_, address_, telephone_))

for student in students:
    print(student)

Output
*****************************************************************
                      Student Report
 *****************************************************************
please enter your mark1
please enter your mark2
please enter your mark3
please enter your mark4
please enter your mark45
[1, 2, 3, 4, 45]
Total marks: 55.0
Average: 11.0
Teacher Comments:
 Needs to work hard and attend extra sessions to progress.
Name=Scott, Address=21, old kent road, City=London, Telephone=02075642222
Name=Liz, Address=13,Trafalgar Square, City=London, Telephone=02078642123
Name=Sarah, Address=45,KingsCross Road, City=London, Telephone=02084641111
Name=Mark, Address=33,Russel square, City=London, Telephone=02085553234
Name=Dan, Address=56,Lewisham Road, City=London, Telephone=02076662123

redpajama_set_name: RedPajamaStackExchange


At Innovation Wealth we manage your growth with the care you deserve.
To give you an edge in this increasingly confusing world of finance, Innovation Wealth has the expertise to uncover truly differentiating insights that drive strategically sound financial recommendations.
Our experienced financial advisors and staff bring years of industry expertise, strategic thinking, analytical insight and innovation to create tangible value for you, our valued client.
We take the time to gain an understanding of your current and future needs and develop personalised strategies to help achieve your dreams of tomorrow – while protecting the assets against those eventualities that could otherwise jeopardize your goals.
Change is part of life and business, we expect it, accept it and adapt to it! Mistakes are inevitable; we must immediately, eagerly and diligently correct our own and graciously understand those made by others.
In truth, it's more than expertise – we do what we do because our people have a genuine passion for making a difference, taking the time to understand you and your specific circumstances, dreams and aspirations, and seeing the world from a fresh perspective.
It is the pursuit of these details that allows us to deliver illuminating insights into our clients' financial future.


text:
MILLBURN SHORT HILLS
Brazilian jazz musician to perform at Millburn library
Danielle DeSisto
The Item of Millburn and Short Hills
After attending an event in the township during her childhood, former resident Sue Maskaleris was inspired to pursue a career in a genre of music that may be unfamiliar.
Photo courtesy of Madeleine Ball
Musician and former township resident Sue Maskaleris will perform original Brazilian jazz along with other musical selections at the library on Sunday, March 6.
Maskaleris will perform for the third time at the Millburn Free Public Library on Sunday, March 6. While she was in junior high, she saw Brazilian musician Sergio Mendes with his group, Sergio Mendes and Brasil '66, at a teen arts festival in the township, and the performance inspired her to try her hand at playing Brazilian jazz music.
"I noticed the singers had voices that were similar to my own, and I was swept up in the harmonies," Maskaleris told The Item.
Two CDs and countless performances later, Maskaleris continues to write and perform original music. Her first album, "Unbreakable Heart," featured notable guest musicians, including Lenny White and Eddie Gomez. Her second CD, "Bring Nothing but Your Heart," debuted third on the NPR Jazz charts.
She first appeared at the library in 1977 with two other Millburn High School alumni, and once more in 2014 accompanied by bassist Mike Richmond and her father, Stephen Maskaleris, on upright bass. She returns to the library to present "From Rags to Samba" on Sunday, March 6, at 3 p.m. in the auditorium. The event is free.
The show will feature ragtime tunes and a similar Brazilian style called "chorinho," as well as samba and bossa nova selections. Maskaleris will be accompanied by Rio-born string bassist and guitarist, Itaiguara.
Maskaleris grew up in the township and directed, arranged, and wrote music for the high school girl's singing group, the Millburnettes, for two years. The musician also holds piano and vocal lessons in the township.
The library is located at 200 Glen Ave.
Email: desisto@northjersey.com


text:
Home News Australia's Great Air Race Coin Collection
Australia's Great Air Race Coin Collection
05 Sep 2019 Thu
On 3rd September, the Royal Australian Mint released a collection of 8 coins to commemorate the 100th anniversary of the Great Air Race from England to Australia. The coins were launched at Sir Ross and Sir Keith Smith Memorial Hangar of the 1919 race's winning plane in Adelaide Airport. The restored winning plane named Vickers Vimy was also showcased at the event.
The 1919 Air Race from England to Australia was the first flight across the world by the Vickers Vimy crew. The Australian Government had declared a prize-money of £10,000 for the first Australians who would fly from England to Australia within 30 days in 1919. The challenge was accepted by 6 Australian crews and two Frenchmen. The planes with open cockpits were constructed using timber and fabric. The pilots used a compass for navigation and there were no airfields in the route. Just one plane completed the journey within 30 days. The winning Vickers Vimy team was led by Sir Ross Smith.
Aeroplanes named Sopwith Wallaby, Vickers Vimy, Alliance P.2, Blackburn Kangaroo, Martinsyde A1, Airco DH9, Caudron G.4 are featured on seven coins and one coin is dedicated to the Great Air Race. The $1 Uncirculated legal tender coins have a mintage limit of 10,000 pieces and can be purchased for $130.00 AUD.
Image Courtesy: The Royal Australian Mint


Alfredo's Mediterranean Grille and Steakhouse offers a world of cuisine, all on the same menu.
There is perhaps no decision more difficult than choosing where to eat. It's bad enough when you're alone—add in a spouse or some kids, and the negotiations could drag on for hours.
Alfredo's Mediterranean Grille and Steakhouse in Charles Town makes that decision easy. At this United Nations of nosh, you'll find dishes from France, Greece, Iran, Italy, Lebanon, Morocco, and Spain, all under one roof.
The cosmopolitan cuisine is a product of owner and chef Alfredo Amaya's upbringing. He was born in Honduras to a Palestinian father and an El Salvadoran mother. The family came to the United States to escape political unrest and Amaya lived for a time with a Persian family, adding the flavors of that home to his expanding culinary palette.
He moved to Jefferson County about a decade ago and ran a small grocery store before opening Alfredo's Mediterranean Grille & Steakhouse in a small space downtown, where it remained for nine years. In 2017, Amaya moved the operation to a space near the Hollywood Casino at Charles Town Races. He made the move overnight with little fanfare, yet customers found him. "They were all there waiting for us," Amaya says, with a bit of wonder.
The new location features a much larger kitchen and seating for 99 people, even if the modern stucco exterior seems incongruous with the food served inside. Every order gets a complimentary appetizer of pita slices, housemade hummus, and shirazi salad. The menu's main focus is Persian, with a variety of tender kabobs cooked on long metal skewers over an open fire.
Morocco and Lebanon are represented by couscous and falafel. Francophiles will enjoy dishes like Coquilles St. Jacques, sea scallops in herb sauce over pasta, and Crevettes a L'aneth, shrimp in a dill sauce over rice or pasta.
Alfredo's Italian offerings include classic dishes like fettuccine alfredo, chicken parmigiana, and veal marsala while the Spanish section of the menu includes Arroz con Camarones, saffron rice and shrimp, and Pollo a la Castellana, a sauteed chicken breast with roasted red pepper, capers, and artichokes in a lemon butter sauce over pasta or rice.
If you just can't choose, ask for one of the family platters. This option isn't on the menu but is available in a variety of sizes, from two people on up. The meat platter features steak, chicken, and lamb kabobs, but there's also a seafood platter with shrimp and salmon and a vegetarian platter. Each comes with smoky Mediterranean pasta plus hummus, basmati rice with saffron, and a Greek salad.
For dessert, don't miss Alfredo's baklava, not overly sweet but crammed with walnuts and phyllo dough made special in Baltimore. It's served with sweet tea in equally sweet little glass cups.
Alfredo's opens at 11 a.m. each day, closing at 8 p.m. on Sundays and 10 p.m. the rest of the week. There is live entertainment most nights, including belly dancing by Jensuya from Berkeley Springs.


text:
Intel Launches Atom Z3000 Processor Family
All Tech News > category news Mobility
Max Smolaks, September 12, 2013, 6:41 pm
MobilityWorkspace
The new silicon was developed around the requirements of an average tablet user
Intel has launched the long-awaited redesign of its Atom processors, formerly codenamed 'Bay Trail". The new family of Z3000 Systems-on-a-Chip (SoCs) is built on the 22nm process and was designed with tablets in mind.
Intel's first mobile multi-core SoC doubles the compute and triples the graphics performance of the previous generation Atom processors. The improved power efficiency promises all-day battery life for mobile devices, even if customers run fully-featured Windows 8. For this reason, Z3000 is expected to compete with low-power chips designed by ARM, which are found in the majority of tablets on the market today.
Acer, ASUS, Dell, Lenovo and Toshiba have all announced upcoming products based on the new SoCs, due to be shipped in time for Christmas at prices starting as low as $199.
Intel will also sell other Bay Trail variants – Pentium Bay Trail-M and Celeron Bay Trail-D, for use in entry-level desktops, laptops, two-in-ones and all-in-ones.
Intel goes to war
Unlike popular processors from ARM, the Z3000 SoCs can run either Windows 8 or Android. According to Chris Walker, director of Business Development at Intel, the new silicon combines the strengths of both Atom and Core processor families.
The Z3000 is based on low-power, high-performance Silvermont microarchitecture and optimised for single-thread performance. It features Intel's tri-gate transistor technology, also found in more serious Ivy Bridge and Haswell chips.
New SoCs are available in variants clocked up to 2.4GHz and featuring up to 2MB L2 cache, with a pair of cores each sharing 1MB in a quad-core configuration. The platform supports up to 4GB of dual-channel DDR3 RAM, and offers full USB 3.0 compatibility.
On the imaging side, Z3000 supports recording full HD video at 60 FPS, with up to 13 megapixel back camera sensors and up to 2 megapixel front camera sensors. Intel says tablets based on the new SoC offer around 10 hours of active battery life and three weeks of standby. This is achieved thanks to dynamic power management, with the system able to switch parts of itself off depending on usage scenarios.
The Z3000 is the first Atom to integrate Intel HD graphics with full DirectX and OpenGL support. It also enables OEMs to use advanced screens with resolutions up to 2500×1600.
Even though the new Bay Trail chips were designed primarily for tablets, they will also appear in two-in-one devices, all-in-ones and laptops with a form factor between seven and eleven inches.
Intel has promised to introduce 64-bit support for tablets in early 2014.
What do you know about Intel? Take our quiz!
IBM Researchers Store Data At Atomic Level On The World's Smallest Magnet
Intel Shuns Cloud As The Only Route To IoT, Instead Champions 5G And New Atom E3900
Intel Admits Defeat In Smartphone Market
Author: Max Smolaks
Max 'Beast from the East' Smolaks covers open source, public sector, startups and technology of the future at TechWeekEurope. If you find him looking lost on the streets of London, feed him coffee and sugar.


I met Hayley and Louise in the corridors of campus. I took interest with them as they were carrying a clothes rack that I was curious about. We got talking and as they were telling me about their new show I offered to photograph it so they could have some promotional materials for it. They seemed happy with the idea and we had arranged to have me come in to their dress run and photograph that so it won't disturb the viewing of the show.
I was a bit nervous as I had never "officially" photographed a performance. I had photographed music shows as a member of the audience in the past, however never as close as I was there, standing with them on stage.
I wasn't too sure how the lighting conditions will be so I had prepared myself and set my camera on auto ISO so I could have full control on the other variables.
The experience itself was very positive. Hayley and Louise were absolutely lovely and made me feel like a part of their team, consulting me on issues and inviting me to take part. I feel that as they had made me as comfortable as they had, as well as how engaging they were while they were performing, made the images very good, much better than I expected.
I had played around with different compositions to the images, tried different angles, from closer and further away, and got a good idea on how to proceed in situations that I am not used to.
I feel that out of anything from this experience I got good contacts for the future, and I would love to work with Haylo Theatre again.
Last night I had the pleasure to watch the show Sisters, Seagulls and Send offs by Haylo Theatre at Storyhouse in Chester.
The show portrays the process of dealing with grief of two sisters who recently lost their dad. The show, written and performed by Hayley and Louise took you through stories of the sisters' dad, the happy moments with him, and the moments after his death.
It takes you through a whirlwind of emotions, from funny moments that have you laughing non stop, to the sad moments that bring you to tears. This showed, in my eyes, the process of grief. Grief doesn't end a few hours, days, or even years after the effect. As the show stated many times, grief is a wave.
Life goes on, as it should, however it is in those happy moments that you remember something is missing, and it brings you back to the harsh reality that they are gone.
The show is a heartfelt, moving, and incredibly raw human story, a story that most, if not all people have gone through. This show gave it an uplifting twist, a performance that shows you the happy of the day after, alongside with the sad.
Sisters, Seagulls and Send offs is a show that must be seen to experience, and I highly recommend it.
Today I met up with several people regarding potential projects.
The first meeting was with Emma from Black Mango, an event's management company in Chester. I was introduced to this company by my friend Fiona who had her placement with them last year.
Black Mango are organising an art's fair in Chester in November and they needed a few people to photograph the event. The meeting today was pretty successful, Emma went over the event's schedule, floor plan and what is expected from us for the event.
The second meeting was with the cafe Beatons who I contacted a few weeks ago. We explained to Elaine, the manager of the cafe, our two projects: the first one was with the international office, who wanted us to photograph students having afternoon tea as the brief of the project was to show Chester as a "true British experience".
The second project was one that Fiona and I wanted to produce as a more publicity project for Beatons, creating some photos of the cafe for them: the staff, the food, and possibly use them for a banner or a poster for the place.
Elaine seemed very enthusiastic about our ideas and was happy to help out. We agreed that we will start work on these projects the week after development week.
On the 24th of October I had visited the Whitworth gallery in Manchester.
One of the exhibitions held that day was Ashes by Steve McQueen.
The installation projected two videos onto two sides of a screen, one side showed a video was shot by him in 2003, the young Ashes is standing on a boat. The sound used in the video is a combination of the speech and ambient sound from the other side video, with soft noises of waves at sea.
The other video was shot in 2015, after McQueen returned to the island to find out Ashes had been murdered by drug dealers. The second video shows the making of Ashe's tomb.
I felt the way that the video was presented added a lot to the atmosphere of the piece. It added context to it and made me feel connected to the story.
When I first came in I only saw the one side and I didn't really understand what it was that I was watching and didn't have much of a connection to the story. I later went to the other side and watched the video showing Ashes when he was young. When I returned to the first video they had just finished making the tombstone where it said Ashes was only 25 years old when he passed. At that moment it all clicked and I had understood the impact of that story, as I felt like I now knew who Ashes was.
The way that the video was broadcasted, on the two sided screen, to me symbolised the balance of life and death. The physical move that you had to make while watching the film represented to me the moment when life stops, and the actual cross over to death.
The fact that the one making the tomb knew Ashes, and was speaking about him, showed the people who were left behind.
When exiting the room there were posters free to take with a photo of ashes and the text which quoted the words of Ashes' friend which were played throughout the film. This to me was an invitation to take a part of Ashes' life and story with is, it was an act of memory.
Overall I felt that this was a very powerful and moving piece of work. It left me with many thoughts and contemplations, and one I am happy I got to experience.
Ashes is exhibited in the Whitworth gallery from 22nd of September 2017 until March of 2018.
Read more on this exhibition and others at the Whitworth Art Gallery onilne.
It's 3 weeks in and so far I have contacted many people and organisations. I've messaged 3 animal shelters around the area but with no luck.
The first project was introduced to me by Fiona, it's with the company that she had a work placement with last year and they would like us to photograph an event in town. We have a work meeting with them next week regarding the subject.
The second project in a way came to me, I received an email from the university's international centre offering me a project to create some promotional photographs of Chester to be used in a start of year presentation for the office. I was very excited for this opportunity as if all goes well, this could lead to more projects I could create for the international office's promotion team in the future.
I had a meeting with the people behind this project, Ela who's the one giving the presentation, i.e the client, and Alex, she is a volunteer in the office and the president of the international society, who I will be collaborating on this project with.
The idea for the shoot is showing how "British" Chester is and basically promoting it as a "true British experience". Photo ideas that were suggested in the meeting were the likes of photographing students having afternoon tea, a photo of a red phone booth, photographing the architecture of the the city etc.
In the meantime, I had a response from the cafe I emailed a few weeks ago for a project I wanted to create with Fiona, they have responded saying that they would be happy to have us do a project with the cafe, this links now perfectly to the project I am creating for the international office as we did say we needed a place to have afternoon tea in to photograph.
The next few weeks will probably consists of meetings with the relevant people for each project in preparation for the shoots.
Third year of university has began. This is the year where we're expected to start finding our own paths. The assignments are much more broad, a lot more freedom is given to us to find our own way into the world, as people and as practitioners.
One of our modules this year focuses on finding projects and clients to work with, trying to make our mark and create connections, a task that sounds daunting yet exhilarating at the same time.
As a photographer, my aim is to become a fashion photographer and work in the fashion and editorial industry. Whilst this is my goal I do want to try and branch out and take this year as a chance to explore different areas that I feel I did have a chance to in the past two.
I'm hoping to take part in at least one project this year if not more. So far projects I had thought would be of some interest to me were working in promoting, shadowing and assisting a photographer, and work with fashion designers on their photography.
For promoting my good friend Fiona and I have considered contacting a cafe in town we both like and collaborating on a promoting project for them. Fiona and I have collaborated in the past in our second year on an exhibition project and I would love to have the opportunity to work with her again. I was also considering contacting an animal shelter and photograph the animals that are up for adoption.
I have already turned to a professional photographer I know and asked if he has any projects lined up that I could assist him with and we agreed to reconvene when a project comes up.
Lastly I would contact the fashion department in the university and offer my services as a photographer to the fashion design students. At the end of last year I had photographed their final year runway show and enjoyed the experience and felt that it added a lot of value to my growing portfolio. I would like to get the chance to do so again this year.
This year it is also very important for me to increase my online presence. I already have a professional Facebook page to which I upload my photographs, however after speaking to several people who are closer to the fashion scene it has been recommended to me that an Instagram page is the way to go.
I opened up a new account and would make sure to maintain it during the following year and onwards as an online portfolio of my work.
My plan of action for the next few weeks is to contact as many people as I can in order to be able to start work as soon as possible.


Tanner De Witt Insolvency and Restructuring Partner Robin Darton was this year elected President and Chair of the Hong Kong chapter of Turnaround Management Association (TMA). TMA is a non-profit global organisation founded in 1987. The organisation is made up of over 9,000 individuals in 54 chapters specialising in turnaround management and corporate renewal. You can access the Hong Kong TMA Chapter website here.
The Hong Kong TMA chapter has around 60 members and we will hold regular events this year focussing on relevant topics surrounding turnaround, restructuring and change. Last year Robin chaired the opening session at Hong Kong's 2015 TMA Symposium. Click here for more information.
Please contact Robin Darton directly for queries or email Marketing and Business Development Manager Lizzie Fraser for event and sponsorship opportunities at lizziefraser@tannerdewitt.com.


Get the hoodie that helps save lives.
Stay cozy, make a statement and save lives with the Best Friends Save Them All pullover hoodie. Best Friends logo on the front with Save Them All message on the back. Pullover styling with front pocket.
From Dawn of Forked River, New Jersey on 2/6/2019 .
I love this hoodie!! Very soft and true to size. Love that others might see your message and ask questions, so I can spread the word and help Save Them All!!
From Bettye Atkins of GOODLETTSVLLE, Tennessee on 1/31/2019 .
Seriously, my favorite now. So soft, great quality and the best message on the back. Most comfortable way to spread awareness!
From Anonymous of Denver, Colorado on 1/25/2019 .
This sweatshirt is really soft and cozy. Did not shrink and fits true to size. A little thinner than I expected, but still really warm. Great way to support and be warm.
From Jill G. of South Lake Tahoe, California on 11/26/2018 .
This hoody is now my favorite. Very soft and shows my support for Best Friends! Love it!
From Anonymous of Chicago, Illinois on 6/6/2018 .


text:
16 Wishes (bra: 16 Desejos) é um filme de televisão de fantasia e comédia adolescente de 2010, dirigido por Peter DeLuise e escrito por Annie DeYoung, estrelado por Debby Ryan e Jean-Luc Bilodeau. Ele estreou em 25 de junho de 2010 no Disney Channel nos Estados Unidos com 5,6 milhões de telespectadores e em 16 de julho de 2010 no Family Channel, no Canadá. Estrou no Brasil em 17 de outubro de 2010. O filme foi o programa a cabo mais assistido no dia de sua estreia no Disney Channel. Além disso, 16 Wishes apresentou Ryan a novos públicos, como o público adulto contemporâneo, uma vez que o filme recebeu alta audiência no grupo demográfico adulto (18–34). O filme foi o segundo programa mais assistido na TV a cabo na semana de sua estreia.

Foi o segundo filme a ser lançado no Disney Channel em 2010 que não foi promovido como um "Disney Channel Original Movie" (depois de Harriet the Spy: Blog Wars) e é uma coprodução entre Disney Channel, Family Channel, Unity Pictures of Vancouver e MarVista Entertainment em Los Angeles.

Sinopse
Os desejos de uma adolescente, Abby, magicamente, transformam-se em realidade quando ela completa 16 anos.

Produção
Algumas cenas foram filmadas na Walnut Grove Secondary School em Langley, Colúmbia Britânica.

Elenco

Filmes originais do Disney Channel
Telefilmes dos Estados Unidos de 2010
Telefilmes do Canadá de 2010
Filmes de drama da década de 2010
Telefilmes de fantasia dos Estados Unidos
Telefilmes de drama dos Estados Unidos
Telefilmes de fantasia do Canadá
Telefilmes de drama do Canadá
Filmes que se passam num dia
Filmes em língua inglesa da década de 2010

redpajama_set_name: RedPajamaWikipedia


text:
Feedback:Developer updates/20220414
< Feedback:Developer updates
Guild Wars Asian Regional Datacenter Returns[edit]
By Stephen Clarke-Willson, Game Director, Guild Wars
Hello fellow Tyrians!
When Guild Wars launched in 2005 it was a true worldwide game. ArenaNet managed servers in North America (first in Los Angeles, then Dallas, and now West Virginia) and the European Union (Frankfurt, Germany). Guild Wars was also hosted in Asia with datacenter support from our colleagues in NC Korea, NC Japan, and NC Taiwan. Starting around 2010 the hardware in the Asian datacenters aged out and we re-routed players in Asia to the North American datacenter.
As some of you may remember, our Frankfurt datacenter blew up in 2018 just as we were beginning the transition to Amazon Web Services hosting, which oddly enough, was great timing, as explosions go. We were able to start over and build new and improved infrastructure. I am happy to report that the improvements we've made to the game since 2018 have brought new and returning players into the land of Tyria. In fact, our top concurrency hit a new record during the 2022 Lunar New Year event, with just about triple the number of players we saw in early 2018.
With the increase in players and the 17th anniversary of the launch of Guild Wars Prophecies approaching on April 28, I am pleased to announce that Guild Wars will be returning to Asia with a dedicated datacenter hosted in Seoul, South Korea. Once deployed, any player that selects Asia in the District drop-down (any language) will be routed to the new datacenter. The new routing is now live.
This update returns Guild Wars to its premier status as a true worldwide game where players can play with their friends anywhere in the world and have fun. Our commitment to 24/7 uptime makes it easy for friends to get together without worrying about maintenance windows in their local territory. (Guild Wars has been operating without downtime since May 2018 even as we scaled up for the increase in players.) Guild Wars has native textual language support for English, Korean, French, German, Italian, Spanish, Traditional Chinese, Japanese, Polish, and Russian, and audio performances in English, Korean, French, German, Italian and Spanish. NCWest provides customer service support in English, French, German and Spanish.
Thanks for all your support over the years and have fun!
Retrieved from "https://wiki.guildwars.com/index.php?title=Feedback:Developer_updates/20220414&oldid=2677582"


ID@Xbox Pre-PAX event will take place on 31st August, 2017 at Microsoft's Redmond Campus.
As a follow-up to the recent announcement of the pre-orders for the Microsoft Xbox One X opening, Microsoft have also announced its upcoming pre-PAX event, titled ID@Xbox, on 31st August will feature more than 50 titles available to play, including several mixed reality (MR) titles, along with videogames running on the Xbox One X.
Though wording on the details of the event are somewhat vague, there are according to the announcement, plans for several titles compatible with the upcoming Windows 10 MR headsets being available to play, and despite the event being primarily Xbox focussed. Microsoft have yet to confirm any virtual reality (VR) or MR capability for the Xbox One console in any iteration, so with the event is featuring MR having it under the Xbox brand banner is unusual.
The event will be free and does not require a PAX ticket, though pre-registration through the event website will be required. Microsoft have said there will be a raffle to win prizes such as a ticket to PAX, a ID@Xbox Controller Pillow or an Xbox One S. Celebrity guests are also expected, though the identity of these guests has not yet been revealed. ID@Xbox will take place at Microsoft's Redmond Campus at the Visitor's Centre in Building 92.
PlayerUnknown's Battlegrounds (PUBG) – Bluehole, Inc.
Yoku's Island Express – Team17 Digital Ltd.
VRFocus will bring you further news on the ID@XBox event and the role MR is playing at it as it becomes available.


I just got done putting new seals on mine out of my '64. What I used is/was an engine hatch seal I got from WCM. It by no means is the "perfect" seal but it looks like it is going to work out fine. It has a shallow channel that the lid sets in and appears to have glued up OK.
dis-assembled completely and then media blasted all crud, paint and rust off.
seam sealed all the required spots with seam sealer, just like the body people use.
Applied the seal to the metal lip Its a bit tricky. Then used some aluminum .050 sheet I had (approx. 8"x 18") and clamped it on top of the air box to hold the rubber on while curing. I used some spring loaded clamps for this, you just need enough clamp up pressure to bow the aluminum (or Formica,or tin , or what ever) to fit the curve of the box, the cowl isn't flat. Let it set for a day.


text:
Yvonne ist ein weiblicher Vorname:
Yvonne
Yvonne ist Filmtitel:
Yvonne (1915)
Yvonne (1931)
Yvonne (1980)
Yvonne (1985)
Yvonne (2015)
Weiteres
Yvonne (Erzählung) von Jan Petersen (1957)

Siehe auch:
 Yvon


Qualifying for world-level competition, in any event, at any age, does not happen by accident. Placing 16th in the world in your chosen sport takes extreme dedication. Rev. Stanley "Lee" Woods, a multi-sport athlete, Senior Games competitor, and Team USA world competitor, has spent much of his life in preparation, and he knows, unequivocally, that God has directed each one of his steps along the way.
In 2014, Lee went to the Arkansas Senior Olympic Games and received five swimming gold medals and two cycling gold medals which qualified him for the Senior Nationals which were held in Minnesota in 2015.
But, how did he get there? Denmark is a long way away, and Lee would tell you that this event was a lifetime in the making. A California native, Lee spent much of his youth in the water. "Whether it was surfing, skiing, diving, I was all over it." When he was 12, he began age-group swimming, but Lee assures you that he was an average swimmer. "I was not one of the so-called 'naturals,' but in high school I was introduced to Water Polo, and that sport, I thought, was really cool!" Lee continued competitive swimming, but it was Water Polo that would carry him through college and sustain him afterward as a teacher and swim/polo coach.
Lee received much family support during Minnesota's National Senior Games in 2015 when he won a gold medal in the 200 yd. breaststroke and a bronze in the 100 yd. breaststroke. Congratulating him are his son, Burkelee; wife, Ginger; and son, Samuel; and daughter-in-law, Anna.
Granddaughter, Cora, wears her Papa's participant lanyard during an awards assembly in Plano, Texas, in September 2018.
Lee right after getting out of the water during the ITU Aquabike World Championships in Denmark last year.
Lee riding his bike during the ITU Aquabike World Championships.


Engage your guests and create a memorable send-off with our premium quality 10" wedding sparklers.
Crafted using high grade steel rods to prevent bending and produce a virtually smokeless experience.
These sparklers last approximately 40 seconds.
We recommend 2 sparklers per guest. Ideal for receptions and send-offs.
Like all of our wedding sparklers, these 10 inch wedding sparklers are produced on a steel wire, making them what is considered smokeless. This ensures your photographs will be clear and bright! These smaller 10 inch wedding sparklers in bulk are also great for creative wedding favors and gifts. You can attach one of our wedding sparkler tags to a sparkler or two or tie on a personalized match book for a fun and memorable favor!
Our 10 inch sparklers are produced with easy-light tips to make them easier to light. We'll also provide easy lighting instructions and suggestions for an organized send-off.


GIBSON, Hunter singled to center field.
O'BRIEN, Mason doubled down the rf line.
CROFT, Noah singled through the left side; O'BRIEN, Mason advanced to third.
VANVOOREN, David flied out to rf, sacrifice fly, RBI; O'BRIEN, Mason scored.
BOYER, Jordan singled to left field, RBI; SIGRIST, Jack advanced to second, advanced to third on the throw; CROFT, Noah scored.
GIBSON, Hunter singled up the middle, RBI; BOYER, Jordan advanced to second; SIGRIST, Jack scored.
RITTER, Luke doubled to left field, RBI; GIBSON, Hunter advanced to third; BOYER, Jordan scored.
MIRCOVICH, Max hit by pitch; WHITE, Austin advanced to second.
VARGAS, Xavier singled down the lf line.
HEISS, Kevin walked; VARGAS, Xavier advanced to second.
CAVALIERE, Greg singled down the lf line; HEISS, Kevin advanced to second; VARGAS, Xavier advanced to third.
BRODEUR, Josh reached first on an error by ss; CAVALIERE, Greg advanced to second; HEISS, Kevin advanced to third; VARGAS, Xavier scored.
McMANUS, Brett pinch hit for COLEY, Mark.
McMANUS, Brett grounded into double play ss to 2b to 1b; BRODEUR, Josh out on the play; CAVALIERE, Greg advanced to third; HEISS, Kevin scored, unearned.
PETERS, Connery to p for BARNHOUSE, Tommy.
COUTTS, Jackson walked, RBI; MIRCOVICH, Max advanced to second; WHITE, Austin advanced to third; CAVALIERE, Greg scored, unearned.
CRISTINO, John singled through the right side, 2 RBI; COUTTS, Jackson advanced to second; MIRCOVICH, Max scored, unearned; WHITE, Austin scored, unearned.
CAVALIERE, Greg walked; HEISS, Kevin advanced to second.
STEPHENSON, Adam to p for PETERS, Connery.
BRODEUR, Josh reached on a fielder's choice, SAC, bunt; CAVALIERE, Greg advanced to second; HEISS, Kevin out at third p to 3b.
WALLACE, Paxton doubled to right center.
WHITE, Austin singled to pitcher, bunt.
WHITE, Austin advanced to second on a wild pitch.
COUTTS, Jackson singled to right field, RBI; WHITE, Austin scored.
CRISTINO, John doubled to right field; COUTTS, Jackson advanced to third.
VARGAS, Xavier tripled to right field, 2 RBI; CRISTINO, John scored; COUTTS, Jackson scored.
HEISS, Kevin singled to center field, RBI; VARGAS, Xavier scored.
PLEIMANN, Miller to p for STEPHENSON, Adam.
CAVALIERE, Greg singled up the middle; HEISS, Kevin advanced to second.
BRODEUR, Josh walked; CAVALIERE, Greg advanced to second; HEISS, Kevin advanced to third.
McMANUS, Brett singled to left field, 2 RBI; BRODEUR, Josh advanced to second, advanced to third on an error by lf; CAVALIERE, Greg scored; HEISS, Kevin scored.
WHITE, Austin reached on a fielder's choice, RBI; McMANUS, Brett out at second 2b to ss; BRODEUR, Josh scored, unearned.
MIRCOVICH, Max doubled to center field, RBI; WHITE, Austin scored.
SILVESTRI, Mark to p for GRILLO, Dom.
CROFT, Noah tripled to right field.
SLAVENS, Brady grounded out to 2b, RBI; CROFT, Noah scored.
KATZFEY, Jacob pinch hit for VANVOOREN, David.
BOYER, Jordan singled to shortstop; KATZFEY, Jacob advanced to second.
HEISS, Kevin reached first on an error by 1b.
WALLACE, Paxton homered to center field, RBI.
KATZFEY, Jacob singled to pitcher, bunt.
BOYER, Jordan singled up the middle; KATZFEY, Jacob advanced to second.
BOYER, Jordan advanced to third; KATZFEY, Jacob scored on a wild pitch, unearned.
RITTER, Luke reached first on a throwing error by 3b; BOYER, Jordan scored, unearned.
RITTER, Luke advanced to second on a wild pitch.
MCCRAW, Tristan to p for PLEIMANN, Miller.
COUTTS, Jackson singled to right field.
HEISS, Kevin walked; COUTTS, Jackson advanced to second.
CAVALIERE, Greg reached first on an error by 3b; HEISS, Kevin advanced to second; ILARIO, Sam advanced to third.
PLASTIAK, Jake pinch hit for O'BRIEN, Mason.
PLASTIAK, Jake singled to left center.
KOCIS, Garrett pinch hit for JACKSON, Alex.