text:
\section{Introduction}

Indexes (such as B-trees) are fundamental to many problems in storage, such as databases and file systems. In this paper we investigate IO-efficient persistent indexes that have fast updates (in $o(1)$ IOs per update), linear space and support efficient range queries.

Logically, there is a tree of versions $V$, and every version $v \in V$ has a dictionary $D_u$ mapping keys to values. We want to support the following operations, starting from an empty data structure and a single root node:
\begin{itemize}
\item $\texttt{update}_v (k,x)$: create a new child $w$ of $v$ with $D_w = D_v \cup \{ (k,v,x) \}$ (overwriting any previous elements for $k$). Return $w$.
\item $\texttt{query}_v (k_1,k_2)$: return $\{ (k,v,x) \in D_v : k \in [k_1,k_2] \}$.
\end{itemize}

If $\texttt{update}_v(\cdot)$ only works on leaf versions $v$, then the structure is partially-persistent (the version tree is a line), otherwise it is fully-persistent. This work focuses on the partially-persistent case. In addition, we only the discuss the case of updates; deletes can be handled by inserting a key with a null value; when these values are encountered in the output of a query, we can ignore the element.

We say that a key $k$ is \emph{live} at $v$ if $k \in D_v$. We let $N_v = |D_v|$ (the quantity increases down the version tree) and $N$ be the total number of updates. Clearly, storing the dictionaries $\{D_v\}$ explicitly is not efficient - the description is purely to simplify the exposition.

\subsection{Related work}
Unversioned indexes have been developed which support a range of tradeoffs between update and query performance. The cache-oblivious (CO) model was introduced by Frigo et al. \cite{Frigo:1999}. Several update/query tradeoffs are known for unversioned dictionaries in the CO model. The cache-oblivious lookahead array (COLA) of Bender et al. \cite{Bender:2007} supports updates in amortized $O(\log N/B)$ IOs and queries in $O(\log N + Z/B)$ IOs. The xDict structure of Brodal et al.\cite{Brodal:2012} supports a wide range of update/query tradeoffs in the  CO model.

The classic versioned analogue of the B-tree is the copy-on-write (CoW) B-tree \cite{episode,Rodeh:2008}, which
is based on the path-copying technique of Driscoll et al. \cite{dsst} for making
pointer-based data structures fully-persistent. The structure has three problems: 1) each update may cause a new path to be written, giving $\Theta(N B \log_B N)$ space; 2) updates cost $O(\log_{B} N)$ IOs, and 3) it is not cache-oblivious.

Becker \cite{96-becker-mvbt} presented the multiversion B-tree (MVBT), which solves the space blowup problem. It achieves the same query and update bounds with $O(N)$ space, and is partially-persistent. Lanka et al. \cite {115861} developed two fully-persistent B-tree variants based on variants of the techniques from \cite{dsst}, but for both variants, either there is a large space blowup, or range queries may be far from optimal.
Recently, Brodal et al.~\cite{Brodal:fullypersistent} presented a fully-persistent B-tree that uses linear space, and achieves roughly the same update/query bounds (within a small factor) as the MVBT and the CoW B-tree. These results are summarized in Table \ref{tbl:comparison}.

Several solutions are known for offline (or batched) constructions of persistent B-trees. Arge et al. \cite{Arge:2003} use a modified MVBT to solve IO-efficient planar point location. Goodrich et al. \cite{Goodrich:1993} give an offline method for constructing a persistent B-tree using $O((N/B) \log_{M/B} (N/B))$ IOs (where $M$ is the size of the memory in the DAM model). It is not clear if any of the offline constructions can be made cache-oblivious.

Our structure is the first `streaming' persistent index we are aware of, i.e. that supports updates in $o(1)$ IOs and supports efficient range queries.

\begin{table*}
\center
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
\bf Result & \bf Cache-oblivious? & \bf Persistence & \bf Update & \bf Range query (size $Z$) & Space\\
\hline
B-tree \cite{1972-bayer-btree} & No & None & $O(\log_{B} N)$ & $O(\log_{B} N + Z/B)$ & $O(N)$ \\
CoW B-tree \cite{episode,Rodeh:2008} & No & Full & $O(\log_{B} N_{v})$ & $O(\log_{B} N_{v} + Z/B)$ & $O(N B \log_{B} N)$ \\
MVBT \cite{96-becker-mvbt} & No & Partial & $O(\log_{B} N_{v})$ & $O(\log_{B} N_{v} + Z/B)$ & $O(N)$ \\
Lanka et al. \cite{115861} & No & Full & $O(\log_{B} N_{v})$ & $O((\log_{B} N_{v})(1+Z/B))$ & $O(N)$ \\
Brodal et al. \cite{Brodal:fullypersistent} & No & Full & $O^{*}(\log_{B} N_{v} + \log_{2} B)$ & $O(\log_{B} N_{v} + Z/B)$ & $O(N)$ \\
COLA \cite{Bender:2007} & Yes & None & $O^{*}((\log N)/B)$ & $O(\log N + Z/B)$ & $O(N)$ \\
This paper & Yes & Partial & $O^{*}((\log N_{v})/B)$ & $O^{*}(\log N + \log^2 N_{v} + Z/B)$ & $O(N)$ \\
\hline
\end{tabular}
\caption{Comparing related work. Bounds marked $O^{*}(\cdot)$ are amortized, or average-case over operations on a given version. Only the last two structures are `streaming', i.e. support updates in $o(1)$ IOs.}
\label{tbl:comparison}
\end{table*}

Afshani et al. \cite{AHZ.LB.SOCG09} prove that any partially-persistent CO index that answers queries in $O(\log_B N + Z/B)$ IOs must use superlinear space. Our query bound comes close to this, except that the first term in our bound is $O(\log^2 N_v)$, and the bound is an average-case bound, not worst-case. It remains open to improve our query bound to a worst-case one.

\subsection{Our results}

We present a cache-oblivious, partially-persistent structure with the following properties:
\begin{itemize}
\item updates to a leaf version $v$ cost $O(\log N_v / B)$ amortized IOs
\item the structure uses space $O(N)$ for $N$ updates
\item a range query at version $v$ returning $Z$ elements costs $O(\log N + \log^2 N_v + Z/B)$ IOs on average (where the average is taken over queries for disjoint keys at version $v$).
\end{itemize}

In order to achieve these bounds, we must manage a tradeoff between duplicating enough keys so that range queries can be fast, and not duplicating too many so that we can retain fast updates and linear space. A novel part of our construction is a collection of exponentially-growing `versioned' arrays that simultaneously have a lower bound on `density' (the fraction of keys live at some version, see Section \ref{sec:density}) and an upper bound on the number of elements copied from other arrays.

\subsection{Structure of paper}

In Section \ref{sec:structure} we describe the data structure and the auxiliary structures to make it work. In Section \ref{sec:operations} we describe the update and query operations. In Section \ref{sec:analysis}, we prove the update, query and space bounds. We conclude by mentioning some open problems.

\section{The data structure}
\label{sec:structure}

In this section we describe the components of the structure, in order to describe the operations in the next section. At a high level, the structure consists of a collection of versioned arrays (arrays of elements each having a different version set attached to them), organized into levels, where the sizes of arrays roughly doubles between levels. Each level may have many arrays of roughly the same size, but each of them are tagged with disjoint version sets. In this way, a range query only needs to examine one array per level. Arrays are promoted to the next level when they become too large, and roughly speaking, arrays with overlapping version sets in the same level are merged together. In order to maintain the range query performance, we need (as in most of the persistent data structures) to duplicate some elements. We use the notions of live, lead and density to track the number of duplicated elements in arrays. When an array has too many replicated elements, we subdivide it into several smaller arrays, each of which has not too many replicated elements. This way, we control the balance between replicating enough elements for good range query performance and not replicating too much so that we get good update and space bounds. The rest of the section gives the details.

\subsection{Versioned arrays}
Elements are (key, version, value) tuples, which we often write as $(k,v,x)$, and sometimes we omit the value for simplicity. A versioned array $(A,W)$ stores a list of elements $(k,v,x)$ and a set of versions $W$, where every element $(k,v,x)$ is live for some version $w\in W$, and where $W$ is a connected subtree of $V$. Within an array $(A,W)$, elements are ordered lexicographically by $(k,v)$, where keys have some natural ordering and versions are ordered \emph{decreasing} by their DFS number in $W$ (so that each array has its own DFS numbering).

With this structure, we can search within an array as follows. For a key $k$, all the descendants of version $v$ form a contiguous region to the left of $v$ in the array. Hence $\texttt{query}_v(k_1,k_2)$ can be performed by first binary searching for the first element with key $k$ and then scanning to the right for the first element $(k,w,x)$ where $w$ is an ancestor of $v$; whis is the closest ancestor to $v$ for this key. We then continue scanning until we find the next key, until we have covered all keys in the range $[k_1,k_2]$.

There are two concerns with this searching method. First, it might be inefficient if there are lots of irrelevant (non-live) elements for the query version. We will deal with this by requiring that all arrays have some constant density bound, defined below. Second, we need a way to test ancestorship quickly for each element, without doing an IO per element. We use the following (well-known) method. Let $\mathrm{DFS}_W(x)$ be the DFS number of $x$ in the version tree $W$. Then for versions $w,v$, we have $w \preceq v \iff \mathrm{DFS}(v) \in I(w)$. For each element $(k,w)$ in an array $(A,W)$, we store (alongside the element) the interval $$I(w) = [\mathrm{DFS}_W(w), \max_{x \succeq w} \mathrm{DFS}_W(x)].$$  Now, for a query at version $v$ and an array $(A,W)$, if we know $\mathrm{DFS}_W(v)$, we can check ancestorship of elements in $(A,W)$ with no additional IO. Note that we still have to deal with efficiently figuring out $\mathrm{DFS}(v)$ on a query for $v$. For the partially-persistent case, this is straightfoward to encode into the version numbers - version $v_i$ has DFS $i$ if it was the $i$th version created. It is not clear how to do this efficiently for the fully-persistent case.

\subsection{Live, density, lead}
\label{sec:density}

An element $(k,v,x)$ is \emph{live} at $w$ if $(k,v,x) \in D_v$. For an array $(A,W)$, we let $\mathrm{live}(A,w)$ be the number of elements of $A$ live at $w$, and $\mathrm{live}(A,W) = \sum_{w \in W} \mathrm{live}(A,w)$. Array $(A,W)$ has \emph{density} $\delta(A,W) = \min_{w \in W} \mathrm{live}(A,w) /  |A|$.

