text:
Did Business Growth Power BlackLine's (NASDAQ:BL) Share Price Gain of 163%?
October 29, 2020, 7:39 AM ·3 min read
The worst result, after buying shares in a company (assuming no leverage), would be if you lose all the money you put in. But when you pick a company that is really flourishing, you can make more than 100%. To wit, the BlackLine, Inc. (NASDAQ:BL) share price has flown 163% in the last three years. That sort of return is as solid as granite. It's down 5.0% in the last seven days.
See our latest analysis for BlackLine
BlackLine wasn't profitable in the last twelve months, it is unlikely we'll see a strong correlation between its share price and its earnings per share (EPS). Arguably revenue is our next best option. When a company doesn't make profits, we'd generally expect to see good revenue growth. That's because it's hard to be confident a company will be sustainable if revenue growth is negligible, and it never makes a profit.
BlackLine's revenue trended up 25% each year over three years. That's well above most pre-profit companies. Meanwhile, the share price performance has been pretty solid at 38% compound over three years. But it does seem like the market is paying attention to strong revenue growth. Nonetheless, we'd say BlackLine is still worth investigating - successful businesses can often keep growing for long periods.
The company's revenue and earnings (over time) are depicted in the image below (click to see the exact numbers).
BlackLine is a well known stock, with plenty of analyst coverage, suggesting some visibility into future growth. So we recommend checking out this free report showing consensus forecasts
We're pleased to report that BlackLine rewarded shareholders with a total shareholder return of 97% over the last year. That gain actually surpasses the 38% TSR it generated (per year) over three years. The improving returns to shareholders suggests the stock is becoming more popular with time. I find it very interesting to look at share price over the long term as a proxy for business performance. But to truly gain insight, we need to consider other information, too. For instance, we've identified 3 warning signs for BlackLine that you should be aware of.
If you would prefer to check out another company -- one with potentially superior financials -- then do not miss this free list of companies that have proven they can grow earnings.
Please note, the market returns quoted in this article reflect the market weighted average returns of stocks that currently trade on US exchanges.
(Bloomberg) -- Intel Corp.'s incoming Chief Executive Officer Pat Gelsinger pledged to regain the company's lead in chip manufacturing, countering growing calls from some investors to shed that part of its business."I am confident that the majority of our 2023 products will be manufactured internally," he said. "At the same time, given the breadth of our portfolio, it's likely that we will expand our use of external foundries for certain technologies and products."He plans to provide more details after officially taking over the CEO role Feb. 15, however Gelsinger was clear that Intel is sticking with its once-mighty manufacturing operation."We're not just interested in closing gaps," he told analysts on a conference call Thursday. "We're interested in resuming that position as the unquestioned leader in process technology."Keeping production in-house may be bad for Intel because its manufacturing technology has fallen behind Taiwan Semiconductor Manufacturing Co., which makes chips for many of Intel's rivals. If the U.S. company can't catch up, its products will become less competitive and it could lose sales and market share. Activist Dan Loeb has suggested the company consider spinning off its manufacturing business. Other investors have been waiting to see if Intel will outsource more production. Intel shares fell almost 5% in extended trading, giving away most of the gains made earlier on a strong earnings announcement."Where investors are going to be disappointed is that some were expecting some sort of larger announcement of a strategic partnership with TSMC," said Edward Jones & Co. analyst Logan Purk.TSMC recently announced capital spending of as much as $28 billion for 2021 to maintain its lead. Purk said Intel would have to increase its own spending massively to try to catch the Asian company.Gelsinger is taking the reins of a company in the midst of its worst crisis in at least a decade. It has been the largest chipmaker for most of the past 30 years, dominating the $400 billion industry by making the best designs in its own cutting-edge factories. Most other U.S. chip companies shut or sold plants and tapped other firms to make the components. Intel held out, arguing that doing both improved each side of its operations and created better semiconductors.That strategy has crumbled in recent years as Intel struggled to introduce new production techniques on time. It is now lagging behind TSMC and Samsung Electronics Co., which make chips for Intel competitors, such as Advanced Micro Devices Inc., and big Intel customers including Amazon.com Inc. and Apple Inc.AMD shares rallied in extended trading while Gelsinger discussed his goal of improving Intel's in-house manufacturing.Intel's quarterly results, released before the market closed on Thursday, sent the shares higher in New York earlier on Thursday. A hacker accessed sensitive information from Intel's website, prompting the company to report the numbers earlier than planned.Revenue in the period ending in March will be about $17.5 billion, the Santa Clara, California-based company said. This excludes the memory chip division Intel is selling. Analysts were looking for $16.2 billion on average, according to data compiled by Bloomberg.Intel sees strong demand for laptops through the first half of the year, Chief Financial Officer George Davis said in an interview. Earnings in the second part of the year will partly depend on whether corporations increase spending on new hardware, he added."The question is will we see support from enterprise," he said. "They've been very quiet."Intel's personal computer chip division had revenue of $10.9 billion in the fourth quarter. Analysts expected $9.72 billion. Its higher-margin data center unit generated sales of $6.1 billion. Wall Street was looking for $5.37 billion.In Intel's data center business, revenue from cloud service providers fell 15% from a year earlier. Enterprise and government sales slumped 25%. Volumes and average selling prices declined. Owners of large data centers are working their way through unused stockpiles of chips.In its PC business, Intel reported a 30% surge in laptop chip sales, even as average selling prices declined 15%.Fourth-quarter profit, excluding some items, was $1.52 a share on $20 billion of revenue, down 1% from a year earlier. Analysts had estimated $1.11 a share on revenue of $17.5 billion.Intel's gross margin, the percentage of revenue remaining after deducting the cost of production, was 56.8%. This is a key indicator of the strength of its manufacturing and product pricing. Intel has historically delivered margins of about 60%.(Updates with analyst comment seventh paragraph.)For more articles like this, please visit us at bloomberg.comSubscribe now to stay ahead with the most trusted business news source.©2021 Bloomberg L.P.


When you need dental work that requires dental appliances in the Reseda and Tarzana areas, make an appointment with Dr. Afsoon Gerayli As a top dentist in her field, Dr. Gerayli provides care using the latest dental techniques. She expertly places crowns and bridges as well as inlays and onlays.
Decay and stress weaken teeth. One of the best ways to regain the full functionality of a tooth that's been damaged by decay, stress or trauma is to cover it with a dental crown. Dentists often recommend placing a crown over teeth that are excessively decayed, fractured, cracked or in need of structural support following a root canal. The dental device can also hold a bridge in position or cover an implant.
Cosmetic dentists sometimes place crowns to improve a tooth's appearance. In most cases, your dentist will be able to cover a damaged tooth with a crown to save it as long as the structure of the root is unbroken. A crown is tailor-made to contain the damaged tooth, and once it's in place, the device transforms into the tooth's new surface. Modern-day dentists offer different types of crowns such as all ceramic and porcelain over gold.
Crown placement usually requires two dental visits. During the first visit, your dentist will prepare the tooth for the dental device. The second visit consists of placing your permanent crown. To ready the tooth for the crown, your dentist will take several x-rays. She will then numb the tooth and the area surrounding it for your comfort. The top and sides of the tooth that needs a crown will be filed down to make room for the dental appliance. Dr. Gerayli will make an impression of the tooth so that the lab can mold your crown. During your second visit, your dentist will cement the new crown into place. Once your gums have had time to adjust, your crown will feel as comfortable in your mouth as your natural teeth do.
When more than one tooth needs to be replaced, you may need a bridge. This type of dental device fills in gum line gaps from missing teeth. To determine whether a bridge will resolve your dental problems, Dr. Gerayli will examine your teeth and jaw. She will also assess your bone structure. Be prepared to answer a few questions about what you want and need from your dental work. Dr. Gerayli will then recommend the best solution based on her assessment. To position a bridge, your dentist will use the teeth that border the space for support. As long as the device is made properly, it will match your natural teeth. With one in place, you'll be able to eat, speak and smile easily. Your Valley dentist will make sure that your bridge feels and looks natural in your mouth.
Inlays and onlays resolve the problem of tooth decay when it settles between a crown and a filling. Dentists also use them to treat large cavities. When a small cavity forms within a tooth, your dentist will use a filling to treat it. The material used during this dental process is a hard plastic formulated to mimic the color of teeth. This substance is incredibly durable, and it does not typically suffer from wear and tear. For large cavities, your dentist may need to use an inlay.
Inlays are similar to veneers and crowns since your dentist will need an impression of the afflicted tooth. Because inlays are used to fill in the space that large cavities leave behind, the dental device will be manufactured to fill this gap. To position the inlay, your dentist will bond it to the tooth with cement.
Tooth decay can form along the cusp of a tooth, and when it does, it creates a unique challenge since your dentist will be unable to treat it in the same way that she would a regular cavity. To resolve the issue, your dentist may use an onlay. This type of dental work is similar to an inlay, but onlays are slightly larger. When your dentist uses an onlay, the device will likely cover the top section of your tooth, but it won't surround it.
At Victory Cosmetic Dentistry, Dr. Gerayli uses inlays and onlays that are made from porcelain due to the material's positive attributes. For instance, porcelain is durable, and it does not cause the negative side effects that metals can trigger. The material also presents an aesthetically pleasing appearance and is stronger that other types of fillings.
With her standing as one of the area's top dentists, Dr. Gerayli has the expertise to assess your oral needs regarding dental appliances like crowns, bridges, inlays and onlays. Dental appliances allow your cosmetic dentist to provide comprehensive dental care that not only resolves damaged teeth, but they also enhance your smile.