An element $(k,v,x)$ is \emph{lead} at exactly one version $v$ (so that the lead elements are the `original' elements and the live elements are the `inherited' copies). We define $\mathrm{lead}(A,w)$ and $\mathrm{lead}(A,W)$ similarly to the live quantities. Array $(A,W)$ has \emph{lead fraction} $\sum_{w \in W} \mathrm{lead}(A,w) /  |A|$.

For an array $(A,W)$ and version $v \in W$, let $S(A,v)$ be a subarray containing all the elements of $A$ live at some descendant of $v$ in $W$.

The importance of density is the following. If density is too low, then scanning an array to answer a range query at version $v$ involves reading many elements not live at $v$. If we insist on density being too high, then many elements must be duplicated, leading to a large space blowup (in the limit, each array will contain live elements for a single version, i.e. the dictionaries $D_v$). Our construction guarantees that every array has density at least $1/6$, and almost all arrays have lead fraction at least $1/3$.

\subsection{Levels of arrays}
The data structure consists of a series of exponentially-growing arrays, organized into levels, as in the COLA \cite{Bender:2007}.  Every level $l$ may contain many arrays, where each array $(A,W)$ satisifies:
\begin{enumerate}
\item $|A| \le 2^{l+1}$
\item $\mathrm{live}(A,w) \ge 2^l / 3$, for all $w \in W$
\end{enumerate}
Note that these together imply that every array has density at least $1/6$. In addition, the sets $W_i$ appearing a given level are all disjoint. This means that, for each level, we only need to examine a single array to answer a query.

\subsection{Auxiliary structures}
\label{sec:prelim:aux}
We also keep an auxiliary index for each level that maps from versions to arrays in that level. For each array $(A,W)$ at level $l$, since $W$ is a connected subtree of $V$, we can describe it by storing an interval with its topmost and bottommost versions. Call this the interval for $W$. In every level, we store a COLA \cite{Bender:2007} on these intervals, keyed by the left part of the interval.

A lookup at level $l$ can query this structure in $O(\log N)$ IOs to determine which array to examine. The structure is modified only when some array $(A,W)$ is merged or rewritten at level $l$; in this case, at most $O(|W|)=O(|A|)$ elements may be modified in the structure.

We also store, in a separate structure, for every version $v$, the highest level where there is an element live at $v$. This allows us to only examine the $O(\log N_v)$ levels where there might be an array, instead of checking all the $O(\log N)$ levels.

In Section \ref{sec:faster} we show how to remove the need for a per-level auxiliary structure.

\section{Operations}
\label{sec:operations}

\subsection{Query}
\label{sec:query}

To answer $\texttt{query}_v(k_1,k_2)$, we do the following: for each level $l$, find the unique array $(A_l,W_l)$ that should be examined. As described above, binary search for the first element for key $k_1$ and scan to the right, reporting for each key $k$ in the range, the element for the first version $w$ that is an ancestor of $v$ we encounter. The reports from each level are then merged, and we finally report the closest ancestor version $w$ to $v$ for each key in the range. This final merge can of course be done while scanning each array in parallel so that we don't store the whole intermediate output.

\begin{algorithm}[!h]
\caption{\texttt{query}$_v(k1,k2)$}
\label{alg:query}
\begin{algorithmic}[1]
\FOR {each level $l$}
	\STATE \textbf{let}~ $(A,W)$ be the array with $v \in W_l$
	\STATE binary search for $k_1$ in $A$
	\STATE \textbf{let}~ $S_l = []$
	\FOR {each key $k$ in $[k_1,k_2]$}
		\STATE add to $S_l$ the first element $(k,y)$ where $anc(y,v)$
	\ENDFOR
\ENDFOR
\STATE \textbf{let}~ $S$ = merge$(S_1...S_l)$
\FOR {each key $k$ in $S$}
	\STATE keep only the first element $(k,w,x)$ of $S$ // the closest ancestor to $v$
\ENDFOR
\RETURN $S$
\end{algorithmic}
\end{algorithm}

\subsection{Update}

An update operation $\texttt{update}_v(k,x)$ is the promotion of a singleton array with a new version into level 0, by calling \texttt{promote}$(\{(k,v+1,x)\},v+1,0)$. The \texttt{promote} algorithm is shown in Algorithm \ref{alg:promote}.

\begin{algorithm}[h]
\caption{\texttt{promote}$(A,W,l)$}
\label{alg:promote}
\begin{algorithmic}[1]
\STATE $(B,Y)=$ array at level $l$ where $Y$ has the closest ancestor to $\min(W)$
\STATE $(A',W')=(A \cup B, W \cup Y) = (A \cup B, [\min(Y),\max(W)])$
\STATE register $(A',W')$ at level $l$
\IF {$|A'| > 2^{l+1}$}
	\STATE \textbf{let}~ $(A'',W'') =$ \texttt{extract\_promotable}$(A',W',l)$
	\STATE \texttt{promote}$(A'',W'',l+1)$
	\STATE rewrite the array $(A',W') := (A' \setminus A'', W' \setminus W'')$
\ENDIF
\IF {$\delta(A',W') < 1/6$}
	\STATE \textbf{let}~ ${(A_1,W_1)...(A_k,W_k)}$ = \texttt{subdivide}$(A',W',l)$
	\FOR {each $i$}
		\STATE register $(A_i,W_i)$ at level $l$
	\ENDFOR
	\STATE unregister $(A',W')$ at level $l$
\ENDIF
\end{algorithmic}
\end{algorithm}

We first find the array $(B,Y)$ that the incoming array $(A,W)$ will merge with. We select the array whose version set contains the closest ancestor to $\min(W)$. In line 2, we merge the two arrays to get a new array $(A \cup A', W \cup W')$.

As a result of the merge, the new array may violate the size constraint at level $l$. In this case (lines 4-8), we search for and extract a promotable subarray -- that is, the largest subarray satisfying the conditions to exist at level $l+1$ -- and promote it to level $l+1$, if one exists. The remainder array is left at level $l$. This is shown in Algorithm \ref{alg:extract_promotable}. Note that the $S(\cdot)$ array extracted, if there is one, may contain duplicate

\begin{algorithm}[h]
\caption{\texttt{extract\_promotable}$(A,W,l)$}
\label{alg:extract_promotable}
\begin{algorithmic}[1]
\STATE \textbf{let}~ $v$ be the highest version with $\mathrm{live}(A,v) > 2^{l+1}/3$ and
 $|S(A,v)| > 2^{l+1}$
\RETURN $S(A,v)$, or {\bf null} if no such $v$ exists
\end{algorithmic}
\end{algorithm}

The remainder array may not satisfy all the conditions for level $l$ - there may be a version $v$ that was previously dense in the smaller array pre-merge, but is no longer dense in the larger array post-merge. In this case (lines 9-15), we greedily subdivide the array into a collection of arrays $(A_i,W_i)$, each of which we will show later is dense and satisifes all the constraints for level $l$. The procedure is shown in Algorithm \ref{alg:subdivide}.

\begin{algorithm}[h]
\caption{\texttt{subdivide}$(A,W,l)$}
\label{alg:subdivide}
\begin{algorithmic}[1]
\STATE \textbf{let}~ $C = \{\}$
\STATE \textbf{let}~ $v = \min(W)$
\WHILE {$W \ne \emptyset$}
	\STATE \textbf{assert}~ $v$ is not a leaf
	\STATE \textbf{let}~ $w=child(v)$
	\IF {$|S(A,w)| >= 2^{l+1}$}
		\STATE $w := child(v)$
	\ELSE
		\STATE \textbf{let}~ $X$ be all descendants of $w$ in $W$
		\STATE add $(S(A,w),X)$ to $C$
		\STATE $W := W \setminus X$
		\STATE $v := \min(W)$
	\ENDIF
\ENDWHILE
\RETURN $C$
\end{algorithmic}
\end{algorithm}

Note that after this promotion and subdivision, some elements may be duplicated among arrays - these are the `live' elements kept around to ensure good range query performance.

\begin{comment}
\begin{algorithm}[h]
\caption{\texttt{full-subdivide}$(A,W,l)$}
\label{alg:subdivide}
\begin{algorithmic}[1]
\STATE \textbf{let}~ $v=\mathrm{root}(W)$
\WHILE {$W \ne \emptyset$}
	\STATE \textbf{assert}~ $v$ has a child $w$
	\IF {$|\mathrm{split}(A, w)| \ge 2^{l+1}$}
		\STATE \textbf{let}~ $v := w$
	\ELSE
		\STATE {\bf define} $W[U]$ = descendants of nodes in $U$.
		\STATE output the array $(S(A,w), W[w])$
		\STATE \textbf{let}~ $W := W\setminus W[w]$
		\STATE \textbf{let}~ $v := \mathrm{root}(W)$
	\ENDIF
\ENDWHILE
\RETURN $L$
\end{algorithmic}
\end{algorithm}
\end{comment}

\section{Analysis}
\label{sec:analysis}

\begin{lemma}[Promotion]
\label{lem:promotion}
Consider an array $(A,W)$ promoted from level $l$ to $l+1$. It satisfies (1) $\mathrm{live}(A,v) \ge 2^{l+1}/3$ for all $v \in W$; (2) it contains at least $(2/3) 2^{l+1}$ lead elements; (3) the array has density $\ge 1/6$.
\end{lemma}
\begin{proof}
For readability, we drop the array $A$ in the terms $S(), \mathrm{live}, \mathrm{lead}$ etc. unless we specify otherwise.

Condition (1): follows directly from Algorithm \ref{alg:extract_promotable}.

Condition (2): let $v$ be the highest version where $\mathrm{live}(A,v) > 2^{l+1}/3$ and $|S(A,v)| > 2^{l+1}$. Let $U$ be the set of versions in $W$ descendant from $v$. Since $v$ was the first element that satisfied the promotion critera, we also have (letting $p(v)$ be the parent of $v$) $\mathrm{live}(p(v)) < 2^{l+1}/3$. Considering the elements of $A$ lead at $U$, we have
\begin{eqnarray*}
\mathrm{lead}(U) &=& |S(p(v))| - \mathrm{live}(p(v)) \\
&\ge& |S(v)| - \mathrm{live}(p(v)) \\
&\ge& 2^{l+1} - 2^{l+1}/3\\
&=& (2/3) 2^{l+1}.
\end{eqnarray*}

Condition (3): condition (1) and since the array has size $\ge 2^{l+2}$ imply that the density is at least $1/6$.
\qed
\end{proof}

The main result for subdivision is the following.
\begin{lemma}[Subdivision]
\label{lem:subdivision}
Consider the remainder $(A,W)$ after extracting all subarrays $(A',W')$ having $|A'| \ge 2^{l+1}$ and $\mathrm{live}(A',v) \ge 2^{l+1}/3$ for all $v\in W'$. Algorithm \ref{alg:subdivide} outputs arrays $(A_i, W_i)$ where (1) $|A_i| < 2^{L+1}$; (2) all arrays except at most one have lead fraction at least $2/3$; (3) all arrays have density $\ge 1/6$.
\end{lemma}
\begin{proof}
For readability, we drop the array $A$ in the terms $S(), \mathrm{live}, \mathrm{lead}$ etc. unless we specify otherwise.

Condition (1): follows directly by looking at the algorithm.

Condition (2): from the conditions of the lemma, we have that for all $v\in W$, either $|S(v)| < 2^{l+1}$ or $\mathrm{live}(v) < 2^{l+1}/3$. Let $v$ be the highest version where $|S(v)| < 2^{l+1}$, with parent $p(v))$. Then $|S(p(v))| \ge 2^{l+1}$ and $\mathrm{live}(p(v)) < 2^{l+1}/3$.

Let $U$ be the descendants of $v$ in $W$, then similarly to the proof of Lemma \ref{lem:promotion}, we have$$\mathrm{lead}(U) = |S(p(v))| - \mathrm{live}(p(v)) > (2/3) 2^{l+1}.$$ Since $|S(v)| < 2^{l+1}$ and $\mathrm{lead}(U) > (2/3) 2^{l+1}$, this implies that the array $(S(v),U)$ output has lead fraction at least $2/3$. The preconditions hold after each iteration of the algorithm, since $|S(v)|$ and $\mathrm{live}(v)$ can only decrease by extracting some subarray.

Condition (3): from Lemma \ref{lem:promotion}, all promoted arrays $(A,W)$ satisfy $\mathrm{live}(A,v)>2^l/3$ for all $v\in W$, and the quantity $\mathrm{live}(\cdot)$ only increases down the version tree. Combined with (1), all the output arrays have density $\ge 1/6$.

The only remaining thing that could go wrong is that we hit a leaf node when walking down the tree. We will show that this cannot happen. Assume we reach a leaf $v$. Then $|S(A,v)| \ge 2^{l+1}$ (*). Hence $\mathrm{live}(A,v) < 2^{l+1}/3$ and so $\mathrm{live}(p(v)) < 2^{l+1}/3$. Since $v$ is a leaf, we have $\mathrm{live}(v)=\mathrm{lead}(v)$, so
\begin{eqnarray*}
|S(A,v)| &\le& \mathrm{lead}(A,v) + \mathrm{live}(A,p(v)) \\
&\le& \mathrm{live}(A,v) + \mathrm{live}(A,p(v)) \\
&\le& (2/3) 2^{l+1}.
\end{eqnarray*}
This contradicts (*) above.
\qed
\end{proof}

Together, Lemmas \ref{lem:promotion} and \ref{lem:subdivision} imply that all arrays have density at least $1/6$.

\subsection{Update bound}
Assume we have a memory buffer of size at least $B$. Each array involved in a merge has size at least $B$, so a merge of some number of arrays of total size $k$ elements costs $O(k/B)$ IOs. In the unversioned COLA \cite{Bender:2007}, each element exists in exactly one array and may participate in $O(\log N)$ merges. One difficulty here is that an element may exist in many arrays, and may also participate in many merges at the same level (e.g., when an array at level $l$ is subdivided and some subarrays repeatedly remain at level $l$). We shall prove the result using an accounting argument by charging a merge to the lead elements in the promoted array that triggered the merge.

\begin{theorem}
\label{thm:update1}
The operation $\texttt{update}_v(\cdot)$ costs amortized $O((\log N \log N_v) / B)$ cache-oblivious IOs
\end{theorem}
\begin{proof}
Assume that each IO costs $\$1$ and can read/write a block of $B$ elements. When $(A,W)$ is promoted, all its lead elements are given credit $\$c/B$, for some constant $c>0$. We will show that a $c$ exists so that the lead elements of $(A,W)$ can pay for all the IOs triggered at this level by the promotion of $(A,W)$ (this will be enough for an inductive argument).

By Lemma \ref{lem:subdivision}, every output array $(A_i,W_i)$ has lead fraction $\ge 1/3$ except at most one array that has size $\le 2^{l+1}$. So the total output size is at most
\begin{eqnarray*}
&& 3 \sum_i \mathrm{lead}(A_i,W_i) + 2^{l+1} \\
&\le & 6 . \mathrm{lead}(A,W) + 2^{l+1} \\
&\le & 6 |A| + 2^{l+1}\\
&\le & 7.2^{l+1} \\
\end{eqnarray*}
where the second line follows since every lead element in $(A,W)$ ends up in exactly one output array $(A_i,W_i$). By Lemma \ref{lem:promotion}, $(A,W)$ has at least $(2/3) 2^l$ lead elements. Therefore, choosing $c>21$ suffices.

Since every array has density $\ge 1/6$, any array $(A,W)$ with $v \in W$ has size at most $6 N_v$, so it cannot exist in a level higher than $6 \lceil \log n \rceil$. Hence each inserted element will be charged in total at most $\$O(c (\log N_v)/B)$.

We now need to account for updating the per-level auxiliary structures as described in \ref{sec:prelim:aux}, which will contribute an additional $O(\log N / B)$ factor per update. When an array $(A,W)$ is promoted into a level, at most $O(|W|)=O(|A|)$ update operations are made on the auxiliary structure (noting that we do not need to perform any reads, just updates, which may overwrite existing elements), which adds a total of $O((|A| \log N)/ B)$ IOs for each level.
\qed
\end{proof}

\subsection{Space bound}

\begin{theorem}
\label{thm:space}
The data structure requires space $O(N)$.
\end{theorem}
\begin{proof}
The proof of the update bound showed that whenever an array containing $k$ lead elements is promoted, at most $O(k)$ space is used. Each lead element gets promoted at most once per level, and the number of lead elements per array doubles between successive
promotions. Thus the total space used for arrays at levels $l>0$
is $O(\sum_{i>0} N/2^i) = O(N)$. \qed
\end{proof}

\subsection{Query bound}

To answer a query $\texttt{query}_v(k_1,k_2)$, we find at each level $l$ a unique array $(A,W)$ as described in \ref{sec:query}, binary search to find the right starting position, then merge the relevant portions of these arrays, only reporting the elements with version being the closest ancestor to $v$. If a key has elements $E$ in multiple arrays, we first discard any versions that have descendant elements in $E$, and break remaining ties (if any) by taking element in the lowest-level array.

Since all arrays have density $\ge 1/6$, this immediately guarantees that `voluminous queries' (that report a constant fraction of all elements live at version $v$) are asymptotically optimal - they perform $O(N_v / B)$ IOs. A small range query may be forced to scan a large part of an array, but we will show that the average cost, taken over all disjoint key ranges, will be efficient. Equivalently, a random key range will be efficient in expectation.

\begin{lemma}
\label{lem:query}
Consider querying an array $(A,W)$ for a version $v \in W$. The average cost of a range query that returns $Z$ elements is $O(\log N_v + Z/B)$ IOs, where the average is taken over all disjoint keys from $A$ that are live at $v$.
\end{lemma}
\begin{proof}
Let $\Sigma = (x_1, y_1), (x_2, y_2), \ldots$ be a set of key-disjoint ranges. For a range $\sigma \in \Sigma$,
let $f_v(A,\sigma)$ be the number of IOs used in examining elements in $A$ for the query $\texttt{query}_v(\sigma)$.
Since the elements of $A$ are ordered lexicographically by $(k,v)$, the regions of $A$
examined by each key range $\sigma$ are disjoint, hence $\sum_{\sigma} f_v(A,\sigma) \le |A|$.
By density, we have $|A| \le 6 .\mathrm{live}(A,v)$, so the total cost is bounded by $O(\mathrm{live}(A,v)) = O(N_v)$. All the reported keys are live, and disjoint, so the average bound follows, with the $O(\log N_v)$ term from binary searching for the first element to scan.
\qed
\end{proof}

\begin{theorem}
\label{thm:query1}
The average cost of a query for version $v$ returning $Z$ keys is $O(\log N \log^2 N_v + \log N + Z/B)$ IOs, where the average is as in Lemma \ref{lem:query}.
\end{theorem}
\begin{proof}
For each level, we query an auxiliary search structure of size $O(N)$ to determine which array to examine at that level, which costs $O(\log N)$. It costs $O(\log N_v)$ to binary search each array, and there are at most $O(\log N_v)$ arrays that need to be examined, at most one per level. This gives the first term.
Let $A_l$ be the unique array examined at level $l$. Summing Lemma \ref{lem:query} over all such arrays, the total number of elements examined is
$$\sum_{\sigma} \sum_{l=0}^{O(\log N_v)} f_v(A_l,\sigma) \le \sum_{l=0}^{O(\log N_v)}{|A_l|} = O(N_v).$$
So on average over all key-disjoint queries covering live elements for version $v$, a query reporting $Z$ keys touches $O(Z)$ elements over all arrays it examines.
\qed
\end{proof}

\subsection{Faster queries and updates}
\label{sec:faster}

We can improve the bounds by removing the need for the auxiliary structures described in \ref{sec:prelim:aux}. We do this by exploiting some more structure between the arrays in various levels.

The idea is to define, for every array $(A,W)$, a unique successor array $\mathrm{succ}(A,W)$ in the next level, so that after we have queried $(A,W)$, we examine the successor pointer and query $\mathrm{succ}(A,W)$. Of course, the lowest level may contain as many arrays as versions, so that we will still need to do a search to find the appropriate starting array in level 0.

Consider some version $w$. When an array $(A,W)$ with $w \in W$ is promoted from level $l$ to $l+1$, it contains a copy of all the live elements at $w$ that are in some array $(A',W')$ at level $l$. Later, when a new array with a version $w$ is promoted into level $l$, the merge procedure from Algorithm \ref{alg:promote} will merge it with the array $(A',W')$. Of course, this is not a problem from a correctness perspective, but it means that we cannot define a unique successor array; many such arrays may merge into a single array at some intermediate level and be promoted.

 The crucial thing to note is that the arrays in higher levels already have all the required live elements to answer a query correctly. The following definition captures when an array already exists for that version at a higher level.

{\bf Definition:} For a version $w$, let $\mathrm{level}(w)$ be the lowest level that contains an array $(A,W)$ with $w \in W$. For an array $(A,W)$ at level $l$, let $\mathrm{floor}_l(W)$ be the closest ancestor $w$ to $\mathrm{root}(W)$ such that $\mathrm{level}(w) > l$. Note that $\mathrm{floor}_l(W)$ may not exist if $(A,W)$ is the highest such array; in this case we let $\mathrm{floor}_l(W) = \mathrm{null}$.

We modify the merge procedure as follows: when promoting from level $l$ to $l+1$, merge $(A,W)$ with the unique array $(A',W')$ where $\mathrm{floor}_l(W) \in W'$. If no such array exists (or if $\mathrm{floor}_l(W)$ is null) then leave $(A,W)$ in place (in level $l+1$). For an array $(A,W)$ in level $l$, let $\mathrm{succ}(A,W)$ be the unique array in level $l+1$ that $(A,W)$ would merge with in this way. We can arrange it so that $\mathrm{succ}(\cdot)$ always exists, by leaving `dummy' arrays in a level after an array has been promoted out of that level. If $(A,W)$ is the highest such array, then we let $\mathrm{succ}(A,W)=\mathrm{null}$ so that we know when to terminate the search.

The successor pointers eliminates the need to query the auxiliary structure once per level, and improves updates by avoiding having to write out all the new $W$ entries when an array $(A,W)$ is promoted. This gives the following result.

\begin{theorem}
With successor pointers, the average cost of a query for version $v$ returning $Z$ keys is $O(\log N + \log^2 N_v + Z/B)$ IOs, where the average is as in Lemma \ref{lem:query}. The amortized update cost at version $v$ is $O((\log N_v)/B)$ IOs, where the amortization is as in Theorem \ref{thm:update1}.
\end{theorem}

\section{Open problems}

The lower bound of Afshani et al. \cite{AHZ.LB.SOCG09} does not preclude achieving a worst-case query bound of $O(log N_{v} + Z/B)$ IOs. It would be interesting to try to achieve this bound, or at least to make the bound we achieve here a worst-case one. The notion of density seems too weak to achieve this, as it only considers whole arrays. We have tried to extend it to a more `local' notion, but without much success.

Another open problem is to make our results fully persistent. The subdivision procedure can be extended without much difficulty to the fully-persistent case (by considering subsets of child subtrees to include in the output arrays), but the limiting factor is currently that we do not know how to efficiently maintain the DFS numbers for the version tree with $o(1)$ IOs per update and query cost $O(\log N)$ IOs; in the partially-persistent case this is not a problem since we can use the creation order of versions. Indeed, being able to solve the closely-related problem of maintaining the subtree sizes of a tree subject to inserts only, with the same update/query bounds, also appears to be a challenging problem.

\bibliographystyle{plain}

redpajama_set_name: RedPajamaArXiv


text:
The Park at the Chateau de Kistinic by Drone
By FrenchberryApril 12, 2017April 26th, 2017Brittany, Luxury Houses in Brittany
The chateau de Kistinic filmed by Drone
The parc of the Chateau de Kistinic (meaning horse chestnut in Breton) dates back many hundreds of years.
The domaine of Kistinic was originally over three times the size of our piece of land (approximately 53 hectares) and makes up one of the largest protected green spaces of Quimper. It was split up into three parcels in 1999. The original 'manoir' can just be seen quite close to our chateau. This manoir dates back to the 15th century (1426) and is no longer inhabited – the owner just likes to enjoy his land.
Our parcel comprises the chateau and the gatehouse. It is 15 hectares or roughly 37 acres, split half lawn, half woodland with banks for camelias, azaleas and rhododendrans.
The chateau de Kistinic dates from 1874 and was built by a French lawyer, it took about 14 years to complete and is build from granite and stone. The grounds were planted at about the same time, and you can still see the original rhodedendrons and camelias, some of which are over 150 years old and very large.
The parc makes the most of it's natural water sources, of which there are at least four. The chateau has its' own well – until recently all our water came from it and it is very pure (now we switch between it and the mains water system). The Source de St. Anne is the next one down with it's own pool, also with very pure water; you can in fact swim in this pool (just!) but it is always very….refreshing!! We have recently uncovered another hidden lavoir, which has been buried by the laurel for years, this one seems to be much older than the others and the next project is restoring this and bringing it back to life. Next down the path is the Source de St. Joseph which also needs some work – this area was overgrown with Japanese Knotweed, but we seem to have beaten it. Somewhat hidden near the bottom is another unexploited source. All this water ends up in the River Steir, which you can see from the very bottom of the parc, the other side of the road. This river goes through Quimper, where it joins the River Odet, claimed as one of the most beautiful rivers in france and which meanders past chateau the ocean at Benodet.
During the Second World War the chateau was occupied by German officers who used it as their headquarters. Fortunately Quimper escaped any bombing or fighting as it had little strategic interest to either side (unlike Brest and Lorient).
Further planting and landscaping was done by the Bernards (no relation!) in the 1950's – most of the stone features and some trees were installed at this time.
The woodland is protected and has many fine example of mature tree species. The parc suffered greatly in the hurricane of 1987 – many great trees were lost and some of the stumps can still be seen. Again this year hurricaine Zeus hit the park and we lost 23 big trees. Fortunately it was mainly pines and there are still many of the finest species which include Beech, chestnuts, oak, cedar, tulip and sequoia trees standing.
In 2000 a Parisian family acquired Kistinic and spent nearly four years renovating the chateau.
In 2004 we moved in and installed the swimming pool and started to get the parc back to it's former glory, as the grounds had been neglected for many years. Above all, laurel, laurier palme, had been allowed to run wild and it has overtaken most of the woodland. It grows extremely fast and is very resilient; it shades out everything beneath it and makes trees top heavy by killing off their lower branches. This then makes the trees prone to blow over.
We are slowly removing the laurel from various areas to return the woodland to it's natural state and allow us to walk amongst the trees, but it is a slow process!
The parc is home to many animals such as foxes, owls, falcons, badgers, rabbits and deer. The deer can often be seen grazing on the lawns.
We sincerely hope that you enjoy the parc as much as we do; April and May are the most spectacular months, as the camellias, rhodendrons, azaleas, and magnolias are all in flower.
Azaleas in Spring
Guests at The Gatehouse are free to explore the woodland paths and lawns and wherever they want.

redpajama_set_name: RedPajamaCommonCrawl


you should be allowed to read and see.
 > You said it in your first sentence, JJ. "Wal-Mart is OWNED BY" someone.
 > police force and military that defends an American's right to do so.
 Dead on, even if you didn't notice yourselves.
determine what does and does not go into their stores. Don't like it?
The damn thing just won't die, will it!?!
> How can anything with "Butts" in the title die?
I think You need Andy to start conversation about butts again ?
> > How can anything with "Butts" in the title die?
> > He said... Butts!
closer to the original feel of the thread.
Quark Converted Doc wont print linked eps files.


text:
Avengers, Doom and COD: Modern Warfare all playable at EGX this year
London calling.
Blog by	Oli Welsh, Editor
Updated on 2 October 2019
Hello! Normally we'd all be over our EGX hangovers and recovering from our show bugs around now, but thanks to the UK's biggest gaming expo's move from Birmingham to London and from September to October, it's still two weeks away. Feels weird, man.
(Disclaimer: EGX is run by our parent company, Gamer Network. And it used to be called the Eurogamer Expo. So, you know, we're biased.)
Anyway, the announcements of playable games are starting to pop up, and leading the pack so far is the first UK hands-on for Marvel's Avengers, Crystal Dynamics' take on the ubiquitous superhero team. Virgin Media will be hosting the Square Enix game on its stand, along with costumes and props, and there'll be an appearance from studio head Scot Amos in the EGX Theatre. Marvel's Avengers is out on 15th May 2020.
Bethesda is bringing Doom Eternal, the incoming sequel to the brilliant 2016 reboot of the iconic first-person shooter. As well as hands-on demos on Bethesda's stand, there'll be a silly, fun Doom panel session hosted by friend of Eurogamer and "self-confessed video games idiot" Simon Miller on the Friday at 6pm and a community quiz at noon on the Saturday, both in the EGX Theatre.
Hot off the press: PlayStation's stand will have Call of Duty: Modern Warfare playable, with several other very exciting games to be announced soon - watch this space. Nioh 2, sequel to the formidable Team Ninja samurai combat game, will be worth tracking down there - and although it won't be playable, the Death Stranding Experience is sure to be... an experience.
What else? Nintendo's stand will have Pokémon Sword & Shield and Luigi's Mansion 3 playable, as well as the Splatoon 2 UK Championship.
Of course, notwithstanding the move from Birmingham's NEC to London's ExCeL, EGX will have the full, familiar line-up of attractions this year: the massive Rezzed Zone for indies, the Leftfield Collection for the truly weirdest and wildest creations, esports in the EGX Arena, meet & greets (including with the Eurogamer video team) and panels and talks in the Fringe Theatre, Rezzed Sessions and EGX Theatre. As well as Doom and Avengers, EGX Theatre sessions include a talk from the developers of the Battletoads reboot and Digital Foundry on how to build a next-gen console spec PC.
EGX runs from 17th to 20th October at the ExCeL in London's Docklands. The full guide to what's on can be found over at the EGX website. Tickets are available for all days, too.
More about The Avengers Project
Oli Welsh
Oli is the editor of Eurogamer.net and likes to take things one word at a time. His friends call him The European, but that's just a coincidence. He's still playing Diablo 3.


Notaries' responsibilities are quite complex in nature. While providing legal advice and educating their client about the legal consequences of their situation, the notary should be practising preventive measures to keep complications from happening. Respect to individuals shall be observed at all times. Notariats serves as delegates of the State and carries out their duties fully regarding the law. When you are in need of legal advise, don't hesitate to visit the telfort glasvezel postcode check is so easy to get and find a reputable notary you could go to. You may check their website if there are forms that you need to fill out. Notaries should give their best efforts in resolving issues with their client that might affect him or her legally. Despite the complexity of the responsibilities of notaries, the goal should always be focused on individuals in need of justice. Notaries should be cooperative and ready to serve.
The law is for everyone. It does not discriminate any citizens regardless of their age, gender, and colour. Service should be provided to individuals in need of legal assistance. Citizens are free to choose any notary service. A notary service should at all times provide the service to individuals except if the request might lead to violating the law. Our nation has been fighting for equality and fairness. Despite the challenges coming our way to achieving it, notaries are doing their best to implement these values in their organization. Pre-owned items are cheapest with bol kortingscode gratis verzending. As citizens, we should work with law enforcement to achieve equality and fairness. All business types including boat rental Amsterdam should be attended to and legal advice should be given without any spot of discrimination.
Notaries provide assurance to clients that their legal needs will be taken cared of. Notaries are decision-makers and provide ironclad documentation of the legal requests while ensuring the authenticity of the paper works. Notaries give you an assurance that they are fair in dealing with your legal concern. Even you go for black friday phone deals, you cannot find anything more valuable than the service notaries give. In return, listen attentively and understand their recommendations toward the issue. All the documentation processes are necessary to protect legal seekers against disputes, complaints, and possible legal questioning. These legal documents cannot be opposed to or challenged except during judicial proceedings. Every detail should be scrutinized. For example, an online company giving out offers & coupons to increase their sale should carefully state all the details of the offer. They should also protect themselves by creating notarized terms of service.
Any immoral, illegal, and injustice should be invalidated by notaries. Participating in any of these activities are subject to the law. In settlement agreements, all parties involved should give reasonable request. They should also provide valid reasons and evidence as to why the request is fair. Notaries shall be the moderator without prejudice. In providing legal services to businesses, notaries can never allow any activities that may violate consumer rights. For other services such as real state estate transactions and wills, notaries need to ensure that there is transparency. These requests should regard the law in terms of paying taxes and complete transparency of the parties involved their ownership and authority.
The law is clear and concise. Every word holds meaning and weight. Notaries should never neglect any aspect of the law. Doing so may lead to questioning and complications. Notaries do take extra measures to verify the opt for glasvezel almere providers vergelijken. They ensure that there are no mistakes and every contract are written in great detail without any loopholes that may invalidate it in the future. Make sure are availing services from certified and authorized notaries only. Underwriters should triple check every document and should be scanned by a lawyer. Any spot of mistake should be corrected prior to filing. Notary services are meticulous in nature. The work is full of detailed texts and references so only qualified professionals should execute the process and procedure.


text:
Pussy Riot call for extra EU sanctions on Putin
Alyokhina (r) and Tolokonnikova: celebrities in Brussels, 'witches' in Russia (Photo: europarl.europa.eu)
Two activists from the Pussy Riot punk group have urged EU politicians to heap sanctions on Russia's elite to accelerate Vladimir Putin's fall from power.
Twenty-five-year old Masha Alyokhina and 24-year-old Nadya Tolokonnikova told MEPs in Brussels on Tuesday (1 April) that EU blacklists will erode support in the President's inner circle and boost opposition morale.
They said Europe should target four men: oligarch Roman Abramovich, who owns British football club Chelsea; Prime Minister Dmitry Medvedev; oil baron and Putin confidante Igor Sechin; and oligarch Viktor Vekselberg.
The Pussy Riot activists were recently freed after almost two years in labour camps.
They have launched an NGO, called Zona Prava, to campaign for prisoners' rights, and are touring European and US cities in search of financial and political backing.
They want an end to forced labour; better access to healthcare; and foreign training for prison guards.
Asked by EUobserver if there is a chance for human rights to improve while Putin stays in charge, Tolokonnikova said: "No. He has created a system in which anybody who calls for changes, no matter how small, becomes an enemy of the state."
She noted that Putin is likely to become "more cruel" if he is isolated, but believes Russian society will turn against him as the economy deteriorates.
"It is not true that Russians don't want change. Russian people want to be free," she said.
Her husband, Pyotr Verzilov, noted that 50,000 people protested against Russia's invasion of Crimea: "The situation is unpredictable. Fifty thousand can quickly become 100,000, or 500,000. If you have 1 million people on the streets of the capital, then you no longer control the country."
Alyokhina and Tolokonnikova were jailed for performing a protest song on a church altar.
They have become celebrities in the West - some MEPs and EU officials crowded round them to take selfies on Tuesday. But conservative Russians do not sympathise with their actions.
"They call us witches and they say we should be burned," Tolokonnikova said.
Alyokhina noted: "In Russia, women are supposed to stay home, to look after their men, and to keep quiet. So we are inappropriate women." She added they could be re-arrested "at any moment," but said they will not change their provocative tactics: "We try to be 'serious.' But we can't do it."
Their call for extra sanctions comes after EU states blacklisted 33 Russians and Crimeans over Putin's invasion of Crimea.
MEPs will on Wednesday also vote on a list of 32 Russians said to have played a role in the death of anti-corruption activist Sergei Magnitsky.
The European Parliament list is not legally binding. But campaigners aim to send it to EU countries' consulates in Moscow in the hope the political stigma will see them quietly decline visas.
A senior EU diplomat said if Russia invades mainland Ukraine, EU countries will blacklist more senior Kremlin officials.
But he said there is no appetite in the EU Council to impose sanctions for the sake of human rights or political reform.
"If Russia de-escalates the situation in Ukraine, I see a lot of eagerness to return to business as usual … European companies have big interests in Russia. It is one of the EU's main energy suppliers," he noted, with the existing list-of-33 set to expire in six months' time.
He added that Pussy Riot and other activists have a long way to go stimulate change.
"What we saw is that when Putin annexed Crimea his approval ratings actually went up to over 70 percent," he said.
EU and US pledge solidarity in face of Russia
Pussy Riot: Magnitsky 'not an isolated case' in Putin's jails
Putin and Merkel clash over 'anti-Semitic ' Pussy Riot
Obama and top EU officials have described America and Europe as a fortress of justice, but indicated Ukraine is on the other side of the wall.
Two Russian punk singers have rubbished President Putin's amnesty law and said prison conditions are as inhumane as they were for Sergei Magnitsky, who died in jail in 2009.
German Chancellor Merkel has confronted Russian leader Putin on human rights while visiting Moscow.
EU should stop sheltering Syrian war criminals, MEPs say
The European Parliament has urged EU states to go after alleged Syrian war criminals in Europe, 10 years after the start of the bloodiest war in its neighbourhood.
China and Russia top EU list of global rights abusers
China, Eritrea, Libya, North Korea, Russia, and South Sudan are to be stigmatised as the world's worst human-rights abusers under new EU sanctions.
How Left and Right divide - then unite - on EU arms deals
Leftwing MEPs tend to table amendments that seek to save jobs should arms producers have to stop exports to war zones, while rightwing counterparts try to weaken any hardline restrictions.
Why Russia politics threaten European security
Russia could expand hostile operations, such as poisonings, including beyond its borders, if it feels an "existential" threat and there is no European pushback.
Ten years on from Tahrir: EU's massive missed opportunity
Investing in the Arab world, in a smart way, is also investing in the European Union's future itself. Let's hope that the disasters of the last decade help to shape the neighbourhood policy of the next 10 years.


This is one of four glazed terracotta roundels of the Evangelists, as well as a frieze, that Andrea della Robbia created for Santa Maria delle Carceri in Prato, which was designed by Giuliano da Sangallo at the behest of Lorenzo de' Medici. The roundels are documented to have been installed by Andrea and his assistants in 1491. The sharp folds of the drapery and wiry curls of hair echo the work of such Florentine painters as Filippino Lippi. The evangelist sits on a cloud, as does his helpful eagle -- no mere symbol, but an assistant, who uses his talons to hold his inkpot, while John writes in another. Photograph(s) licensed under a Creative Commons Attribution 4.0 International License.


text:
// Copyright (c) 2017, 2020-2021 Ubisoft Entertainment
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System.Collections.Generic;
using NUnit.Framework;

namespace Sharpmake.UnitTests
{
    public class ResolverTest
    {
        [Resolver.Resolvable]
        private class FieldClass
        {
            public bool Bool;
            public int Int;
            public string String;
            public readonly string ReadOnlyString = "[p1.String]";
            public FieldClass RecursionObject;
            public readonly object NullObject = null;

            public override string ToString()
            {
                return "FieldClass";
            }
        }

        [Resolver.Resolvable]
        private class PropertyClass
        {
            public string Value1 { get; set; }
            public string Value2 { get; set; }
            public string Value3 { get; set; }

            public override string ToString()
            {
                return "PropertyClass";
            }
        }

        [Resolver.Resolvable]
        private class ListClass
        {
            public string Value { get; set; }
            public Strings FieldListString = new Strings();

            private Strings _propertyListString = new Strings();
            public Strings PropertyListString
            {
                get { return _propertyListString; }
            }

            public override string ToString()
            {
                return "ListClass";
            }
        }

        [Resolver.Resolvable]
        private class ObjectClass
        {
            public object ChildObject;
            public string StringValue1;
            public string StringValue2;
        }

        [Resolver.Resolvable]
        private class DictionaryClass
        {
            public Dictionary<string, string> Dictionary = new Dictionary<string, string>();
        }

        [Test]
        public void CanResolveAFieldClass()
        {
            Resolver resolver = new Resolver();
            FieldClass obj = new FieldClass();
            resolver.Resolve(obj);
        }

        [Test]
        public void CanResolveWithRecursionObject()
        {
            Resolver resolver = new Resolver();
            FieldClass obj = new FieldClass();
            obj.RecursionObject = obj;
            resolver.Resolve(obj);
        }

        [Test]
        public void CanResolveFieldsWithDifferentTypes()
        {
            var obj = new FieldClass { Bool = false, Int = 12345678 };

            var resolver = new Resolver();
            resolver.SetParameter("p1", obj);

            obj.String = "[p1.Bool] - [p1.Int]";
            resolver.Resolve(obj);
            Assert.That(obj.String, Is.EqualTo("False - 12345678"));

            // Must pass a new object. Resolver doesn't resolve same objects twice.
            obj = new FieldClass();
            obj.String = "[p1]";
            resolver.Resolve(obj);
            Assert.That(obj.String, Is.EqualTo("FieldClass"));

            obj = new FieldClass();
            obj.String = "[p1.NullObject]";
            Assert.Throws<Error>(() => resolver.Resolve(obj));
        }

        [Test]
        public void DoesNotResolveAReadOnlyField()
        {
            var obj = new FieldClass();
            obj.String = "String";

            var resolver = new Resolver();
            resolver.SetParameter("p1", obj);
            resolver.Resolve(obj);

            Assert.That(obj.ReadOnlyString, Is.EqualTo("[p1.String]"));
        }

        [Test]
        public void ReplacesValuesOnDependentFields()
        {
            var obj = new PropertyClass();
            obj.Value1 = "* [obj] *";
            obj.Value2 = "** [obj.Value1] **";
            obj.Value3 = "*** [obj.Value2] ***";

            var resolver = new Resolver();
            resolver.SetParameter("obj", obj);
            resolver.Resolve(obj);

            Assert.That(obj.Value1, Is.EqualTo("* PropertyClass *"));
            Assert.That(obj.Value2, Is.EqualTo("** * PropertyClass * **"));
            Assert.That(obj.Value3, Is.EqualTo("*** ** * PropertyClass * ** ***"));
        }

        // Property Test
        [Test]
        public void CanResolveInsideContainers()
        {
            var obj = new ListClass { Value = "'come get some'" };

            obj.FieldListString.Add("* [obj.Value] *");
            obj.FieldListString.Add("- [obj.Value] - [obj.Value] -");
            obj.FieldListString.Add("+ [obj.Value] + [obj.Value] + [obj.Value] +");

            obj.PropertyListString.Add("* [obj.Value] *");
            obj.PropertyListString.Add("- [obj.Value] - [obj.Value] -");
            obj.PropertyListString.Add("+ [obj.Value] + [obj.Value] + [obj.Value] +");

            var resolver = new Resolver();
            resolver.SetParameter("obj", obj);
            resolver.Resolve(obj);

            Assert.That(obj.FieldListString.Values[0], Is.EqualTo("* 'come get some' *"));
            Assert.That(obj.FieldListString.Values[1], Is.EqualTo("- 'come get some' - 'come get some' -"));
            Assert.That(obj.FieldListString.Values[2], Is.EqualTo("+ 'come get some' + 'come get some' + 'come get some' +"));

            Assert.That(obj.PropertyListString.Values[0], Is.EqualTo("* 'come get some' *"));
            Assert.That(obj.PropertyListString.Values[1], Is.EqualTo("- 'come get some' - 'come get some' -"));
            Assert.That(obj.PropertyListString.Values[2], Is.EqualTo("+ 'come get some' + 'come get some' + 'come get some' +"));
        }

        [Test]
        public void CanResolveAcrossDifferentParameters()
        {
            var root = new ObjectClass();
            var child = new ObjectClass();
            var grandChild = new ObjectClass();

            root.StringValue1 = "RootStringValue1";
            root.StringValue2 = "[child.StringValue1]";

            child.StringValue1 = "ChildStringValue1";
            child.StringValue2 = "[root.StringValue1]";

            grandChild.StringValue1 = "[root.StringValue1] [child.StringValue1]";
            grandChild.StringValue2 = "[root.ChildObject.StringValue1] [root.ChildObject.StringValue2]";

            root.ChildObject = child;
            child.ChildObject = grandChild;

            var resolver = new Resolver();
            resolver.SetParameter("root", root);
            resolver.SetParameter("child", child);

            resolver.Resolve(root);

            Assert.That(root.StringValue1, Is.EqualTo("RootStringValue1"));
            Assert.That(root.StringValue2, Is.EqualTo("ChildStringValue1"));

            Assert.That(child.StringValue1, Is.EqualTo("ChildStringValue1"));
            Assert.That(child.StringValue2, Is.EqualTo("RootStringValue1"));

            Assert.That(grandChild.StringValue1, Is.EqualTo("RootStringValue1 ChildStringValue1"));
            Assert.That(grandChild.StringValue2, Is.EqualTo("ChildStringValue1 RootStringValue1"));
        }

        // Map Test
        [Test]
        public void CanAccessDictionnaryKeysAsProperties()
        {
            var dict = new DictionaryClass();
            dict.Dictionary["element"] = "yeah";

            var dictionary = new Dictionary<string, int>();
            dictionary["one"] = 1;
            dictionary["two"] = 2;
            dictionary["three"] = 3;
            dictionary["four"] = 4;

            var resolver = new Resolver();
            resolver.SetParameter("i", dictionary);
            resolver.SetParameter("dict", dict);

            var result = resolver.Resolve("-> [dict.Dictionary.element] [i.one] [i.two] [i.three] [i.four] <-");

            Assert.That(result, Is.EqualTo("-> yeah 1 2 3 4 <-"));
        }

        private class Test9Foo
        {
            public int Value = 1;
        }

        [Test]
        public void CanResolveASimpleString()
        {
            var foo = new Test9Foo();
            const string str = "foo.Value = [foo.Value]";

            var resolver = new Resolver();
            resolver.SetParameter("foo", foo);

            Assert.That(resolver.Resolve(str), Is.EqualTo("foo.Value = 1"));
        }

        [Test]
        public void CanResolveStrings()
        {
            var resolver = new Resolver();

            var list = new Strings { Separator = "\r\n" };
            list.Add("a");
            list.Add("c");
            list.Add("b");

            resolver.SetParameter("list", list);

            // Please note that the list is sorted before being printed
            Assert.That(resolver.Resolve("[list]"), Is.EqualTo("a\r\nb\r\nc"));

            var list2 = new Strings();
            list2.Separator = ";";
            list2.Add("animal");
            list2.Add("copper");
            list2.Add("brute");

            // We replace previous list
            resolver.SetParameter("list", list2);

            Assert.That(resolver.Resolve("[list]"), Is.EqualTo("animal;brute;copper"));
        }

        [Test]
        public void CanResolveStringsToLower()
        {
            var obj = new PropertyClass();
            obj.Value1 = "[obj]";
            obj.Value2 = "[lower:obj]";
            obj.Value3 = "[lower:obj.Value1]";

            var resolver = new Resolver();
            resolver.SetParameter("obj", obj);
            resolver.Resolve(obj);

            Assert.That(obj.Value1, Is.EqualTo("PropertyClass"));
            Assert.That(obj.Value2, Is.EqualTo("propertyclass"));
            Assert.That(obj.Value3, Is.EqualTo("propertyclass"));
        }
    }
}

redpajama_set_name: RedPajamaGithub


As a symbol of expansion and growth, our fabulous Sterling Silver Vine Leaf Necklace is the perfect choice when you prepare to fearlessly step out of your comfort zone and try something new. Attract new connections with this handmade exquisite silver piece.
Pendant size 2.6 x 4.5 cm / 1 x 1.8 inch. Sterling silver (nickel free).


text:
Sen. Ed Durr slammed the proposed route for the Glassboro-Camden Line, calling the commuter rail project in its current form a patchwork approach that will divide smaller towns, increase traffic, and endanger the safety of residents.
Contact: Jonathan Azzara / (609) 847-3600
Durr: Proposed Route for Glassboro-Camden Line is a Patchwork Approach to South Jersey Rail Service
Senator Edward Durr slammed the proposed route for the Glassboro-Camden Line, calling the 18-mile commuter rail project in its current form a patchwork approach that will divide smaller towns, increase traffic, and endanger the safety of residents.
Sen. Ed Durr slammed the proposed route for the Glassboro-Camden Line, calling the commuter rail project in its current form a patchwork approach that will divide smaller towns, increase traffic, and endanger the safety of residents. (Pixabay)
"I do not oppose a new rail system to help commuters and residents, but the current route being put forward for the Glassboro-Camden rail line will hurt more than it will help South Jersey," said Durr (R-3). "This project has been in the works on and off since the 1990s, and at one point, was planned to run on the Route 55 median—which was, and still is, a sensible solution because it would not impact smaller towns. The route that is being suggested now cuts directly through the heart of 12 different municipalities with little regard for traffic, parking, and noise from a diesel-electric train running every 10 minutes."
The Glassboro-Camden Line is a proposed 18-mile passenger rail line that would start at Walter Rand Transportation Center in Camden and travel 18 miles south to Glassboro with 12 other stops in between, including Gloucester City, Woodbury, and Pitman.
In January 2008, a route was proposed that would run the rail along Route 55 and join the existing PATCO line. The route was favored by many because it would not impact smaller towns and would resolve eminent domain issues, traffic concerns, and resident safety.
"All parties should come together to find a reasonable solution and present it to the people before moving forward," added Durr. "This is an extremely important issue that will impact every town between Camden and Glassboro. It should not be decided by corporations and faceless bureaucrats."
A rail line between Camden and Glassboro was first suggested in 1996 as part of a larger study on how to expand mass transit options in South Jersey. The project has undergone many iterations since that time.
https://www.senatenj.com/index.php/durr/durr-proposed-route-for-glassboro-camden-line-is-a-patchwork-approach-to-south-jersey-rail-service/58972


text:
First Opinion
The Pharmalot View
Adam's Take
STAT Summit
STAT Expert Advantage
Try STAT Plus
For every 69 high-dose opioid prescriptions, U.S. pharmacies dispensed only one overdose-reversal drug
By Andrew Joseph @DrewQJoseph
Dr. Nora Volkow, director of the National Institute on Drug Abuse, holds up a Narcan nasal spray during a 2017 congressional hearing on federal efforts to combat the opioid crisis. Drew Angerer/Getty Images
Prescriptions for naloxone have surged in recent years, as communities struggling with opioid addiction have embraced the overdose-reversing medication. But a new federal report indicates uptake of the antidote is still lagging in much of the country.
While the number of naloxone prescriptions doubled from 2017 to 2018, there was still only one dispensed for every 69 high-dose opioid prescriptions, according to the report from the Centers for Disease Control and Prevention, which was based on retail pharmacy data.
"We may never get to 1-to-1 … but we think that ratio of 1-to-70 is too low," Dr. Anne Schuchat, the principal deputy director of the CDC, said in an interview.
The CDC report, which analyzed naloxone prescriptions from 2012 to 2018, also uncovered drastic geographic disparities, with some counties dispensing the medication at 25 times the rate of other counties. Dispensing rates were often lowest in rural counties, a finding that Schuchat called "disappointing."
"In rural areas, it may take a long time for an ambulance to get there," she said.
In a nationwide first, New Jersey authorizes paramedics to start addiction treatment at the scene of an overdose
There has been halting progress in the effort to slow overdose deaths; health officials say naloxone has been a highly effective tool. But tens of thousands are still dying each year from opioid-related overdoses — including 47,600 people in the U.S. in 2017 — and health authorities stress that a lifesaving medication can only prevent deaths if people have it on hand.
"Thousands of Americans are alive today thanks to the use of naloxone … but today's CDC report is a reminder that there is much more all of us need to do to save lives," Health and Human Services Secretary Alex Azar said in a statement.
A number of federal policies and initiatives have been designed to expand the availability of the medication.
In 2016, for instance, the CDC recommended that doctors offer naloxone to chronic pain patients when they prescribe opioids at high doses, which come with higher risks of overdose. But almost 9 million more naloxone doses would had to have been doled out for them to match the number of patients on high-dose opioids, the new report found. (It's possible that some of these patients already had naloxone on hand, so didn't need a new supply.)
Why Black doctors like me are leaving faculty positions in academic medical centers
Public health authorities in states and local governments have also been working to expand naloxone access, issuing standings orders that serve as blanket prescriptions for entire communities — so people don't need individual prescriptions — and distributing it through syringe exchange sites. Such initiatives are seen as crucial steps in deploying naloxone widely, especially among people who don't have prescriptions for opioid painkillers but instead use illicit opioids like heroin or other drugs like methamphetamine that might be mixed with opioids.
Some of the report's other findings:
Overall, naloxone prescriptions given out at retail pharmacies grew from 1,282 in 2012 to 556,847 in 2018, the CDC found. Rates were highest in small cities and towns and in the South, and lowest in rural counties and in the Midwest.
The report didn't address the list price of different formulations of naloxone — which some advocates and lawmakers have said make it too expensive for some people — but it did examine other aspects of affordability. The authors found, for example, that while almost three-fourths of Medicare prescriptions for naloxone carried a copay, 42% of commercial plans had one. Overall, 42.3% of prescriptions did not come with an out-of-pocket cost.
Psychiatrists, addiction specialists, and pediatricians offered naloxone at the highest rates (12.9, 12.2, and 10.4 naloxone prescriptions per 100 high-dose opioid prescriptions, respectively), whereas surgeons (0.2), pain specialists (1.3), physician assistants (1.3), and primary care doctors (1.3) had the lowest rates.
Counties with higher rates of overdose deaths tended to have higher rates of naloxone dispensing, suggesting that awareness of the problem of overdoses could drive more uptake of the reversal drug.
Schuchat said that some naloxone-supporting initiatives were still so new it was hard to assess their effectiveness, but the report indicated that aggressive policies could have an impact. Arizona and Virginia, for example, have enacted requirements for co-prescribing naloxone along with high-dose opioids, and counties in those states tended to have higher naloxone dispensing rates than other places.
Andrew Joseph
General Assignment Reporter
Andrew is a general assignment reporter.
andrew.joseph@statnews.com
@DrewQJoseph
Joan Lane (at Southwest Community Health Center, Bridgeport CT) says:
Could you please provide me with contact names in AZ and VA whom I could contact about how they got their state legislatures to pass requirements to co-prescribe naloxone with high-dose opioid prescriptions?
Joan Lane
I am sorry to hear about the problem of overdoses but the abusers are the one set that are hurting the people that need this medicine to live a productive life keep their jobs take care of their family pay taxes….. I'm not responsible for the drug abuse nor should good doctors that are trying to help the legitimate people that need ot
Mary F says:
The title of this article needs a reality check. Chronic pain sufferers are not the same people as opioid abusers, and those two groups can not blatantly be lumped together. Chronic pain patients use proper dosage that supports leading a bearable life. They don't need naloxone. It is the "druggies" that do, and naloxone should be at-the-ready without prescription for first responders, ER's, designated personnel in public places, etc. There is rhyme nor reason for this ratio-study approach.
AVS, MD says:
Having worked with cancer and regular chronic pain patients for over 40 years, I have seen pretty much everything. Some of the earlier comments I completely agree with. This entire thing of now trying to further tie up our hands with 3, 7, repeat day follow ups and treatments is absurd, a big time waste for us physicians and patients. And, do tell me the difference between chronic cancer pain vs traumatic pain? A different pair of pliers!! It hurts the SAME!!
Big Pharma and the CDC screwed up 15-20 years ago, when there was "no ceiling" to the amount of opoids we could/should prescribe; then JCAHO and their "5th vital sign"!! All the bureaucrats played Dr.–without a license!! And now they want to legislate and Naloxone their way out, further compromising good, appropriate pain management. That really gets to the root cause of the problem, doesn't it–appropriate and adequate psycho-social availability and funding!! What every one of these "Doctors" needs is virtual intractable pain for 90-180 days, and have them come to me for pain management (try some NSAIDs and massages, doc!!). Are there "pill mills" out there? Of course! But then work harder on ferreting them out and prosecuting accordingly.
Finally, over 60K people have died of the flu for quite a few years; that does not include the residual chronic damage, loss of wages, etc. The CDC answer: "Oh, we missed the target virus"–AGAIN!! You are missing the target re pain management with all of your "chronic" legislation.
Please define a "high-dose opioid prescription."
Abid Ali Balospura says:
dadgum says:
Are you talking about 69 patients, or 69 prescriptions? Because there are no refills. Every month is o e or two new medication scripts. That would equal one naloxone (which will sit in a drawer for three years, because taken as directed, there is no overdose, no high, no euphoria…just good old fashioned relief enough to function). One person. One naloxone. 72 prescriptions for long acting and breakthrough medication over three years. WHY WOULD YOU WANT 1:1 ??? Do I need 24 naloxone doses a year???
They are being collected and used as 'naloxone parties', so drugs can be used without calling EMS or emergency room, and no treatment counseling is received.
Maire says:
There is no evidence that forcing people who are in a pain management program and under a physicians care, would benefit from an expensive Nalaxone prescription. Smearing and stigmatizing patients with intractable chronic pain was a tactic the pharmaceutical industry came up with the take attention away from their activities.
In a nation of alternate facts, and pharma industry lies and propaganda, there does not have to be a proven benefit. These devices seem to be more useful when the people who are addicted to street drugs have access to them. Thanks to the deceptive and misleading coverage of these topics, and the conflation of pain patients and people addicted to street drugs were are 22 years out and no closer to a fact based response.
US Taxpayers paid for the development of Nalaxone, and a pharma company repackaged it, and now makes an obscene profit from it. The so called opioid epidemic, was a good marketing campaign, designed to mislead us all. Pharma created this problem, and the FDA and CDC failed to respond in a sensible way, because they were compromised by corporate interests.
In order to keep this ruse going the pharma industry wanted pain patients to be confused with drug addicts. They paid a lot of money for research that attempted to prove it. Due to this misinformation campaign, pain patients were stigmatized, blamed, and driven to isolation and suicide, by design. At no time did the CDC consider the unintended consequences of their actions and unscientific response to this issue.
Cindy G says:
I get monthly opioid Rx's which I take as prescribed. They help my intractable chronic pain. They do NOT make me feel at all high.
Given that I follow my very qualified pain manager's orders, I feel no need to buy the expensive overdose Rx which my doctor was legally required to prescribe.
AGAIN, research proves that overdoses are virtually all caused by ILLEGAL drugs — mostly heroin and fentenyl. If legal Rx drugs are involved in an OD, then they are stolen, and/or used in conjunction with alcohol or illegal drugs.
Chronic pain patients who take their drugs as prescribed, and who are not addicts or criminals, do not need the overdose drugs because they/we do not overdose.
We are patients like any other patients, taking the meds we need to survive.
As usual, and to our great detriment, we chronic pain patients are incorrectly lumped into the same group as the addicts and criminals.
When will this end???
I agree. I have had chronic pain since I broke my back. My MD prescribes 4 Oxycodones a day. Some days are so bad that I need to take 5 and try and make up for it by taking 3 the next day. If that doesn't work I have to white knuckle it until I'm back on schedule.
My MD lives in fear of prescribing renewals. Every time I ask for a refill he grills me. "Are you selling them? Are you buying from the street?
I am dependent on this pain killer, but that doesn't make me an addict or a drug dealer. I can understand why some, the few, go to the street. Does the public and law enforcement want to chase these people or accept the reality that people in chronic pain need appropriate treatment?
Trevor .A Merchant says:
On Sunday after noon . August 04. 2019 . while i were on my way to the laundromat on Buhre Avenue in the Bronx New York City , i met a young lady that i had got to known about three years ago at The Pelham Bay Branch Library Of The City of New York Public Library . on the street named Hobart Avenue , in The Bronx .N.Y.C . .Immediately she called out my name ,Trevor and was laughing along with asking how am i doing about fifteen feet before she came close to i . right away she told me that she and a gentleman will be doing a documentary on the Opioid Crisis . and if i would be willing to give her some advice . consultation and information as to how the whole issue or issues of the Opioid Epidemic began ? i right away smile laugh and spoke to myself inwardly . before telling her willing and eagerly .that i would most certainly and pleasantly do so . as i subscribed to and with A most wonderful and majestic institutional deeply and sophisticated in the The health Care Industry ., specifically . with the Drugs or Pharmaceutical Empires Industry ,my given name Pharmaceutical Empires for a extended time ago , due to the Crisis and Chaos Of Deaths That they have cause with the Pain Killers Or Opioid Issues and products , more so the Bribing of Doctors . .whereby these doctors . there in write prescriptions in tens upon tens of millions knowing fully well that the patient or patients does ,do not need them as they are use less yet still these doctors do so simply because of the Pharmaceutical Empires Money And Influence . yes that created this disaster here in and i Trevor Merchant are involved with this topic .,subject or issue ., profoundly ,extensively ,religiously and everlastingly with the impacts that which are affecting humanity globally . ,Opioids or Pain Killers , called them what you may . So here it is today , Tuesday . August . 06, 2019 A clear and comprehensive .factual example of what we spoke on a few days ago . .right here on stat . more to come . ,Trevor . 4. 57 p.m daylight savings time . N.Y.C
Why Black doctors like me are leaving faculty positions…
'Donation after cardiac death': New heart transplant method being…
'Donation after cardiac death': New heart transplant method being tested for the first time in the…
Why fentanyl is deadlier than heroin, in a single…
Why fentanyl is deadlier than heroin, in a single photo
U.S. to begin health screenings at three airports for…
U.S. to begin health screenings at three airports for cases of novel Chinese virus
Pharmalittle: FTC member favors Medicare negotiation on drug prices;…
Pharmalittle: FTC member favors Medicare negotiation on drug prices; BioMarin weighs pricing world's most expensive drug
More than 15% of U.S. adults are physically inactive,…
More than 15% of U.S. adults are physically inactive, new CDC data show
By Andrew Joseph
By Shraddha Chakradhar
Novel virus tied to Chinese outbreak found in Japan, as second death is reported
Three African nations roll out first malaria vaccine in closely watched trial
'Donation after cardiac death': New heart transplant method being tested for the first time in the U.S.
Your daily dose of news in health and medicine
Industry Academia Advertising/Marketing Advocacy Biotech Consultancy/Firm Financial Services Government Healthcare Payer Healthcare Provider Media Medical Device Non-profit Pharma Technology
Reporting from the frontiers of health and medicine
Awards for STAT
Meet the STAT Team
Work at STAT
STAT Plus Group Subscriptions
STAT Madness
STAT Wunderkinds
Editorial & Events Calendar
© 2020 STAT


Join us at the Parkdale Community Association Monday and Wednesday mornings for inspiring and energizing yoga class. Our instructor will lead you through a class that flows, builds strength and energizes, leaving you feeling alive and ready for your day. These class will build upon that mantra by integrating in some of your favourite positions into the flow. All levels welcome! Modifications will be given to make the practice work for you. Join us if you are wanting a bit more strength, core, stress release, balance and feeling of accomplishment in every class! Participants must bring a yoga mat!
[toggle title="About the Instructor"]About the Instructor: Lee-Ann joins us from the Calgary yoga teaching community. She has been teaching yoga since 2000. Her teachers and mentors include the late Pattabbhi Jois of Mysore India, Nancy Gilgoff of Maui, and Harmony and Jeff Lichty of Victoria BC. With a love for Ashtanga yoga she also teaches around Calgary including Pilates, Barre, Personal Training and Dance. Lee-Anns classes are lighthearted and fun. She is looking forward to teaching for our community and sharing and playing with yoga on Monday and Wednesday mornings. Lee-Ann welcomes all levels into her classes and believes that yoga should be accessible to everyone.[/toggle]Want to save some dough? Get a PCA membership!


text:
Lyriothemis magnificata – gatunek ważki z rodziny ważkowatych (Libellulidae).

Przypisy

Bibliografia

Lyriothemis
Gatunki i podgatunki zwierząt nazwane w 1878 roku

redpajama_set_name: RedPajamaWikipedia


Mid rise bermuda denim shorts with extreme cutouts and distressing across the front. Fraying on the bottom with an eye-catching camo patchwork on the big hole cutout. Traditional 4 pockets with button and zip fly closure. Pairs well with oversize tops, crop tops and basic t-shirts.


Your search returned 13732 cottages.
When would you like to go away this summer? Using the search options on your left, simply select an arriving date and the number of nights you require. You will then be presented with holiday cottages that are available and ready to book for the dates you would like to go away.
Or why not take a look at our New Cottages? As these holiday cottages have just been added to the website, they always have plenty of availability for the popular summer months!


text:
Remembering Wallace Stegner
Stegner died today. We remember him with a rebroadcast of our April, 15, 1992 interview, which coincided with the publication of his book "Where the Bluebird Sings to the Lemonade Springs."
'Fresh Air' Remembers Film Star Burt Reynolds
Reynolds, who died Thursday, appeared in scores of films, including Deliverance and Boogie Nights. He spoke to Terry Gross in 1994 about growing up the son of a sheriff in a small Florida town.
Remembering Mickey Mantle.
An excerpt from a 1985 interview with baseball legend Mickey Mantle. He died yesterday of liver cancer.
Remembering Mercer Ellington.
We remember band leader and composer Mercer Ellington, the son of Duke Ellington. He perpetuated the big band tradition his father made famous as head of the Duke Ellington Band. When he was a young man, Mercer Ellington had hoped to break into his father's band on the saxophone. But after years of frustration, he could see that he would never crack the legendary Ellington reed section. He finally was accepted as a trombone player and later played french horn and trumpet. With the death of his father in 1974, Mercer Ellington took over his father's orchestra.
Fresh Air Remembers Pulitzer Prize-Winning Playwright And Actor Sam Shepard
Shepard, who died Sunday, penned more than 55 plays, including Buried Child. His breakthrough film role was as astronaut Chuck Yeager in The Right Stuff. Originally broadcast in 1998.
Actor Bruno Kirby's Memorable Roles
Bruno Kirby died Monday at the age of 57 from complications of leukemia. Kirby played the would-be comedian in Good Morning, Vietnam and Carrie Fisher's boyfriend in When Harry Met Sally. Over the years Kirby played in dozens of movies, TV shows and on Broadway. This interview originally aired on July 27, 1990.
Singer Darrell Scott Reflects On His Father's Death.
Country singer-songwriter Darrell Scott grew up performing with his father, Wayne. Last month, Darrell was in Texas in between gigs when he learned that his father had died in a car accident. Here, he reflects on his father's life and death, and reads a poem he wrote about his dad.
'Fresh Air' Remembers Comedian David Brenner.
Brenner appeared on The Tonight Show more than 150 times, often as the substitute host. The comic died Saturday at 78. He spoke to Fresh Air in 1990.
Obituary for Horace Silver.
Famed jazz pianist Horace Silver died yesterday. He spoke with Terry Gross in 1984.
'Fresh Air' Remembers Jazz Guitar Great Bucky Pizzarelli
Pizzarelli, who died April 1 of COVID-19, played with Benny Goodman, Frank Sinatra, Tony Bennett and Rosemary Clooney, among others. He spoke to Fresh Air in '92 and again, with his son John, in '06.


text:
HOLA!, Royal and celebrity news
Alan Thicke is honored by Leonardo DiCaprio, Kris Jenner and more during his memorial service
December 19, 2016	 by HOLA! USA
Alan Thicke had an all-star send off during his memorial service. On Sunday, 300 of the Growing Pains star's closest family and friends gathered at his home in Carpinteria, California near Santa Barbara, for a heartfelt memorial service.
Alan's three son's Brennan, Carter, Robin, who acted as MC during the service, and his wife, Tanya Callau, were surrounded by a host of celebrities who shared memories of the late star over the years including, Bob Saget, Kris Jenner, Alex Trebek, Bill Mahr and Rob Lowe. In addition, Alan's onscreen family from his hit '80s sitcom Growing Pains, Joanna Kerns, Kirk Cameron, Tracey Gold, Jeremy Miller, and Leonardo DiCaprio also made the trip.
CLICK FOR FULL GALLERY
Alan's son Robin acted as the MC for the lighthearted memorial service Photo: Charley Gallay/WireImage
STARS WE'VE LOST IN 2016
During the light hearted service, guest were seated at various tables complete with place holders featuring quotes from the Hollywood veteran. Alex Trebek, who is a fellow Canadian and longtime friend of Alan's, gave a speech about how the star helped him get his start in Hollywood. Bob Saget took to the podium for a comedy set in his honor, as Alan's son Robin kept the mood upbeat with his best impression of his father while joking about the presence of all of his wives.
"I'm Alan Thicke and this is exactly the way I want to go out. ... I'd like to thank all of my ex-wives for coming," Robin, 39, joked about his mother and, Alan's first wife Gloria Loring, and his second wife, Gina Tolleson who were on hand to say goodbye.
All of the star tributes to Alan Thicke
Alan's Growing Pains co-stars were in attendance Photo: Michael Buckner/Getty Images
Inside Prince's star-studded memorial service
After the service, Alan's daughter-in-law Dolly took to her Facebook page to thank all the attendees and share images from the ceremony. "Tonight's memorial for Alan was just about perfect. So much family and so many historic friends came out to remember our beloved father-figure," the post read in part. Speaking for Alan so beautifully was (I'm realizing now) an all-star cast. We heard from our own Robin Thicke who brought up all dear dad's best friends, Bob Saget, Bill Maher, Alex Trebek who I had no idea had such old deep ties to our family, the entire cast of Growing Pains including Leo and Kirk Cameron who I had the pleasure of meeting for the first time, along with his wife who became an instant friend."
Alan passed away on December 13 at the age of 69 after suffering a heart attack while playing a game of hockey with his 19-year-old son Carter.
Alan Thicke
Ally Brooke honors Selena Quintanilla with a special performance at Miss Universe 2019 pageant
Every celebrity spotted in Miami during Art Basel 2019
Sofia Vergara reveals an impressive never-before-seen talent in new video
Jennifer Lopez reacts to her first Golden Globe nomination in over 20 years: Watch
Cardi B gets candid on making marriage work and her million dollar plan for daughter Kulture
Camila Cabello honors the 'first man that really loved me,' her dad, in a sweet post
Salma Hayek pays an emotional tribute to the late singer José José
Sarita, daughter of José José, shares what his final moments were like
José José, 'El príncipe de la canción,' dies at 71
Model Tales Cotta dies after collapsing on the runway at Fashion Week
Privacy Policy Legal Notice Cookies
Privacy Policy Privacy settings Legal Notice Cookies
Media Kit Magazine
Media Kit Digital


text:
SMART-CDMO
Children's Hospital Coalition
The Hidden Perils of Drugs Imported from China
Sep 3, 2019 | 2019, Other News
When you pick up your prescription at the pharmacy, it isn't labelled "made in China," but odds are that's where many of your medications come from.
President Trump is calling on US industries to manufacture here at home, instead of outsourcing to China. Drug companies — which now rely on China for active ingredients that go into antibiotics, heart medicines and other drugs we need to stay alive — should be the first to respond to Trump's plea.
That reliance is a threat to national security. And the squalid conditions in many Chinese drug factories pose a health risk to Americans who have to take the medicines.
The United States wouldn't outsource the manufacture of fighter planes and tanks to China; that would put our national security in the hands of an adversary. But even US military personnel take medications from China.
US factories no longer make generic antibiotics. So, if US-China tensions worsen, China could cut off antibiotic exports, throwing our hospitals into turmoil, warns Hastings Center health expert Rosemary Gibson.
The federal US-China Economic and Safety Review Commission warned this summer about the dangers of American reliance on China for life-saving drugs. If the US were attacked with anthrax, China would be a major source for ciprofloxacin, an antibiotic needed to treat victims. "What if China were the anthrax attacker?" Gibson asked.
The commission also cautioned about "serious deficiencies in health and safety standards" in Chinese drug factories. Translation: Beware of putting anything made in China in your mouth.
The Food and Drug Administration claims pharmaceutical ingredients from China are safe. Don't believe it. The agency has a long history of failing to oversee foreign drug sources, according to scathing reports from the federal Government Accountability Office.
The GAO found that the FDA inspects Chinese drug manufacturing plants infrequently, at best, and some may never get inspected. In the United States, pharmaceutical plants are inspected every two years.
During the last 13 months, the FDA has had to announce more than 50 recalls of blood pressure medications because the active ingredient valsartan contained jet-fuel contaminants estimated to cause cancer in one out of every 8,000 pill takers. Who supplies it? China.
The FDA's Janet Woodcock advised that it's less risky to take the contaminated pills than to stop taking blood pressure medication altogether. Yikes. Patients shouldn't have to face that choice.
In 2008, a contaminated blood thinner from China, heparin, killed 81 American patients. Heparin is made from the mucous membranes of pig intestines. In China, slaughtered pigs are often cooked in unregulated family workspaces to begin the process.
The FDA initially concluded that the contaminated heparin came from a Chinese factory using unclean storage tanks and risky raw materials. But later the agency changed its view, and suspected intentional contamination.
Chinese authorities, meanwhile, responded only with denials and more denials. The reason the FDA had little chance to uncover the contamination before Americans started dying: It had not inspected the plant. Even now, it has only 29 staff dedicated to inspecting more than 3,000 foreign manufacturing facilities.
Here's the ultimate unfairness: Americans pay close to the highest medication prices in the world, because they shoulder most of the research and development costs for new drugs. Yet what are they getting? Drugs made with cheap, sometimes contaminated, Chinese ingredients.
On Sunday, the Trump administration slapped tariffs on Chinese-made clothing and shoes, trying to force the Chinese to the bargaining table. The reaction in Washington? Politicians are squabbling about how much the tariffs will raise Christmas shopping prices.
That's a reasonable concern, but let's not lose sight of the more urgent issue: the riskiness of relying on China to fill our medicine chests.
US trade negotiators should anticipate China playing hardball with America's medical supply chain. Now is the time to preempt that threat. Rather than looking for another cheap foreign manufacturing site, encourage domestic production of the drugs we depend on every day.
1001 Haxall Point #1B | Richmond, VA 23219
To report an adverse event or product complaint associated with Phlow Drug Products, please call (844) 708-2982.
© Phlow Corp. 2022
Privacy Policy | Additional Resources & Policies
A not-for-profit generic drug and pharmaceutical company founded in 2018 to combat drug shortages & affordability issues related to life-saving drugs. Civica is creating a public asset that is dedicated to ensuring that essential generic medications are accessible and affordable.
https://civicarx.org/


text:
uDiscover Music
'Jessica': Instrumental In The Allman Brothers Band's Success
'Rockin' Roll Baby': Rockin' Soul From The Stylistics
Remembering An Elegant Eagle: The Style Of Glenn Frey
'Nightfall': A Bright Return From Little Big Town
'Blues From Laurel Canyon': From Macclesfield To Hollywood With John Mayall
Listen To Previously Unreleased Live Version Of Cream's 'Crossroads'
Billie Eilish Wins 'Newcomer Of The Year' At European Festival Awards
The 1975 Announce North American Tour With Phoebe Bridgers and Beabadoobee
Cirque du Soleil's 'LOVE' Cast Reveal How The Beatles' Music Affects Them In New Interview
Puss N Boots, ft. Norah Jones, Announce Second Album, 'Sister'
Enigma's Ambient Exploration: 'The Screen Behind The Mirror'
On Enigma's 'The Screen Behind The Mirror', Michael Cretu brings a sense of spirituality to his sampling methods, pushing ambient music in a new direction.
Best German Musicians: 12 Groundbreaking Pioneers
Fearlessly innovative, the best German musicians include electronic pioneers, rock bands and film composers alike, pushing music to its limits.
'Voyageur': When Michael Cretu Expanded The Enigma Sound For 2003
As Michael Crete proceeds with the eighth Enigma album, we're looking at their fifth set, 'Voyageur,' which entered the UK chart on September 20, 2003.
Lady Gaga Adds Dates To Her Las Vegas Residency
The pop icon announced today that both her 'Enigma' and 'Jazz + Piano' shows will be extended through December and then through May 2020
Best Ambient Music: An Essential Playlist And Brief History In 20 Songs
Settle yourself in for a long, relaxing journey through some of the best ambient music, with uDiscover Music's Ambient Music In 20 Songs playlist.
Coloured Vinyl Editions Of Enigma's Complete Catalogue Set For Release
Special, remastered heavyweight coloured vinyl editions of all the titles in Enigma's catalogue are due for issue through Universal Music on 4 May 2018.
So You Think You Know Enigma? Quiz
Are you a fan of Enigma? How well do you know German producer Michael Cretu? Test yourself with the uDiscover Enigma music quiz - it's hard but fun!
Music Quizzes3 years ago
New Releases3 years ago
Enigma 8 Marks 'The Fall Of A Rebel Angel'
The long-awaited eighth studio album by Enigma has been confirmed by Universal Music. The Fall Of A Rebel Angel is set for global release on 11 November.
Fans Show Endless Love For New Sandra Comp
A forthcoming Sandra collection, 'The Very Best Of Sandra', is due for release in Germany on 27 May and will be compiled from a fan vote.
reDiscover Enigma's 'A Posteriori'
Released in September 2006, Enigma's 'A Posteriori' received a Best New Age album nomination at Grammys, and its reputation continues to grow.
Enigma 8 Draws Nearer
Michael Cretu, the mastermind behind the global multi-million-selling new age project Enigma, is nearing completion of the eighth album in the series.
reDiscover Enigma's 'Le Roi Est Mort, Vive Le Roi!'
Sometimes overlooked in the wake of its two chart-conquering predecessors, Le Roi Est Mort, Vive Le Roi! is still ripe for rediscovery.
reDiscover Enigma's 'Enigma 2: The Cross Of Changes'
How to follow an Enigma album that helped define the sound of 1990 and sold millions of copies? reDiscover 'Enigma 2: The Cross of Changes.'
The Eighth Enigma Is In The Works
Enigma mastermind Michael Cretu reports on social media that he is making good progress with the eighth album by the 40m-selling new age project.
More Enigma
Best Guitarists In Music: 50 Legendary Musicians You Need To Know
Best Bassists Of All Time: 50 Legendary Bass Players You Need To Know
Best Live Albums: 25 Classics That Make You Feel Like You Were There
This Day In Music
About Us • Contributors • Terms of Service • Privacy Policy •


Equipped with the same Dante user switch capabilities as the ATND971 boundary mic, the ATND8677 desk stand allows Dante technology to be used with any phantom-powered condenser gooseneck microphone with a 3-pin XLRM-type output. The desk stand is designed for surface-mount applications such as high-quality sound reinforcement, conferencing, distance learning and other demanding sound pickup applications.
An integral 80 Hz low-cut UniSteep filter provides easy switching from a flat frequency response to a low-end roll-off, while a three-position input gain level selector (+30 dB, +40 dB, +50 dB) permits trim adjustment to accommodate louder and softer voices. The desk stand also provides 12V DC phantom power, which can be switched off and on.
The ATND8734 is a Dante-enabled wall/ceiling plate power module designed for use with compatible microphones that have a TA3F-type connector, including the ES931/MIC and ES933/MIC. The power module is equipped with an RJ45 output jack that allows for easy connection to the network via CAT5e (or better) cable.
The power module is equipped with an 80 Hz low-cut UniSteep filter that permits the choice of flat response or low-frequency roll-off, three-position input gain level selector (+30 dB, +40 dB, and +50 dB), and a red/green LED status indicator. These are all controlled remotely via third-party software.
The ATND8734 features a circular cover plate that can be removed and painted with commercially available spray paint.
A true audio/IT convergence, the ATND971 boundary mic not only delivers the superior audio you would expect from Audio-Technica, with outstanding speech intelligibility and transparent sound quality, but it also transmits control data to communicate across a network of Dante-enabled devices. The integrated programmable user switch allows users to trigger a video camera's pan/tilt, recall lighting presets or control anything else on the network at the push of a button. And with a Red/Green LED the microphone can visually convey mute status, incoming phone calls or other creative visual effects utilizing a control system. The microphone plugs into the network via Ethernet cable – easy to install and operate.