A letter from Pearl Von Allmen to Mary Polk Green discussing the mailing of ballots for the SEAALL Officer election.
Von Allmen, Pearl, "Letter to Mary Polk Green regarding the SEAALL Officer Election, June 7, 1968" (1968). Correspondence. 2088.


text:
Middle East Region renamed Mid-Atlantic Region
Civil Air Patrol's Middle East Region is now the Mid-Atlantic Region, thanks to a redesignation plan approved by national leadership.
"We are excited to be transitioning to the Mid-Atlantic Region, as this change will better reflect who we are as a region," said Col. Bruce Heinlein, region commander. "The Mid-Atlantic is the home of America's first colony, the world's first heavier-than-air flight and our nation's capital."
One of eight CAP regions nationwide, the Mid-Atlantic Region consists of seven wings – Delaware, Maryland, National Capital, North Carolina, South Carolina, West Virginia and Virginia.
Region leaders say the name change will reduce confusion in interactions with the military, media, government and academia. Since its formation, "Middle East Region" did not adhere to the region's geographic area, unlike CAP's Great Lakes, Rocky Mountain and Pacific regions. In addition, the name was often confused with the Middle East -- West Asia and the Levant (lands bordering the eastern shores of the Mediterranean Sea now occupied by Lebanon, Syria and Israel).
"Our region is the last to change our name, but we will now comport with the other regions as they reflect their key geographic feature," Heinlein said. "Finally, in our global world, changing our name will help us avoid confusion with Southwest Asia."
CAP National Commander Maj. Gen. Mark Smith recently approved the redesignation plan, making the name change official.
Changing the name requires new branding on both region and national documents and regulations as well as in computer systems. Heraldry that includes a new unit patch is also in the works.
Operationally, little impact is anticipated. "For us, it will be business as usual," Heinlein said. "We'll continue to provide the same great service to the Mid-Atlantic states and their communities as well as Washington, D.C."
Tagged As: Media Relations,

redpajama_set_name: RedPajamaCommonCrawl


text:
<?php
/**
 * Domain object for handling profile runs.
 *
 * Provides method to manipulate the data from a single profile run.
 */
class Xhgui_Profile
{
    /**
     * @const Key used for methods with no parent
     */
    const NO_PARENT = '__xhgui_top__';

    protected $_data;
    protected $_collapsed;
    protected $_indexed;
    protected $_visited;

    protected $_keys = array('ct', 'wt', 'cpu', 'mu', 'pmu');
    protected $_exclusiveKeys = array('ewt', 'ecpu', 'emu', 'epmu');
    protected $_functionCount;

    public function __construct($profile, $convert = true)
    {
        $this->_data = $profile;
        if (!empty($profile['profile']) && $convert) {
            $this->_process();
        }
    }

    /**
     * Convert the raw data into a flatter list that is easier to use.
     *
     * This removes some of the parentage detail as all calls of a given
     * method are aggregated. We are not able to maintain a full tree structure
     * in any case, as xhprof only keeps one level of detail.
     *
     * @return void
     */
    protected function _process()
    {
        $result = array();
        foreach ($this->_data['profile'] as $name => $values) {
            list($parent, $func) = $this->splitName($name);

            // Generate collapsed data.
            if (isset($result[$func])) {
                $result[$func] = $this->_sumKeys($result[$func], $values);
                $result[$func]['parents'][] = $parent;
            } else {
                $result[$func] = $values;
                $result[$func]['parents'] = array($parent);
            }

            // Build the indexed data.
            if ($parent === null) {
                $parent = self::NO_PARENT;
            }
            if (!isset($this->_indexed[$parent])) {
                $this->_indexed[$parent] = array();
            }
            $this->_indexed[$parent][$func] = $values;
        }
        $this->_collapsed = $result;
    }

    /**
     * Sum up the values in $this->_keys;
     *
     * @param array $a The first set of profile data
     * @param array $b The second set of profile data.
     * @return array Merged profile data.
     */
    protected function _sumKeys($a, $b)
    {
        foreach ($this->_keys as $key) {
            $a[$key] += $b[$key];
        }
        return $a;
    }

    protected function _diffKeys($a, $b, $includeSelf = true)
    {
        $keys = $this->_keys;
        if ($includeSelf) {
            $keys = array_merge($keys, $this->_exclusiveKeys);
        }
        foreach ($keys as $key) {
            $a[$key] -= $b[$key];
        }
        return $a;
    }

    protected function _diffPercentKeys($a, $b, $includeSelf = true)
    {
        $out = array();
        $keys = $this->_keys;
        if ($includeSelf) {
            $keys = array_merge($keys, $this->_exclusiveKeys);
        }
        foreach ($keys as $key) {
            if ($b[$key] != 0) {
                $out[$key] = $a[$key] / $b[$key];
            } else {
                $out[$key] = -1;
            }
        }
        return $out;
    }

    /**
     * Get the profile run data.
     *
     * TODO remove this and move all the features using it into this/
     * other classes.
     *
     * @return array
     */
    public function getProfile()
    {
        return $this->_collapsed;
    }

    public function getId()
    {
        return $this->_data['_id'];
    }

    public function getDate()
    {
        return new DateTime('@' . $this->getMeta('SERVER.REQUEST_TIME'));
    }

    /**
     * Get meta data about the profile. Read's a . split path
     * out of the meta data in a profile. For example `SERVER.REQUEST_TIME`
     *
     * @param string $key The dotted key to read.
     * @return null|mixed Null on failure, otherwise the stored value.
     */
    public function getMeta($key = null)
    {
        $data = $this->_data['meta'];
        if ($key === null) {
            return $data;
        }
        $parts = explode('.', $key);
        foreach ($parts as $key) {
            if (is_array($data) && isset($data[$key])) {
                $data =& $data[$key];
            } else {
                return null;
            }
        }
        return $data;
    }

    /**
     * Read data from the profile run.
     *
     * @param string $key The function key name to read.
     * @param string $metric The metric to read.
     * @return null|float
     */
    public function get($key, $metric = null)
    {
        if (!isset($this->_collapsed[$key])) {
            return null;
        }
        if (empty($metric)) {
            return $this->_collapsed[$key];
        }
        if (!isset($this->_collapsed[$key][$metric])) {
            return null;
        }
        return $this->_collapsed[$key][$metric];
    }

    /**
     * Find a function matching a watched function.
     *
     * @param string $pattern The pattern to look for.
     * @return null|array An list of matching functions
     *    or null.
     */
    public function getWatched($pattern)
    {
        if (isset($this->_collapsed[$pattern])) {
            $data = $this->_collapsed[$pattern];
            $data['function'] = $pattern;
            return array($data);
        }
        $matches = array();
        $keys = array_keys($this->_collapsed);
        foreach ($keys as $func) {
            if (preg_match('`^' . $pattern . '$`', $func)) {
                $data = $this->_collapsed[$func];
                $data['function'] = $func;
                $matches[] = $data;
            }
        }
        return $matches;
    }

    /**
     * Find the parent and children method/functions for a given
     * symbol.
     *
     * The parent/children arrays will contain all the callers + callees
     * of the symbol given. The current index will give the total
     * inclusive values for all properties.
     *
     * @param string $symbol The name of the function/method to find
     *    relatives for.
     * @param string $metric The metric to compare $threshold with.
     * @param float $threshold The threshold to exclude child functions at. Any
     *   function that represents less than this percentage of the current metric
     *   will be filtered out.
     * @return array List of (parent, current, children)
     */
    public function getRelatives($symbol, $metric = null, $threshold = 0)
    {
        $parents = array();

        // If the function doesn't exist, it won't have parents/children
        if (empty($this->_collapsed[$symbol])) {
            return array(
                array(),
                array(),
                array(),
            );
        }
        $current = $this->_collapsed[$symbol];
        $current['function'] = $symbol;

        $parents = $this->_getParents($symbol);
        $children = $this->_getChildren($symbol, $metric, $threshold);
        return array($parents, $current, $children);
    }

    /**
     * Get the parent methods for a given symbol.
     *
     * @param string $symbol The name of the function/method to find
     *    parents for.
     * @return array List of parents
     */
    protected function _getParents($symbol) {
        $parents = array();
        $current = $this->_collapsed[$symbol];
        foreach ($current['parents'] as $parent) {
            if (isset($this->_collapsed[$parent])) {
                $parents[] = array('function' => $parent) + $this->_collapsed[$parent];
            }
        }
        return $parents;
    }

    /**
     * Find symbols that are the children of the given name.
     *
     * @param string $symbol The name of the function to find children of.
     * @param string $metric The metric to compare $threshold with.
     * @param float $threshold The threshold to exclude functions at. Any
     *   function that represents less than
     * @return array An array of child methods.
     */
    protected function _getChildren($symbol, $metric = null, $threshold = 0) {
        $children = array();
        if (!isset($this->_indexed[$symbol])) {
            return $children;
        }

        $total = 0;
        if (isset($metric)) {
            $top = $this->_indexed[self::NO_PARENT];
            // Not always 'main()'
            $mainFunc = current($top);
            $total = $mainFunc[$metric];
        }

        foreach ($this->_indexed[$symbol] as $name => $data) {
            if (
                $metric && $total > 0 && $threshold > 0 &&
                ($this->_collapsed[$name][$metric] / $total) < $threshold
            ) {
                continue;
            }
            $children[] = $data + array('function' => $name);
        }
        return $children;
    }

    /**
     * Extracts a single dimension of data
     * from a profile run.
     *
     * Useful for creating bar/column graphs.
     * The profile data will be sorted by the column
     * and then the $limit records will be extracted.
     *
     * @param string $dimension The dimension to extract
     * @param int $limit Number of elements to pull
     * @return array Array of data with name = function name and
     *   value = the dimension.
     */
    public function extractDimension($dimension, $limit)
    {
        $profile = $this->sort($dimension, $this->_collapsed);
        $slice = array_slice($profile, 0, $limit);
        $extract = array();
        foreach ($slice as $func => $funcData) {
            $extract[] = array(
                'name' => $func,
                'value' => $funcData[$dimension]
            );
        }
        return $extract;
    }

    /**
     * Generate the approximate exclusive values for each metric.
     *
     * We get a==>b as the name, we need a key for a and b in the array
     * to get exclusive values for A we need to subtract the values of B (and any other children);
     * call passing in the entire profile only, should return an array of
     * functions with their regular timing, and exclusive numbers inside ['exclusive']
     *
     * Consider:
     *              /---c---d---e
     *          a -/----b---d---e
     *
     * We have c==>d and b==>d, and in both instances d invokes e, yet we will
     * have but a single d==>e result. This is a known and documented limitation of XHProf
     *
     * We have one d==>e entry, with some values, including ct=2
     * We also have c==>d and b==>d
     *
     * We should determine how many ==>d options there are, and equally
     * split the cost of d==>e across them since d==>e represents the sum total of all calls.
     *
     * Notes:
     *  Function names are not unique, but we're merging them
     *
     * @return Xhgui_Profile A new instance with exclusive data set.
     */
    public function calculateSelf()
    {
        // Init exclusive values
        foreach ($this->_collapsed as &$data) {
            $data['ewt'] = $data['wt'];
            $data['emu'] = $data['mu'];
            $data['ecpu'] = $data['cpu'];
            $data['ect'] = $data['ct'];
            $data['epmu'] = $data['pmu'];
        }
        unset($data);

        // Go over each method and remove each childs metrics
        // from the parent.
        foreach ($this->_collapsed as $name => $data) {
            $children = $this->_getChildren($name);
            foreach ($children as $child) {
                $this->_collapsed[$name]['ewt'] -= $child['wt'];
                $this->_collapsed[$name]['emu'] -= $child['mu'];
                $this->_collapsed[$name]['ecpu'] -= $child['cpu'];
                $this->_collapsed[$name]['ect'] -= $child['ct'];
                $this->_collapsed[$name]['epmu'] -= $child['pmu'];
            }
        }
        return $this;
    }

    /**
     * Sort data by a dimension.
     *
     * @param string $dimension The dimension to sort by.
     * @param array $data The data to sort.
     * @return array The sorted data.
     */
    public function sort($dimension, $data)
    {
        $sorter = function ($a, $b) use ($dimension) {
            if ($a[$dimension] == $b[$dimension]) {
                return 0;
            }
            return $a[$dimension] > $b[$dimension] ? -1 : 1;
        };
        uasort($data, $sorter);
        return $data;
    }

    /**
     * Split a key name into the parent==>child format.
     *
     * @param string $name The name to split.
     * @return array An array of parent, child. parent will be null if there
     *    is no parent.
     */
    public function splitName($name)
    {
        $a = explode("==>", $name);
        if (isset($a[1])) {
            return $a;
        }
        return array(null, $a[0]);
    }

    /**
     * Get the total number of tracked function calls in this run.
     *
     * @return int
     */
    public function getFunctionCount()
    {
        if ($this->_functionCount) {
            return $this->_functionCount;
        }
        $total = 0;
        foreach ($this->_collapsed as $data) {
            $total += $data['ct'];
        }
        $this->_functionCount = $total;
        return $this->_functionCount;
    }

    /**
     * Compare this run to another run.
     *
     * @param Xhgui_Profile $head The other run to compare with
     * @return array An array of comparison data.
     */
    public function compare(Xhgui_Profile $head) {
        $this->calculateSelf();
        $head->calculateSelf();

        $keys = array_merge($this->_keys, $this->_exclusiveKeys);
        $emptyData = array_fill_keys($keys, 0);

        $diffPercent = array();
        $diff = array();
        foreach ($this->_collapsed as $key => $baseData) {
            $headData = $head->get($key);
            if (!$headData) {
                $diff[$key] = $this->_diffKeys($emptyData, $baseData);
                continue;
            }
            $diff[$key] = $this->_diffKeys($headData, $baseData);

            if ($key === 'main()') {
                $diffPercent[$key] = $this->_diffPercentKeys($headData, $baseData);
            }
        }

        $diff['functionCount'] = $head->getFunctionCount() - $this->getFunctionCount();
        $diffPercent['functionCount'] = $head->getFunctionCount() / $this->getFunctionCount();

        return array(
            'base' => $this,
            'head' => $head,
            'diff' => $diff,
            'diffPercent' => $diffPercent,
        );
    }

    /**
     * Get the max value for any give metric.
     *
     * @param string $metric The metric to get a max value for.
     */
    protected function _maxValue($metric)
    {
        return array_reduce(
            $this->_collapsed,
            function($result, $item) use ($metric) {
                if ($item[$metric] > $result) {
                    return $item[$metric];
                }
                return $result;
            },
            0
        );
    }

    /**
     * Return a structured array suitable for generating callgraph visualizations.
     *
     * Functions whose inclusive time is less than 2% of the total time will
     * be excluded from the callgraph data.
     *
     * @return array
     */
    public function getCallgraph($metric = 'wt', $threshold = 0.01)
    {
        $valid = array_merge($this->_keys, $this->_exclusiveKeys);
        if (!in_array($metric, $valid)) {
            throw new Exception("Unknown metric '$metric'. Cannot generate callgraph.");
        }
        $this->calculateSelf();

        // Non exclusive metrics are always main() because it is the root call scope.
        if (in_array($metric, $this->_exclusiveKeys)) {
            $main = $this->_maxValue($metric);
        } else {
            $main = $this->_collapsed['main()'][$metric];
        }

        $this->_visited = $this->_nodes = $this->_links = array();
        $this->_callgraphData(self::NO_PARENT, $main, $metric, $threshold);
        $out = array(
            'metric' => $metric,
            'total' => $main,
            'nodes' => $this->_nodes,
            'links' => $this->_links
        );
        unset($this->_visited, $this->_nodes, $this->_links);
        return $out;
    }

    protected function _callgraphData($parentName, $main, $metric, $threshold, $parentIndex = null)
    {
        // Leaves don't have children, and don't have links/nodes to add.
        if (!isset($this->_indexed[$parentName])) {
            return;
        }

        $children = $this->_indexed[$parentName];
        foreach ($children as $childName => $metrics) {
            $metrics = $this->_collapsed[$childName];
            if ($metrics[$metric] / $main <= $threshold) {
                continue;
            }
            $revisit = false;

            // Keep track of which nodes we've visited and their position
            // in the node list.
            if (!isset($this->_visited[$childName])) {
                $index = count($this->_nodes);
                $this->_visited[$childName] = $index;

                $this->_nodes[] = array(
                    'name' => $childName,
                    'callCount' => $metrics['ct'],
                    'value' => $metrics[$metric],
                );
            } else {
                $revisit = true;
                $index = $this->_visited[$childName];
            }

            if ($parentIndex !== null) {
                $this->_links[] = array(
                    'source' => $parentName,
                    'target' => $childName,
                    'callCount' => $metrics['ct'],
                );
            }

            // If the current function has more children,
            // walk that call subgraph.
            if (isset($this->_indexed[$childName]) && !$revisit) {
                $this->_callgraphData($childName, $main, $metric, $threshold, $index);
            }
        }
    }

    public function toArray()
    {
        return $this->_data;
    }

}

redpajama_set_name: RedPajamaGithub


"Which Paid Survey Companies Really Pay?"
I have been taking surveys for money for years now. And in that span of time, I can say that I have joined pretty much all paid survey companies out there. It's true, there are some companies that are just scams, I was once also a victim. But there are still dependable companies that pay you fairly for your efforts.
Listed below are the reliable paid survey companies that I have found and participated with. I have also included my personal experiences with these companies. Let me share them with you.
Lightspeed International has been around for a long time. Lightspeed sends out surveys regularly. They pay in three ways: check, Paypal, and gifts or merchandise. One good thing about this company is that they give you credit for surveys even if your particular set of circumstances do not satisfy the whole survey. Hispanic survey takers are also encouraged to join; they have a panel especially for you, here's the link.
My Survey is definitely my favorite. They just get everything right. They let you earn points that can easily be converted into cash. Or you can just simply cash out for their product, they have a wide array of nice products you can cash out for too. And as a matter of fact, I just cashed out $25 earlier today. They pay by check every couple of weeks or so. I must say that this is one of the best; I've made a lot with them up to now.
This one is another one of my favorites. This is how their new system works: There is a corresponding point for every survey you complete. These points can be converted into cash which is then sent to you by check. In addition to that, you will also have the chance to win sweeps for every survey you complete. And the sweepstakes are very generous. The surveys from Synovate are very short, it usually only takes 5-10 minutes to complete them.
"Make your voice heard. Join NPD Research and tell us what you buy (and why)." This is their way to attract survey takers. I have recently joined them and they must have a lot of clients because they are very generous in giving out surveys (and paying for them)!
Ipsos used to be a sweepstakes site only, but now they PAY. The surveys give a fairly generous point value, and they convert every 50 points to $5 cash. In addition, they carry out very good product tests. They pay through check and as for their test products, they've never asked me to send one back. I've been able to keep them all.
Their surveys come very often and they give out points generously per survey. You can cash those points out once you have accumulated 1,000 points. This is equivalent to $50. The nice thing about them is that they are generous in giving points even if you don't qualify for particular surveys because of your demographic. Each point is approximately 25 cents, and getting to 2,000 points isn't difficult, and that's $100 cash! International members are also encouraged to take surveys, so if you are not from the USA, visit the link here and click to the left of your country's link.
Survey Spot acts quickly, they send out survey after survey and from what I've seen about half of their surveys pay cash and the other half is for sweepstakes. I have heard from several people who win the sweepstakes for either cash or prizes, but unfortunately, I haven't won any sweeps yet. I have been paid for the paying ones though. Here's a nice little secret: if you do the sweepstakes-only surveys, that usually opens the door to higher paying surveys because they now know you're a serious survey-taker. They recently switched over to a new system that lets you earn points that you can cash out as Paypal money.
This site is very active when it comes to sending you surveys. They pay out in points, and I must say that they are generous. Zoom Panel automatically gives you an initial 50 points just for signing up! I have used these points to cash out for merchandise like electronics, iPod accessories, and other cool gadgets. You can also cash out for gift certificates.
This is a well-known company among survey takers. Opinion Outpost has very interesting surveys with equivalent survey points that are easily converted into cash. You can receive your check within a couple of days after your request. As of the moment, they are accepting survey takers from the United States and Canada.
Their surveys are really good and unlike other companies, Valued Opinions allow you to cash out when your account reaches $20. As for me, it took me about a month to reach that point, but I only responded to a few of their surveys.
This site offers short surveys that usually take 1-3 minutes to finish. You are paid within four weeks after completing the survey. They automatically mail the checks so you don't have to worry about requesting your payment. In addition, they frequently do quick surveys for sweepstakes that pay out from $10 to $100. American Consumer Opinion Panel encourages international members to join as well.
This is really different from the other ones. They send you a little scanner and all you do is scan the UPC codes of the products you purchase. It takes me about 3 or 4 minutes to do my whole grocery load. They pay out gift cards, products, and cash. Basically, you will earn more if you are an active scanner. Some people I talk to don't like this one, but most people love it. The only problem is that they close membership to this often. Last time I checked, it was closed. You can check here to see if it's open now.
Greenfield sends lots of surveys. They have also readily available surveys on their site to take pretty much any time you log in. And although the payment may take a while to be received, it does come around. Their payments are by check only.
This is a survey panel that lets you earn in three ways: payment, sweeps, or products. I took some of their surveys and I was paid in a timely manner.
I put together a list of all the top survey sites and a free 7 day e-course for finding out the reay way of taking surveys for money. Feel free to sign up below and I'll send that to you immediately. Don't worry, I won't spam you or sell your email address to anyone.


Philip Calvin Hannay, age 64, of Monroe, died on March 26, 2019. He was born in Walton County on June 2, 1954 to Catherine Willford Hannay and the late Calvin Hannay.
He is survived by his wife, Kaye Little Hannay of Monroe; mother, Catherine Hannay of Monroe; son, Chris Hannay and Brandy Peters of Monroe; daughters and sons-in-law, Lauren and Devon Mitchell of Fernandina Beach, FL, Rhonda and Jeff Chandler of Bostwick; grandchildren: Kyra Mitchell, Rowan Mitchell, Ryan McCullers, Mason McCullers, Logan McCullers, and Kaden McCullers.
Funeral services will be Sunday, March 31, 2019 at 2:30 pm at Union Chapel United Methodist Church with Rev. Roger Canuel officiating. Interment will follow at Union Chapel United Methodist Church Cemetery.
Meadows Funeral Home, Inc. is in charge of arrangements, please sign the guestbook online at www.meadowsfuneralhomeinc.com.


text:
Q: Django - processing objects after .filter(...) or .all(...) Still learning Django, so not sure if there's a nice way to do this.
I have a few models with specific attributes (all use Item as base class), and a metadata table (id, language, type, value) used to store any extra attributes that could be potentially associated with instances of any of those models (code below). These models are used with a form / template, simple web-based CRUD.
Right now, I call .save_metadata(...) and .load_metadata(...) explicitly, and use .form_initia(...) to populate the form with metadata that isn't explicitly in the model.
I'm looking for a way to handle this automatically -- basically implementing a model with a variable number of fields, key ones are columns in the model's table, the other ones are rows in the metadata table, and are instance-specific. Is there a way of hooking a method after objects.get(...) or objects.filter(...) etc? I've messed with custom managers and looked into signals, but nothing seems to lead towards an acceptable solution.
class Item(models.Model):
  mdata = ['title'] # metadata associated with item

  user = models.ForeignKey(User)
  created = models.DateTimeField(auto_now_add = True)
  status = models.IntegerField(default=0, choices = ([(0,'Staged'), (1,'Published'),(2,'Archived'), ]))

  def set_status(self, s):
    self.status = s
    self.save()

  # stores metadata attributes associated with current item
  def save_metadata(self, lang, form):
    for mt in self.mdata:
      try:
        md = Metadata.objects.get(item=self, lang=lang, t=mt)
      except Metadata.DoesNotExist:
        md = Metadata.objects.create(item=self, lang=lang, t=mt)
      md.v=form.cleaned_data[mt]
      md.save()

  # retrieves metadata attributes associated with current item
  def load_metadata(self, lang):
    for mt in self.mdata:
      self.__dict__[mt] = None
      try:
        self.__dict__[mt] = Metadata.objects.get(item=self, t=mt, lang=lang).v
      except Metadata.DoesNotExist:
        md = Metadata.objects.filter(item=self, t=mt)
        if len(md) > 0:
          self.__dict__[mt] = md[0].v

  # provides metadata attributes associated with current item needed to populate a form
  def form_initial(self, seed=None):
    meta = {}
    for mt in self.mdata:
      meta[mt] = self.__dict__[mt]
      #meta[mt] = 'test'
    if seed:
      meta = dict(meta.items() + seed.items())
    return meta

# used to store various metadata associated with models derived from Item
class Metadata(models.Model):
  item = models.ForeignKey(Item)
  lang = models.CharField(max_length = 8)
  t = models.CharField(max_length = 250)
  v = models.CharField(max_length = 2500)

redpajama_set_name: RedPajamaStackExchange


text:
Q: Os X crashed using Sublime Text. Html is now malformed binary While I was coding, my computer crashed. Now when i look at my files i see malformed binary output.
ú…|Y«Ó4◊©{zû¯ÄåÊA=˝‹.֮ŻÂsıØ6ÌÀäÆj
—·Ks5‡ó‹≤ŸV/F6"ÎøõH
a$K"áÒE›£á‰ï™B–ü™'Xnn∂{!˜ãzNÈ·"ˆ´êk•iQ≠¡<'√àKú@Ê√u¶îÕõî éË∏7Á¸oLx'3∫Ø4Ìè´«(K
'™9«øÚâŒØjÒˇzQöº{vZ¸^EÎIä?ïä;˜ø∂pw!A†∑®flY∑ºóÓÉu:cȉ˘/%nbZ¶/¡ò•gA4
∂6Ü'¬/IÉObÜáZ¿ÿäØ˛KU'fl9'úÓÜiS.tUßQ‰·a|Ï30me|
ç–V˙8tm˛∑\ıõ}˚†¯‹˝&gE9,ΩÓ<Y` k5îŸgV]Ìu 6u4'O)Œè`'¬=˜6«m¨m◊Ï` ãfløΩÜq»ÖDà,≤¨fiܘ
èRí‰yflΩ|˘u≥È«fi'H§Õ…]ΩÓH#|6÷ié∑3|ˆS…Á6=∆q`-ãïΩçEª">N7W™.}'πáQkOfl¸'O"D1Õu¯lBp˚iN'ïß9>ı‡»5Q   ≤y|O:
'áπjÂ<¸√`"c¶`∂'¸öHÔ20∑ÅD[«◊ó±\Ö€üdÿˆ/Y3·Ag®5ä≠Œ≤3¶µ~X
,±kãç≥´~ɯî⁄˝öGiÓ¨·

How can i fix this, any ideas ?
By the way i am using Mac OsX 10.10 Yosemite, and Sublime text 3 without any plugins.