% Copyright 2006 by Till Tantau
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.

\ProvidesPackageRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/frontendlayer/tikz/tikz.code.tex,v 1.76 2010/10/13 09:20:31 ludewich Exp $


% Always-present libraries (|\usepgflibrary| defined in
% \file{pgfutil-common.tex}).
\usepgflibrary{plothandlers}

\newdimen\tikz@lastx
\newdimen\tikz@lasty
\newdimen\tikz@lastxsaved
\newdimen\tikz@lastysaved

\newdimen\tikzleveldistance
\newdimen\tikzsiblingdistance

\newbox\tikz@figbox
\newbox\tikz@tempbox

\newcount\tikztreelevel
\newcount\tikznumberofchildren
\newcount\tikznumberofcurrentchild

\newcount\tikz@fig@count

\newif\iftikz@node@is@a@label
\newif\iftikz@snaked
\newif\iftikz@decoratepath

% |\pgfutil@empty| is defined in \file{pgfutil-common.tex}.
\let\tikz@options=\pgfutil@empty
% |\tikz@addoption| adds \texttt{#1} at the end of the replacement
% text of |\tikz@options| without expansion.
\def\tikz@addoption#1{%
  \expandafter\def\expandafter\tikz@options\expandafter{\tikz@options#1}}
% Same as |tikz@addoption| for |\tikz@mode|. Note that |\tikz@mode| is
% initially let to |\pgfutil@empty| later (see path usage options).
\def\tikz@addmode#1{%
  \expandafter\def\expandafter\tikz@mode\expandafter{\tikz@mode#1}}
% Same as |tikz@addoption| for |\tikz@transform|. Works even if
% |\tikz@transform| is not defined. In that case, nothing is added to
% |\tikz@transform|: \texttt{#1} is expanded.
\def\tikz@addtransform#1{%
  \ifx\tikz@transform\relax
    #1%
  \else
    \expandafter\def\expandafter\tikz@transform\expandafter{\tikz@transform#1}%
  \fi}


% TikZ options management.

% Setting up the tikz key family (key management needs
% \file{pgfkeys.code.tex});
\pgfkeys{/tikz/.is family}

% |\tikzset| is a shortcut to set keys that belongs to the tikz
% family.
\def\tikzset{\pgfqkeys{/tikz}}

% Note: |\tikzoption| is supported for compatibility only. |\tikzset|
% should be used instead.
\def\tikzoption#1{%
  \pgfutil@ifnextchar[%]
    {\tikzoption@opt{#1}}{\tikzoption@noopt{#1}}}
\def\tikzoption@opt#1[#2]#3{%
  \pgfkeysdef{/tikz/#1}{#3}%
  \pgfkeyssetvalue{/tikz/#1/.@def}{#2}}
\def\tikzoption@noopt#1#2{%
  \pgfkeysdef{/tikz/#1}{#2}%
  \pgfkeyssetvalue{/tikz/#1/.@def}{\pgfkeysvaluerequired}}

% Baseline options
\tikzoption{baseline}[0pt]{%
  \pgfutil@ifnextchar(%)
    {\tikz@baseline@coordinate}{\tikz@baseline@simple}#1\@nil}
\def\tikz@baseline@simple#1\@nil{\pgfsetbaseline{#1}}
\def\tikz@baseline@coordinate#1\@nil{%
  \pgfsetbaselinepointlater{\tikz@scan@one@point\pgfutil@firstofone#1}}

\tikzoption{trim left}[0pt]{\pgfutil@ifnextchar({\tikz@trim@coordinate{left}}{\tikz@trim@simple{left}}#1\@nil}%)
\tikzoption{trim right}{\pgfutil@ifnextchar({\tikz@trim@coordinate{right}}{\tikz@trim@simple{right}}#1\@nil}%)
\def\tikz@trim@simple#1#2\@nil{\csname pgfsettrim#1\endcsname{#2}}
\def\tikz@trim@coordinate#1#2\@nil{\csname pgfsettrim#1pointlater\endcsname{\tikz@scan@one@point\pgfutil@firstofone#2}}

% Draw options
\tikzoption{line width}{\tikz@semiaddlinewidth{#1}}%

\def\tikz@semiaddlinewidth#1{\tikz@addoption{\pgfsetlinewidth{#1}}\pgfmathsetlength\pgflinewidth{#1}}

\tikzoption{cap}{\tikz@addoption{\csname pgfset#1cap\endcsname}}
\tikzoption{join}{\tikz@addoption{\csname pgfset#1join\endcsname}}
\tikzoption{line cap}{\tikz@addoption{\csname pgfset#1cap\endcsname}}
\tikzoption{line join}{\tikz@addoption{\csname pgfset#1join\endcsname}}
\tikzoption{miter limit}{\tikz@addoption{\pgfsetmiterlimit{#1}}}

\tikzoption{dash pattern}{% syntax: on 2pt off 3pt on 4pt ...
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\pgfutil@empty%
    \def\tikz@dashpattern{}%
    \tikz@addoption{\pgfsetdash{}{0pt}}%
  \else%
    \def\tikz@dashpattern{}%
    \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
    \edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
    \expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
  \fi}
\tikzoption{dash phase}{%
  \def\tikz@dashphase{#1}%
  \edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
  \expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
}%
\def\tikz@dashphase{0pt}
\def\tikz@dashpattern{}

\def\tikz@scandashon n#1o{%
  \expandafter\def\expandafter\tikz@dashpattern\expandafter{\tikz@dashpattern{#1}}%
  \pgfutil@ifnextchar\@nil{\pgfutil@gobble}{\tikz@scandashoff}}
\def\tikz@scandashoff ff#1o{%
  \expandafter\def\expandafter\tikz@dashpattern\expandafter{\tikz@dashpattern{#1}}%
  \pgfutil@ifnextchar\@nil{\pgfutil@gobble}{\tikz@scandashon}}

\tikzoption{draw opacity}{\tikz@addoption{\pgfsetstrokeopacity{#1}}}

% Double draw options
\tikzoption{double}[]{%
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\tikz@nonetext%
    \tikz@addmode{\tikz@mode@doublefalse}%
  \else%
    \ifx\tikz@temp\pgfutil@empty%
    \else%
      \pgfsetinnerstrokecolor{#1}%
    \fi%
    \tikz@addmode{\tikz@mode@doubletrue}%
    \tikzset{every double/.try}%
  \fi}
\tikzoption{double distance}{%
  \pgfmathsetlength{\pgf@x}{#1}%
  \edef\tikz@double@setup{%
    \pgf@x=\the\pgf@x%
    \advance\pgf@x by2\pgflinewidth%
    \pgflinewidth=\pgf@x%
    \noexpand\pgfsetlinewidth{\pgflinewidth}%
    \noexpand\pgfsetinnerlinewidth{\the\pgf@x}%
  }%
  \tikzset{double}}
\def\tikz@double@setup{%
  \pgf@x=2\pgflinewidth%
  \advance\pgf@x by0.6pt%
  \pgflinewidth=\pgf@x%
  \pgfsetlinewidth{\pgflinewidth}%
  \pgfsetinnerlinewidth{0.6pt}%
}%
\tikzset{double distance between line centers/.code={
  \pgfmathsetlength{\pgf@x}{#1}%
  \edef\tikz@double@setup{%
    \pgf@x=\pgflinewidth%
    \pgf@xa=\the\pgf@x%
    \advance\pgf@x by\pgf@xa%
    \advance\pgf@xa by-\pgflinewidth%
    \pgflinewidth=\pgf@x%
    \noexpand\pgfsetlinewidth{\pgflinewidth}%
    \noexpand\pgfsetinnerlinewidth{\pgf@xa}%
  }%
  \tikzset{double}}}
\tikzset{double equal sign distance/.style={double distance between line centers=0.45ex}}




% Fill options

\tikzoption{even odd rule}[]{\tikz@addoption{\pgfseteorule}}
\tikzoption{nonzero rule}[]{\tikz@addoption{\pgfsetnonzerorule}}

\tikzoption{fill opacity}{\tikz@addoption{\pgfsetfillopacity{#1}}}


% Joined fill/draw options

\tikzoption{opacity}{\tikz@addoption{\pgfsetstrokeopacity{#1}\pgfsetfillopacity{#1}}}


% Main color options
\tikzoption{color}{%
  \tikz@addoption{%
    \ifx\tikz@fillcolor\pgfutil@empty%
      \ifx\tikz@strokecolor\pgfutil@empty%
      \else%
        \pgfsys@color@reset@inorderfalse%
        \let\tikz@strokecolor\pgfutil@empty%
        \let\tikz@fillcolor\pgfutil@empty%
      \fi%
    \else%
      \pgfsys@color@reset@inorderfalse%
      \let\tikz@strokecolor\pgfutil@empty%
      \let\tikz@fillcolor\pgfutil@empty%
    \fi%
    \pgfutil@colorlet{tikz@color}{#1}%
    \pgfutil@colorlet{.}{tikz@color}%
    \pgfsetcolor{.}%
    \pgfsys@color@reset@inordertrue%
  }%
  \def\tikz@textcolor{#1}}



% Rounding options
\tikzoption{rounded corners}[4pt]{\pgfsetcornersarced{\pgfpoint{#1}{#1}}}
\tikzoption{sharp corners}[]{\pgfsetcornersarced{\pgfpointorigin}}

% Radii and arc options
\tikzset{x radius/.initial=0pt}
\tikzset{y radius/.initial=0pt}
\tikzset{radius/.style={/tikz/x radius=#1,/tikz/y radius=#1}}
\tikzset{start angle/.initial=}
\tikzset{end angle/.initial=}
\tikzset{delta angle/.initial=}


% Coordinate options
\tikzoption{x}{\tikz@handle@vec{\pgfsetxvec}{\tikz@handle@x}#1\relax}
\tikzoption{y}{\tikz@handle@vec{\pgfsetyvec}{\tikz@handle@y}#1\relax}
\tikzoption{z}{\tikz@handle@vec{\pgfsetzvec}{\tikz@handle@z}#1\relax}

\def\tikz@handle@vec#1#2{\pgfutil@ifnextchar({\tikz@handle@coordinate#1}{\tikz@handle@single#2}}
\def\tikz@handle@coordinate#1{\tikz@scan@one@point#1}
\def\tikz@handle@single#1#2\relax{#1{#2}}
\def\tikz@handle@x#1{\pgfsetxvec{\pgfpoint{#1}{0pt}}}
\def\tikz@handle@y#1{\pgfsetyvec{\pgfpoint{0pt}{#1}}}
\def\tikz@handle@z#1{\pgfsetzvec{\pgfpoint{#1}{#1}}}


% Transformation options
\tikzoption{scale}{\tikz@addtransform{\pgftransformscale{#1}}}
\tikzoption{scale around}{\tikz@addtransform{\def\tikz@aroundaction{\pgftransformscale}\tikz@doaround{#1}}}
\tikzoption{xscale}{\tikz@addtransform{\pgftransformxscale{#1}}}
\tikzoption{xslant}{\tikz@addtransform{\pgftransformxslant{#1}}}
\tikzoption{yscale}{\tikz@addtransform{\pgftransformyscale{#1}}}
\tikzoption{yslant}{\tikz@addtransform{\pgftransformyslant{#1}}}
\tikzoption{rotate}{\tikz@addtransform{\pgftransformrotate{#1}}}
\tikzoption{rotate around}{\tikz@addtransform{\def\tikz@aroundaction{\pgftransformrotate}\tikz@doaround{#1}}}
\def\tikz@doaround#1{%
  \edef\tikz@temp{#1}% get rid of active stuff
  \expandafter\tikz@doparseA\tikz@temp%
}%
\def\tikz@doparseA#1:{%
  \def\tikz@temp@rot{#1}%
  \tikz@scan@one@point\tikz@doparseB%
}
\def\tikz@doparseB#1{%
  \pgf@process{#1}%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
  \tikz@aroundaction{\tikz@temp@rot}%
  \pgftransformshift{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
}

\tikzoption{shift}{\tikz@addtransform{\tikz@scan@one@point\pgftransformshift#1\relax}}
\tikzoption{xshift}{\tikz@addtransform{\pgftransformxshift{#1}}}
\tikzoption{yshift}{\tikz@addtransform{\pgftransformyshift{#1}}}
\tikzoption{cm}{\tikz@addtransform{\tikz@parse@cm#1\relax}}
\tikzoption{reset cm}[]{\tikz@addtransform{\pgftransformreset}}
\tikzoption{shift only}[]{\tikz@addtransform{\pgftransformresetnontranslations}}

\def\tikz@parse@cm#1,#2,#3,#4,{%
  \def\tikz@p@cm{{#1}{#2}{#3}{#4}}%
  \tikz@scan@one@point\tikz@parse@cmA}
\def\tikz@parse@cmA#1{%
  \expandafter\pgftransformcm\tikz@p@cm{#1}%
}

\tikzset{transform canvas/.code=%
  {%
    \tikz@addoption
    {%
      {%
        \pgftransformreset%
        \let\tikz@transform=\relax%
        \tikzset{#1}%
        \pgflowlevelsynccm%
      }%
      \pgf@relevantforpicturesizefalse%
    }%
  }%
}


% Grid options
\tikzoption{xstep}{\def\tikz@grid@x{#1}}
\tikzoption{ystep}{\def\tikz@grid@y{#1}}
\tikzoption{step}{\tikz@handle@vec{\tikz@step@point}{\tikz@step@single}#1\relax}
\def\tikz@step@single#1{\def\tikz@grid@x{#1}\def\tikz@grid@y{#1}}
\def\tikz@step@point#1{\pgf@process{#1}\edef\tikz@grid@x{\the\pgf@x}\edef\tikz@grid@y{\the\pgf@y}}

\def\tikz@grid@x{1cm}
\def\tikz@grid@y{1cm}


% Current point updates
\newif\iftikz@current@point@local
\tikzset{current point is local/.is if=tikz@current@point@local}

% Path usage options
\newif\iftikz@mode@double
\newif\iftikz@mode@fill
\newif\iftikz@mode@draw
\newif\iftikz@mode@clip
\newif\iftikz@mode@boundary
\newif\iftikz@mode@shade
\newif\iftikz@mode@fade@path
\newif\iftikz@mode@fade@scope
\let\tikz@mode=\pgfutil@empty

\def\tikz@nonetext{none}

\tikzoption{path only}[]{\let\tikz@mode=\pgfutil@empty}
\tikzoption{shade}[]{\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{fill}[]{%
  \edef\tikz@temp{#1}%
  \ifx\tikz@temp\tikz@nonetext%
    \tikz@addmode{\tikz@mode@fillfalse}%
  \else%
    \ifx\tikz@temp\pgfutil@empty%
    \else%
      \tikz@addoption{\pgfsetfillcolor{#1}}%
      \def\tikz@fillcolor{#1}%
    \fi%
    \tikz@addmode{\tikz@mode@filltrue}%
  \fi%
}
\tikzoption{draw}[]{%
  \edef\tikz@temp{#1}%
  \ifx\tikz@temp\tikz@nonetext%
    \tikz@addmode{\tikz@mode@drawfalse}%
  \else%
    \ifx\tikz@temp\pgfutil@empty%
    \else%
      \tikz@addoption{\pgfsetstrokecolor{#1}}%
      \def\tikz@strokecolor{#1}%
    \fi%
    \tikz@addmode{\tikz@mode@drawtrue}%
  \fi%
}
\tikzoption{clip}[]{\tikz@addmode{\tikz@mode@cliptrue}}
\tikzoption{use as bounding box}[]{\tikz@addmode{\tikz@mode@boundarytrue}}

\tikzoption{save path}{\tikz@addmode{\pgfsyssoftpath@getcurrentpath#1\global\let#1=#1}}

\let\tikz@fillcolor=\pgfutil@empty
\let\tikz@strokecolor=\pgfutil@empty

% Insert a path using an option
\tikzset{insert path/.code=\tikz@scan@next@command#1\pgf@stop}

% Pattern options
\tikzset{pattern/.code=\PackageError{tikz}{You need to say \string\usetikzlibrary{patterns}}{},
         pattern color/.style=pattern}

% Path pictures
\tikzset{path picture/.code=\tikz@addmode{\def\tikz@path@picture{#1}}}       

% Fading options
\tikzset{path fading/.code={
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\tikz@nonetext%
    \tikz@addmode{\tikz@mode@fade@pathfalse}%
  \else%
    \ifx\tikz@temp\pgfutil@empty%
    \else%
      \def\tikz@path@fading{#1}%
    \fi%
    \tikz@addmode{\tikz@mode@fade@pathtrue}%
  \fi%
  },
  path fading/.default=, 
  scope fading/.code={
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\tikz@nonetext%
    \tikz@addmode{\tikz@mode@fade@scopefalse}%
  \else%
    \ifx\tikz@temp\pgfutil@empty%
    \else%
      \def\tikz@scope@fading{#1}%
    \fi%
    \tikz@addmode{\tikz@mode@fade@scopetrue}%
  \fi%
  },
  scope fading/.default=}
\tikzset{fit fading/.is if=tikz@fade@adjust}
\tikzset{fading transform/.store in=\tikz@fade@transform}
\tikzset{fading angle/.style={fading transform={rotate=#1}}}

\newif\iftikz@fade@adjust
\tikz@fade@adjusttrue
\let\tikz@fade@transform\pgfutil@empty

\pgfutil@colorlet{transparent}{pgftransparent}
\def\tikz@do@fade@transform{\let\tikz@transform=\relax\expandafter\tikzset\expandafter{\tikz@fade@transform}}



% Transparency groups
\newif\iftikz@transparency@group
\tikzset{/tikz/transparency group/.is if=tikz@transparency@group}


% Shading options
\tikzoption{shading}{\def\tikz@shading{#1}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{shading angle}{\def\tikz@shade@angle{#1}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{top color}{%
  \pgfutil@colorlet{tikz@axis@top}{#1}%
  \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
  \def\tikz@shading{axis}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{bottom color}{%
  \pgfutil@colorlet{tikz@axis@bottom}{#1}%
  \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
  \def\tikz@shading{axis}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{middle color}{%
  \pgfutil@colorlet{tikz@axis@middle}{#1}%
  \def\tikz@shading{axis}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{left color}{%
  \pgfutil@colorlet{tikz@axis@top}{#1}%
  \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
  \def\tikz@shading{axis}\def\tikz@shade@angle{90}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{right color}{%
  \pgfutil@colorlet{tikz@axis@bottom}{#1}%
  \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
  \def\tikz@shading{axis}\def\tikz@shade@angle{90}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{ball color}{\pgfutil@colorlet{tikz@ball}{#1}\def\tikz@shading{ball}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{inner color}{\pgfutil@colorlet{tikz@radial@inner}{#1}\def\tikz@shading{radial}\tikz@addmode{\tikz@mode@shadetrue}}
\tikzoption{outer color}{\pgfutil@colorlet{tikz@radial@outer}{#1}\def\tikz@shading{radial}\tikz@addmode{\tikz@mode@shadetrue}}

\def\tikz@shading{axis}
\def\tikz@shade@angle{0}

\pgfdeclareverticalshading[tikz@axis@top,tikz@axis@middle,tikz@axis@bottom]{axis}{100bp}{%
  color(0bp)=(tikz@axis@bottom);
  color(25bp)=(tikz@axis@bottom);
  color(50bp)=(tikz@axis@middle);
  color(75bp)=(tikz@axis@top);
  color(100bp)=(tikz@axis@top)}

\pgfutil@colorlet{tikz@axis@top}{gray}
\pgfutil@colorlet{tikz@axis@middle}{gray!50!white}
\pgfutil@colorlet{tikz@axis@bottom}{white}

\pgfdeclareradialshading[tikz@ball]{ball}{\pgfqpoint{-10bp}{10bp}}{%
 color(0bp)=(tikz@ball!15!white);
 color(9bp)=(tikz@ball!75!white);
 color(18bp)=(tikz@ball!70!black);
 color(25bp)=(tikz@ball!50!black);
 color(50bp)=(black)}

\pgfutil@colorlet{tikz@ball}{blue}

\pgfdeclareradialshading[tikz@radial@inner,tikz@radial@outer]{radial}{\pgfpointorigin}{%
 color(0bp)=(tikz@radial@inner);
 color(25bp)=(tikz@radial@outer);
 color(50bp)=(tikz@radial@outer)}

\pgfutil@colorlet{tikz@radial@inner}{gray}
\pgfutil@colorlet{tikz@radial@outer}{white}


% Pin options
\tikzset{
  pin/.code={\pgfutil@ifnextchar[{\tikz@parse@pin}{\tikz@parse@pin[]}#1:\pgf@nil},%}
  pin distance/.store in=\tikz@pin@distance,
  pin distance=3ex,
  pin position/.store in=\tikz@pin@default@pos,
  pin position=above,
  pin edge/.store in=\tikz@pin@edge@style,
  pin edge={},
  tikz@pin@post/.code={\global\let\tikz@pin@edge@style@smuggle=\tikz@pin@edge@style},
  tikz@pre@pin@edge/.code={%
    \def\pgf@marshal{\tikzstyle{tikz@pin@options}=}
    \expandafter\pgf@marshal\expandafter[\tikz@pin@edge@style@smuggle]%
  }%
}

\long\def\tikz@parse@pin[#1]#2:#3\pgf@nil{%
  \def\tikz@temp{#3}%
  \ifx\tikz@temp\pgfutil@empty%
    % no position, use default
    \tikz@@parse@pin[#1]\tikz@pin@default@pos:#2:\pgf@nil%
  \else%
    \tikz@@parse@pin[#1]#2:#3\pgf@nil%
  \fi%
}

\long\def\tikz@@parse@pin[#1]#2:#3:\pgf@nil{%
  \tikzset{append after command={%
    \bgroup
      [current point is local=true]
      \pgfextra{\let\tikz@save@last@node=\tikzlastnode}%
      node [every pin,tikz@label@angle=#2,#1,%
            append after command={(\tikz@save@last@node) edge[every pin edge,tikz@pre@pin@edge,tikz@pin@options] (\tikzlastnode)},
            tikz@label@post=\tikz@pin@distance,tikz@pin@post]
        {#3}
    \egroup%
  }}
}


% Label and pin options

\tikzset{
  label/.code={\pgfutil@ifnextchar[{\tikz@parse@label}{\tikz@parse@label[]}#1:\pgf@nil},%}
  label distance/.store in=\tikz@label@distance,
  label distance=0pt,
  label position/.store in=\tikz@label@default@pos,
  label position=above,
  absolute/.is if=tikz@absolute,
  tikz@label@angle/.store in=\tikz@label@angle
}

\newif\iftikz@absolute
\def\tikz@on@text{center}

\tikzset{tikz@label@post/.code 2 args={
  \edef\tikz@label@angle{\tikz@label@angle}%
  \csname tikz@label@angle@is@\tikz@label@angle\endcsname
  \ifx\tikz@label@angle\tikz@on@text%
    \def\tikz@node@at{\pgfpointanchor{\tikzlastnode}{center}}%
    \def\tikz@anchor{center}%
  \else%
    \iftikz@absolute%
      \pgftransformreset%
      \pgf@process{%
        \pgfpointshapeborder{\tikzlastnode}%
        {\pgfpointadd{\pgfpointanchor{\tikzlastnode}{center}}{\pgfpointpolar{\tikz@label@angle}{1pt}}}}%
      \edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
      \tikz@compute@direction{\tikz@label@angle}%
      \tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@label@angle}{#1}}}%  
    \else%
      \pgf@process{\pgfpointanchor{\tikzlastnode}{\tikz@label@angle}}%
      \edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
      \pgf@xb=\pgf@x%
      \pgf@yb=\pgf@y%
      \pgf@process{\pgfpointanchor{\tikzlastnode}{center}}%
      \pgf@xc=\pgf@x%
      \pgf@yc=\pgf@y%
      \tikz@label@simplefalse%
      \iftikz@fullytransformed%
        \tikz@label@simpletrue%
      \else
        \ifdim\pgf@xc=\pgf@xb\relax%
          \ifdim\pgf@yc=\pgf@yb\relax%
            \tikz@label@simpletrue%
          \fi%
        \fi%
      \fi%
      \iftikz@label@simple%  
        \tikz@compute@direction{\tikz@label@angle}%
        \tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@label@angle}{#1}}}%  
      \else%
        \pgf@process{\pgfpointnormalised{%
            \pgfpointdiff{\pgfpointtransformed{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgfpointtransformed{\pgfqpoint{\pgf@xb}{\pgf@yb}}}}}%
        \edef\pgf@marshal{%
          \noexpand\tikz@addtransform{\noexpand\pgftransformshift{\noexpand\pgfpointscale{#1}{
                \noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}}}%
        \pgf@marshal%
        \pgf@xc=\pgf@x%
        \pgf@yc=\pgf@y%
        \pgf@x=\pgf@yc%
        \pgf@y=-\pgf@xc%
        \tikz@auto@anchor%
      \fi%
    \fi%
  \fi}
}
  
\newif\iftikz@label@simple%

\def\tikz@parse@label[#1]#2:#3\pgf@nil{%
  \def\tikz@temp{#3}%
  \ifx\tikz@temp\pgfutil@empty%
    % no position, use default
    \tikz@@parse@label[#1]\tikz@label@default@pos:#2:\pgf@nil%
  \else%
    \tikz@@parse@label[#1]#2:#3\pgf@nil%
  \fi%
}

\def\tikz@@parse@label[#1]#2:#3:\pgf@nil{%
  \tikzset{append after command={  
    \bgroup
    [current point is local=true]
    \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}%
    node
    [every label,%
    tikz@label@angle=#2,%
    #1,%
    tikz@label@post=\tikz@label@distance]%
    {#3}%
    \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}%
    \egroup%
  }}
}

\expandafter\def\csname tikz@label@angle@is@right\endcsname{\def\tikz@label@angle{0}}
\expandafter\def\csname tikz@label@angle@is@above right\endcsname{\def\tikz@label@angle{45}}
\expandafter\def\csname tikz@label@angle@is@above\endcsname{\def\tikz@label@angle{90}}
\expandafter\def\csname tikz@label@angle@is@above left\endcsname{\def\tikz@label@angle{135}}
\expandafter\def\csname tikz@label@angle@is@left\endcsname{\def\tikz@label@angle{180}}
\expandafter\def\csname tikz@label@angle@is@below left\endcsname{\def\tikz@label@angle{225}}
\expandafter\def\csname tikz@label@angle@is@below\endcsname{\def\tikz@label@angle{270}}
\expandafter\def\csname tikz@label@angle@is@below right\endcsname{\def\tikz@label@angle{315}}

\def\tikz@compute@direction#1{%
  \let\tikz@do@auto@anchor=\relax
  \pgfmathsetcount{\c@pgf@counta}{#1}%
  \ifnum\c@pgf@counta<0\relax
    \advance\c@pgf@counta by 360\relax%
  \fi%
  \ifnum\c@pgf@counta>359\relax
    \advance\c@pgf@counta by-360\relax%
  \fi%
  \ifnum\c@pgf@counta<4\relax%
    \def\tikz@anchor{west}%
  \else\ifnum\c@pgf@counta<87\relax%
    \def\tikz@anchor{south west}%
  \else\ifnum\c@pgf@counta<94\relax%
    \def\tikz@anchor{south}%
  \else\ifnum\c@pgf@counta<177\relax%
    \def\tikz@anchor{south east}%
  \else\ifnum\c@pgf@counta<184\relax%
    \def\tikz@anchor{east}%
  \else\ifnum\c@pgf@counta<267\relax%
    \def\tikz@anchor{north east}%
  \else\ifnum\c@pgf@counta<274\relax%
    \def\tikz@anchor{north}%
  \else\ifnum\c@pgf@counta<357\relax%
    \def\tikz@anchor{north west}%
  \else%
    \def\tikz@anchor{west}%
  \fi\fi\fi\fi\fi\fi\fi\fi%
}


% General node options
\tikzoption{name}{\edef\tikz@fig@name{#1}}

\tikzoption{at}{\tikz@scan@one@point\tikz@set@at#1}
\def\tikz@set@at#1{\def\tikz@node@at{#1}}%

\tikzoption{shape}{\edef\tikz@shape{#1}}

\tikzoption{nodes}{\tikzstyle{every node}+=[#1]}

\tikzset{alias/.code={\tikz@fig@mustbenamed\expandafter\def\expandafter\tikz@alias\expandafter{\tikz@alias\pgfnodealias{#1}{\tikz@fig@name}}}}

% deprecated:
\def\tikzaddafternodepathoption#1{#1\tikzset{prefix after command={\pgfextra{#1}}}}
\tikzset{after node path/.style={append after command={#1}}}

\tikzoption{anchor}{\def\tikz@anchor{#1}\let\tikz@do@auto@anchor=\relax}

\tikzoption{left}[]{\def\tikz@anchor{east}\tikz@possibly@transform{x}{-}{#1}}
\tikzoption{right}[]{\def\tikz@anchor{west}\tikz@possibly@transform{x}{}{#1}}
\tikzoption{above}[]{\def\tikz@anchor{south}\tikz@possibly@transform{y}{}{#1}}
\tikzoption{below}[]{\def\tikz@anchor{north}\tikz@possibly@transform{y}{-}{#1}}
\tikzoption{above left}[]%
  {\def\tikz@anchor{south east}%
    \tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{}{#1}}
\tikzoption{above right}[]%
  {\def\tikz@anchor{south west}%
    \tikz@possibly@transform{x}{}{#1}\tikz@possibly@transform{y}{}{#1}}
\tikzoption{below left}[]%
  {\def\tikz@anchor{north east}%
    \tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{-}{#1}}
\tikzoption{below right}[]%
  {\def\tikz@anchor{north west}%
    \tikz@possibly@transform{x}{}{#1}\tikz@possibly@transform{y}{-}{#1}}

\tikzoption{node distance}{\def\tikz@node@distance{#1}}
\def\tikz@node@distance{1cm}

% The following are deprecated:
\tikzoption{above of}{\tikz@of{#1}{90}}%
\tikzoption{below of}{\tikz@of{#1}{-90}}%
\tikzoption{left of}{\tikz@of{#1}{180}}%
\tikzoption{right of}{\tikz@of{#1}{0}}%
\tikzoption{above left of}{\tikz@of{#1}{135}}%
\tikzoption{below left of}{\tikz@of{#1}{-135}}%
\tikzoption{above right of}{\tikz@of{#1}{45}}%
\tikzoption{below right of}{\tikz@of{#1}{-45}}%
\def\tikz@of#1#2{%
  \def\tikz@anchor{center}%
  \let\tikz@do@auto@anchor=\relax%
  \tikz@addtransform{%
    \expandafter\tikz@extract@node@dist\tikz@node@distance and\pgf@stop%
    \pgftransformshift{\pgfpointpolar{#2}{\tikz@extracted@node@distance}}}%
  \def\tikz@node@at{\pgfpointanchor{#1}{center}}}
\def\tikz@extract@node@dist#1and#2\pgf@stop{%
  \def\tikz@extracted@node@distance{#1}}  


\tikzoption{transform shape}[true]{%
  \csname tikz@fullytransformed#1\endcsname%
  \iftikz@fullytransformed%
    \pgfresetnontranslationattimefalse%
  \else%
    \pgfresetnontranslationattimetrue%
  \fi%
}

\newif\iftikz@fullytransformed
\pgfresetnontranslationattimetrue%

\def\tikz@anchor{center}%
\def\tikz@shape{rectangle}%

\def\tikz@possibly@transform#1#2#3{%
  \let\tikz@do@auto@anchor=\relax%
  \def\tikz@test{#3}%
  \ifx\tikz@test\pgfutil@empty%
  \else%
    \pgfmathsetlength{\pgf@x}{#3}%
    \pgf@x=#2\pgf@x\relax%
    \edef\tikz@marshal{\noexpand\tikz@addtransform{%
        \expandafter\noexpand\csname  pgftransform#1shift\endcsname{\the\pgf@x}}}% 
    \tikz@marshal%
  \fi%
}


% Inter-picture options
\tikzoption{remember picture}[true]{\csname pgfrememberpicturepositiononpage#1\endcsname}
\tikzoption{overlay}[]{\pgf@relevantforpicturesizefalse}



% Line/curve label placement options
\tikzoption{sloped}[true]{\csname pgfslopedattime#1\endcsname}
\tikzoption{allow upside down}[true]{\csname pgfallowupsidedownattime#1\endcsname}

\tikzoption{pos}{\edef\tikz@time{#1}}

\tikzoption{auto}[]{\csname tikz@install@auto@anchor@#1\endcsname}
\tikzoption{swap}[]{%
  \def\tikz@temp{left}%
  \ifx\tikz@auto@anchor@direction\tikz@temp%
    \def\tikz@auto@anchor@direction{right}%
  \else%
    \def\tikz@auto@anchor@direction{left}%
  \fi%
}

\def\tikz@install@auto@anchor@{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on}
\def\tikz@install@auto@anchor@false{\let\tikz@do@auto@anchor=\relax}
\def\tikz@install@auto@anchor@left{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{left}}
\def\tikz@install@auto@anchor@right{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{right}}

\let\tikz@do@auto@anchor=\relax%

\def\tikz@auto@anchor@on{\csname tikz@auto@anchor@\tikz@auto@anchor@direction\endcsname}

\def\tikz@auto@anchor@left{\tikz@auto@pre\tikz@auto@anchor\tikz@auto@post}
\def\tikz@auto@anchor@right{\tikz@auto@pre\tikz@auto@anchor@prime\tikz@auto@post}

\def\tikz@auto@anchor@direction{left}

% Text options
\tikzoption{text}{\def\tikz@textcolor{#1}}
\tikzoption{font}{\def\tikz@textfont{#1}}
\tikzoption{text opacity}{\def\tikz@textopacity{#1}}
\tikzoption{text width}{\def\tikz@text@width{#1}}
\tikzoption{text height}{\def\tikz@text@height{#1}}
\tikzoption{text depth}{\def\tikz@text@depth{#1}}
\tikzoption{text ragged}[]%
{\def\tikz@text@action{\raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}
\tikzoption{text badly ragged}[]{\def\tikz@text@action{\raggedright\relax}}
\tikzoption{text ragged left}[]%
{\def\tikz@text@action{\raggedleft\leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}
\tikzoption{text badly ragged left}[]{\def\tikz@text@action{\raggedleft\relax}}
\tikzoption{text justified}[]{\def\tikz@text@action{\leftskip0pt\rightskip0pt\relax}}
\tikzoption{text centered}[]{\def\tikz@text@action{%
  \leftskip0pt plus2em%
  \rightskip0pt plus2em%
  \spaceskip.3333em \xspaceskip.5em%
  \parfillskip=0pt%
  \let\\=\@centercr% for latex
  \relax}}
\tikzoption{text badly centered}[]%
{\def\tikz@text@action{%
  \let\\=\@centercr% for latex
  \parfillskip=0pt%
  \rightskip\@flushglue%
  \leftskip\@flushglue\relax}}

\let\tikz@text@width=\pgfutil@empty
\let\tikz@text@height=\pgfutil@empty
\let\tikz@text@depth=\pgfutil@empty
\let\tikz@textcolor=\pgfutil@empty
\let\tikz@textfont=\pgfutil@empty
\let\tikz@textopacity=\pgfutil@empty

\def\tikz@text@action{\raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}


% Alignment
\tikzset{
  node halign header/.initial=,
  align/.is choice,
  align/left/.style  ={text ragged,node halign header=\tikz@align@left@header},
  align/flush left/.style  ={text badly ragged,node halign header=\tikz@align@left@header},
  align/right/.style ={text ragged left,node halign header=\tikz@align@right@header},
  align/flush right/.style ={text badly ragged left,node halign header=\tikz@align@right@header},
  align/center/.style={text centered,node halign header=\tikz@align@center@header},
  align/flush center/.style={text badly centered,node halign header=\tikz@align@center@header},
  align/justify/.style ={text justified,node halign header=\tikz@align@left@header},
  align/none/.style ={text justified,node halign header=}
}
\def\tikz@align@left@header{##\hfil\cr}
\def\tikz@align@right@header{\hfil##\cr}
\def\tikz@align@center@header{\hfil##\hfil\cr}



% Arrow options
\tikzoption{arrows}{\tikz@processarrows{#1}}

\tikzoption{>}{%
  \tikz@set@pointed{\csname pgf@arrows@invert#1\endcsname}{#1}%
  \expandafter\tikz@processarrows\expandafter{\tikz@current@arrows}%
}

\tikzoption{shorten <}{\pgfsetshortenstart{#1}}
\tikzoption{shorten >}{\pgfsetshortenend{#1}}

\def\tikz@set@pointed#1#2{%
  \pgfutil@ifundefined{pgf@arrow@code@tikze@>@#2}
  {%
    \pgfarrowsdeclarealias{tikzs@<@#2}{tikze@>@#2}{#1}{#2}%
    \pgfarrowsdeclarereversed{tikzs@>@#2}{tikze@<@#2}{#1}{#2}%
    \pgfarrowsdeclarecombine*{tikz@|<@#2}{tikz@>|@#2}{#1}{#2}{|}{|}%
    \pgfarrowsdeclaredouble[\pgflinewidth]{tikzs@<<@#2}{tikze@>>@#2}{#1}{#2}%<<
    \pgfarrowsdeclarereversed{tikzs@>>@#2}{tikze@<<@#2}{tikzs@<<@#2}{tikze@>>@#2}%<<
  }{}%
  \pgfutil@namedef{tikz@special@arrow@start<}{tikzs@<@#2}%
  \pgfutil@namedef{tikz@special@arrow@end>}{tikze@>@#2}%
  \pgfutil@namedef{tikz@special@arrow@start>}{tikzs@>@#2}%
  \pgfutil@namedef{tikz@special@arrow@end<}{tikze@<@#2}%
  \pgfutil@namedef{tikz@special@arrow@start|<}{tikz@|<@#2}%
  \pgfutil@namedef{tikz@special@arrow@end>|}{tikz@>|@#2}%
  \pgfutil@namedef{tikz@special@arrow@start<<}{tikzs@<<@#2}%
  \pgfutil@namedef{tikz@special@arrow@end>>}{tikze@>>@#2}%<<
  \pgfutil@namedef{tikz@special@arrow@start>>}{tikzs@>>@#2}%<<
  \pgfutil@namedef{tikz@special@arrow@end<<}{tikze@<<@#2}%<<
}

\def\tikz@processarrows#1{%
  \def\tikz@current@arrows{#1}%
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\pgfutil@empty%
  \else%
    \tikz@@processarrows#1\@nil
  \fi%
}
\def\tikz@@processarrows#1-#2\@nil{%
  \expandafter\ifx\csname tikz@special@arrow@start#1\endcsname\relax%
    \pgfsetarrowsstart{#1}
  \else%
    \pgfsetarrowsstart{\csname tikz@special@arrow@start#1\endcsname}%
  \fi%
  \expandafter\ifx\csname tikz@special@arrow@end#2\endcsname\relax%
    \pgfsetarrowsend{#2}
  \else%
    \pgfsetarrowsend{\csname tikz@special@arrow@end#2\endcsname}%
  \fi%
}

\tikz@set@pointed{\pgf@arrows@invertto}{to}
\def\tikz@current@arrows{-}

% Parabola options
\tikzoption{bend}{\tikz@scan@one@point\tikz@set@parabola@bend#1\relax}%
\tikzoption{bend pos}{\def\tikz@parabola@bend@factor{#1}}
\tikzoption{parabola height}{%
  \def\tikz@parabola@bend@factor{.5}%
  \def\tikz@parabola@bend{\pgfpointadd{\pgfpoint{0pt}{#1}}{\tikz@last@position@saved}}}

\def\tikz@parabola@bend{\tikz@last@position@saved}
\def\tikz@parabola@bend@factor{0}

\def\tikz@set@parabola@bend#1{\def\tikz@parabola@bend{#1}}

% Axis options
\tikzoption{domain}{\edef\tikz@plot@domain{#1}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax}
\tikzoption{range}{\def\tikz@plot@range{#1}}

% Plot options
\tikzoption{smooth}[]{\let\tikz@plot@handler=\pgfplothandlercurveto}
\tikzoption{smooth cycle}[]{\let\tikz@plot@handler=\pgfplothandlerclosedcurve}
\tikzoption{sharp plot}[]{\let\tikz@plot@handler\pgfplothandlerlineto}

\tikzoption{tension}{\pgfsetplottension{#1}}

\tikzoption{xcomb}[]{\let\tikz@plot@handler=\pgfplothandlerxcomb}
\tikzoption{ycomb}[]{\let\tikz@plot@handler=\pgfplothandlerycomb}
\tikzoption{polar comb}[]{\let\tikz@plot@handler=\pgfplothandlerpolarcomb}
\tikzoption{ybar}[]{\let\tikz@plot@handler=\pgfplothandlerybar}
\tikzoption{ybar interval}[]{\let\tikz@plot@handler=\pgfplothandlerybarinterval}
\tikzoption{xbar interval}[]{\let\tikz@plot@handler=\pgfplothandlerxbarinterval}
\tikzoption{xbar}[]{\let\tikz@plot@handler=\pgfplothandlerxbar}
\tikzoption{const plot}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlineto}
\tikzoption{const plot mark left}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlineto}
\tikzoption{const plot mark right}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlinetomarkright}
\tikzoption{jump mark right}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkright}
\tikzoption{jump mark left}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkleft}

\tikzoption{raw gnuplot}[true]{\csname tikz@plot@raw@gnuplot#1\endcsname}
\tikzoption{prefix}{\def\tikz@plot@prefix{#1}}
\tikzoption{id}{\def\tikz@plot@id{#1}}

\tikzoption{samples}{\def\tikz@plot@samples{#1}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax}
\tikzoption{samples at}{\def\tikz@plot@samplesat{#1}}
\tikzoption{parametric}[true]{\csname tikz@plot@parametric#1\endcsname}

\tikzoption{variable}{\def\tikz@plot@var{#1}}

\tikzoption{only marks}[]{\let\tikz@plot@handler\pgfplothandlerdiscard}

\tikzoption{mark}{%
	\def\tikz@plot@mark{#1}%
	\def\tikz@temp{none}%
	\ifx\tikz@temp\tikz@plot@mark
		\let\tikz@plot@mark=\pgfutil@empty
	\fi
}
\tikzset{
	no marks/.style={mark=none},%
	no markers/.style={mark=none},%
	every mark/.style={},
	mark options/.style={%
		every mark/.style={#1}%
	}}
\tikzoption{mark size}{\pgfsetplotmarksize{#1}}

\tikzoption{mark indices}{\def\tikz@mark@list{#1}}
\tikzoption{mark phase}{\pgfsetplotmarkphase{#1}}
\tikzoption{mark repeat}{\pgfsetplotmarkrepeat{#1}}

\let\tikz@mark@list=\pgfutil@empty

\let\tikz@plot@handler=\pgfplothandlerlineto
\let\tikz@plot@mark=\pgfutil@empty

\def\tikz@plot@samples{25}
\def\tikz@plot@domain{-5:5}
\def\tikz@plot@var{\x}
\def\tikz@plot@samplesat{-5,-4.5833333,...,5}
\def\tikz@plot@samples@recalc#1:#2\relax{%
  \pgfmathparse{#1}%
  \let\tikz@temp@start=\pgfmathresult%
  \pgfmathparse{#2}%
  \let\tikz@temp@end=\pgfmathresult%
  \pgfmathparse{\tikz@temp@start+(\tikz@temp@end-\tikz@temp@start)/(\tikz@plot@samples-1)}%
  \edef\tikz@plot@samplesat{\tikz@temp@start,\pgfmathresult,...,\tikz@temp@end}%
}


\def\tikz@plot@prefix{\jobname.}
\def\tikz@plot@id{pgf-plot}

\newif\iftikz@plot@parametric
\newif\iftikz@plot@raw@gnuplot


% To options
\tikzoption{to path}{\def\tikz@to@path{#1}}

\def\tikz@to@path{-- (\tikztotarget) \tikztonodes}


% After command options
\tikzset{
  append after command/.code=\expandafter\def\expandafter\tikz@after@path\expandafter{\tikz@after@path#1},
  prefix after command/.code={%
    \def\tikz@temp{#1}%
    \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter\tikz@after@path%
    \expandafter\expandafter\expandafter{%
      \expandafter\tikz@temp\tikz@after@path}%
  }
}
\let\tikz@after@path\pgfutil@empty


% Tree options
\newif\iftikz@child@missing
\pgfkeys{/tikz/missing/.is if=tikz@child@missing}

\tikzoption{edge from parent path}{\def\tikz@edge@to@parent@path{#1}}

\tikzoption{parent anchor}{\def\tikzparentanchor{.#1}\ifx\tikzparentanchor\tikz@border@text\let\tikzparentanchor\pgfutil@empty\fi}
\tikzoption{child anchor}{\def\tikzchildanchor{.#1}\ifx\tikzchildanchor\tikz@border@text\let\tikzchildanchor\pgfutil@empty\fi}

\tikzoption{level distance}{\pgfmathsetlength\tikzleveldistance{#1}}
\tikzoption{sibling distance}{\pgfmathsetlength\tikzsiblingdistance{#1}}

\tikzoption{growth function}{\let\tikz@grow=#1}

\tikzset{grow siblings on line/.style={growth function=\tikz@grow@direction}}

\tikzoption{growth parent anchor}{\def\tikz@growth@anchor{#1}}
\tikzoption{grow}{\tikz@set@growth{#1}\edef\tikz@special@level{\the\tikztreelevel}}%
\tikzoption{grow'}{\tikz@set@growth{#1}\tikz@swap@growth\edef\tikz@special@level{\the\tikztreelevel}}%

\def\tikz@growth@anchor{center}

\def\tikz@special@level{-1}% never

\def\tikz@swap@growth{%
  % Swap left and right
  \let\tikz@temp=\tikz@angle@grow@right%
  \let\tikz@angle@grow@right=\tikz@angle@grow@left%
  \let\tikz@angle@grow@left=\tikz@temp%
}%

\def\tikz@set@growth#1{%
  \let\tikz@grow=\tikz@grow@direction%
  \expandafter\ifx\csname tikz@grow@direction@#1\endcsname\relax%
    \c@pgf@counta=#1\relax%
  \else%
    \c@pgf@counta=\csname tikz@grow@direction@#1\endcsname%
  \fi%
  \edef\tikz@angle@grow{\the\c@pgf@counta}%
  \advance\c@pgf@counta by-90\relax%
  \edef\tikz@angle@grow@left{\the\c@pgf@counta}%
  \advance\c@pgf@counta by180\relax%
  \edef\tikz@angle@grow@right{\the\c@pgf@counta}%
}

\def\tikz@border@text{.border}
\let\tikzparentanchor=\pgfutil@empty
\let\tikzchildanchor=\pgfutil@empty
\def\tikz@edge@to@parent@path{(\tikzparentnode\tikzparentanchor) -- (\tikzchildnode\tikzchildanchor)}

\tikzleveldistance=15mm
\tikzsiblingdistance=15mm

\def\tikz@grow@direction@down{-90}
\def\tikz@grow@direction@up{90}
\def\tikz@grow@direction@left{180}
\def\tikz@grow@direction@right{0}

\def\tikz@grow@direction@south{-90}
\def\tikz@grow@direction@north{90}
\def\tikz@grow@direction@west{180}
\def\tikz@grow@direction@east{0}

\expandafter\def\csname tikz@grow@direction@north east\endcsname{45}
\expandafter\def\csname tikz@grow@direction@north west\endcsname{135}
\expandafter\def\csname tikz@grow@direction@south east\endcsname{-45}
\expandafter\def\csname tikz@grow@direction@south west\endcsname{-135}

\def\tikz@grow@direction{%
  \pgftransformshift{\pgfpointpolar{\tikz@angle@grow}{\tikzleveldistance}}%
  \ifnum\tikztreelevel=\tikz@special@level%
  \else%
    \pgf@xc=.5\tikzsiblingdistance%
    \c@pgf@counta=\tikznumberofchildren%
    \advance\c@pgf@counta by1\relax%
    \pgfutil@tempdima=\c@pgf@counta\pgf@xc%
    \pgftransformshift{\pgfpointpolar{\tikz@angle@grow@left}{\pgfutil@tempdima}}%
    \pgftransformshift{\pgfpointpolar{\tikz@angle@grow@right}{\tikznumberofcurrentchild\tikzsiblingdistance}}%
  \fi%
}

\tikzset{grow=down}


% Snakes are in a lib:
\tikzset{snake/.code=\PackageError{tikz}{You need to say \string\usetikzlibrary{snakes}}{}}

% Decorations
\tikzset{decorate/.code=\PackageError{tikz}{You need to load a  decoration library}{}}

% Matrix options
\usepgfmodule{matrix}

\tikzoption{matrix}[true]{\csname tikz@is@matrix#1\endcsname}

\tikzoption{matrix anchor}{\def\tikz@matrix@anchor{#1}}

\tikzoption{column sep}{\def\pgfmatrixcolumnsep{#1}}
\tikzoption{row sep}{\def\pgfmatrixrowsep{#1}}

\tikzoption{cells}{\tikzstyle{every cell}+=[#1]}

\tikzoption{ampersand replacement}{\def\tikz@ampersand@replacement{#1}}

\newif\iftikz@is@matrix
\let\tikz@matrix@anchor=\pgfutil@empty
\let\tikz@ampersand@replacement=\pgfutil@empty


% Execute option
\tikzoption{execute at begin picture}{\expandafter\def\expandafter\tikz@atbegin@picture\expandafter{\tikz@atbegin@picture#1}}
\tikzoption{execute at end picture}{\expandafter\def\expandafter\tikz@atend@picture\expandafter{\tikz@atend@picture#1}}
\tikzoption{execute at begin scope}{\expandafter\def\expandafter\tikz@atbegin@scope\expandafter{\tikz@atbegin@scope#1}}
\tikzoption{execute at end scope}{\expandafter\def\expandafter\tikz@atend@scope\expandafter{\tikz@atend@scope#1}}
\tikzoption{execute at begin to}{\expandafter\def\expandafter\tikz@atbegin@to\expandafter{\tikz@atbegin@to#1}}
\tikzoption{execute at end to}{\expandafter\def\expandafter\tikz@atend@to\expandafter{\tikz@atend@to#1}}
\tikzoption{execute at begin node}{\expandafter\def\expandafter\tikz@atbegin@node\expandafter{\tikz@atbegin@node#1}}
\tikzoption{execute at end node}{\expandafter\def\expandafter\tikz@atend@node\expandafter{\tikz@atend@node#1}}
\tikzoption{execute at begin cell}{\expandafter\def\expandafter\tikz@atbegin@cell\expandafter{\tikz@atbegin@cell#1}}
\tikzoption{execute at end cell}{\expandafter\def\expandafter\tikz@atend@cell\expandafter{\tikz@atend@cell#1}}
\tikzoption{execute at empty cell}{\expandafter\def\expandafter\tikz@at@emptycell\expandafter{\tikz@at@emptycell#1}}

\let\tikz@atbegin@picture=\pgfutil@empty
\let\tikz@atend@picture=\pgfutil@empty
\let\tikz@atbegin@scope=\pgfutil@empty
\let\tikz@atend@scope=\pgfutil@empty
\let\tikz@atbegin@to=\pgfutil@empty
\let\tikz@atend@to=\pgfutil@empty
\let\tikz@atbegin@node=\pgfutil@empty
\let\tikz@atend@node=\pgfutil@empty
\let\tikz@atbegin@cell=\pgfutil@empty
\let\tikz@atend@cell=\pgfutil@empty
\let\tikz@at@emptycell=\pgfutil@empty


% Pre and post actions
\tikzset{preaction/.code=\expandafter\def\expandafter\tikz@preactions\expandafter{\tikz@preactions\tikz@extra@preaction{#1}}}
\tikzset{postaction/.code=\expandafter\def\expandafter\tikz@postactions\expandafter{\tikz@postactions\tikz@extra@postaction{#1}}}
\let\tikz@preactions=\pgfutil@empty
\let\tikz@postactions=\pgfutil@empty

% Styles
\tikzoption{set style}{\tikzstyle#1}

% Handled in a special way.
\def\tikzstyle{\pgfutil@ifnextchar\bgroup\tikz@style@parseA\tikz@style@parseB}
\def\tikz@style@parseB#1={\tikz@style@parseA{#1}=}
\def\tikz@style@parseA#1#2=#3[#4]{% check for an optional argument
  \pgfutil@in@[{#2}%]
  \ifpgfutil@in@%
    \tikz@style@parseC{#1}#2={#4}%
  \else%
    \tikz@style@parseD{#1}#2={#4}%
  \fi%
}%

\def\tikz@style@parseC#1[#2]#3=#4{%
  \pgfkeys{/tikz/#1/.default={#2}}%
  \pgfutil@in@+{#3}%
  \ifpgfutil@in@%
    \pgfkeys{/tikz/#1/.append style={#4}}%
  \else%
    \pgfkeys{/tikz/#1/.style={#4}}%
  \fi}
\def\tikz@style@parseD#1#2=#3{%
  \pgfutil@in@+{#2}%
  \ifpgfutil@in@%
    \pgfkeys{/tikz/#1/.append style={#3}}%
  \else%
    \pgfkeys{/tikz/#1/.style={#3}}%
  \fi}


%
%
% Predefined styles
%
%

\tikzstyle{help lines}=              [color=gray,line width=0.2pt]

\tikzstyle{every picture}=           []
\tikzstyle{every path}=              []
\tikzstyle{every scope}=             []
\tikzstyle{every plot}=              []
\tikzstyle{every node}=              []
\tikzstyle{every child}=             []
\tikzstyle{every child node}=        []
\tikzstyle{every to}=                []
\tikzstyle{every cell}=              []
\tikzstyle{every matrix}=            []
\tikzstyle{every edge}=              [draw]
\tikzstyle{every label}=             [draw=none,fill=none]
\tikzstyle{every pin}=               [draw=none,fill=none]
\tikzstyle{every pin edge}=          [help lines]

\tikzstyle{ultra thin}=              [line width=0.1pt]
\tikzstyle{very thin}=               [line width=0.2pt]
\tikzstyle{thin}=                    [line width=0.4pt]
\tikzstyle{semithick}=               [line width=0.6pt]
\tikzstyle{thick}=                   [line width=0.8pt]
\tikzstyle{very thick}=              [line width=1.2pt]
\tikzstyle{ultra thick}=             [line width=1.6pt]

\tikzstyle{solid}=                   [dash pattern=]
\tikzstyle{dotted}=                  [dash pattern=on \pgflinewidth off 2pt]
\tikzstyle{densely dotted}=          [dash pattern=on \pgflinewidth off 1pt]
\tikzstyle{loosely dotted}=          [dash pattern=on \pgflinewidth off 4pt]
\tikzstyle{dashed}=                  [dash pattern=on 3pt off 3pt]
\tikzstyle{densely dashed}=          [dash pattern=on 3pt off 2pt]
\tikzstyle{loosely dashed}=          [dash pattern=on 3pt off 6pt]
\tikzstyle{dashdotted}=              [dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt]
\tikzstyle{densely dashdotted}=      [dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt]
\tikzstyle{loosely dashdotted}=      [dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt]
\tikzstyle{dashdotdotted}=           [dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt on \the\pgflinewidth off 2pt]
\tikzstyle{densely dashdotdotted}=   [dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt on \the\pgflinewidth off 1pt]
\tikzstyle{loosely dashdotdotted}=   [dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt on \the\pgflinewidth off 4pt]


\tikzstyle{transparent}=             [opacity=0]
\tikzstyle{ultra nearly transparent}=[opacity=0.05]
\tikzstyle{very nearly transparent}= [opacity=0.1]
\tikzstyle{nearly transparent}=      [opacity=0.25]
\tikzstyle{semitransparent}=         [opacity=0.5]
\tikzstyle{nearly opaque}=           [opacity=0.75]
\tikzstyle{very nearly opaque}=      [opacity=0.9]
\tikzstyle{ultra nearly opaque}=     [opacity=0.95]
\tikzstyle{opaque}=                  [opacity=1]

\tikzstyle{at start}=                [pos=0]
\tikzstyle{very near start}=         [pos=0.125]
\tikzstyle{near start}=              [pos=0.25]
\tikzstyle{midway}=                  [pos=0.5]
\tikzstyle{near end}=                [pos=0.75]
\tikzstyle{very near end}=           [pos=0.875]
\tikzstyle{at end}=                  [pos=1]

\tikzstyle{bend at start}=           [bend pos=0,bend={+(0,0)}]
\tikzstyle{bend at end}=             [bend pos=1,bend={+(0,0)}]

\tikzstyle{edge from parent}=        [draw]



%
% Setting keys
%

\pgfkeys{/tikz/style/.style=#1}

\pgfkeys{/tikz/.unknown/.code=%
  % Is it a pgf key?
  \let\tikz@key\pgfkeyscurrentname% 
  \pgfkeys{/pgf/\tikz@key/.try={#1}}%
  \ifpgfkeyssuccess%
  \else%
    \expandafter\pgfutil@in@\expandafter!\expandafter{\tikz@key}%
    \ifpgfutil@in@%
      % this is a color!
      \expandafter\tikz@addoption\expandafter{\expandafter\pgfutil@color\expandafter{\tikz@key}}%
      \edef\tikz@textcolor{\tikz@key}%
    \else%
      \pgfutil@doifcolorelse{\tikz@key}
      { %     
        \expandafter\tikz@addoption\expandafter{\expandafter\pgfutil@color\expandafter{\tikz@key}}%
        \edef\tikz@textcolor{\tikz@key}%
      }%
      {%
        % Ok, second chance: This might be an arrow specification:
        \expandafter\pgfutil@in@\expandafter-\expandafter{\tikz@key}
        \ifpgfutil@in@%
          % Ah, an arrow spec!
          \expandafter\tikz@processarrows\expandafter{\tikz@key}%
        \else%
          % Ok, third chance: A shape!
          \expandafter\ifx\csname pgf@sh@s@\tikz@key\endcsname\relax%
            \pgfkeys{/errors/unknown key={/tikz/\tikz@key}{#1}}%
          \else%
            \edef\tikz@shape{\tikz@key}%
          \fi%
        \fi%
      }%
    \fi%
  \fi%
}


%
% Main TikZ Environment
%

\def\tikzpicture{\pgfutil@ifnextchar[\tikz@picture{\tikz@picture[]}}%}
\def\tikz@picture[#1]{%
  \pgfpicture%
  \let\tikz@atbegin@picture=\pgfutil@empty%
  \let\tikz@atend@picture=\pgfutil@empty%
  \let\tikz@transform=\relax%
  \def\tikz@time{.5}%
  \tikz@installcommands\scope[every picture,#1]%
  \expandafter\tikz@atbegin@picture%
  \tikz@lib@scope@check%
}
\def\endtikzpicture{%
    \tikz@atend@picture%
    \global\let\pgf@shift@baseline=\pgf@baseline%
    \global\let\pgf@trimleft@final=\pgf@trimleft%
    \global\let\pgf@trimright@final=\pgf@trimright%
    \global\let\pgf@remember@smuggle=\ifpgfrememberpicturepositiononpage%
    \endscope%
    \let\pgf@baseline=\pgf@shift@baseline%
    \let\pgf@trimleft=\pgf@trimleft@final%
    \let\pgf@trimright=\pgf@trimright@final%
    \let\ifpgfrememberpicturepositiononpage=\pgf@remember@smuggle%
  \endpgfpicture}
  

% Inlined picture
%
% #1 - some code to be put in a tikzpicture environment.
%
% If the command is not followed by braces, everything up to the next
% semicolon is used as argument.
%
% Example:
%
% The rectangle \tikz{\draw (0,0) rectangle (1em,1ex)} has width 1em and
% height 1ex.

% This code does not work for some inline \tikz. For example
% \tikz\foreach \x in {1,...,10} \draw (\x,0) circle (0.4cm);
% makes tikz crash.
% Begin suspected code
% \def\tikz{\pgfutil@ifnextchar[{\tikz@opt}{\tikz@opt[]}}
% \def\tikz@opt[#1]{\tikzpicture[#1]\pgfutil@ifnextchar\bgroup{\tikz@}{\tikz@@}}
% \def\tikz@{\bgroup\tikz@auto@end@pathtrue\aftergroup\endtikzpicture\let\pgf@temp=}
% \def\tikz@@{\begingroup\def\tikz@path@do@at@end{\endgroup\endtikzpicture}}
% End suspected code
% Begin old code
\def\tikz{\pgfutil@ifnextchar[{\tikz@opt}{\tikz@opt[]}}
\def\tikz@opt[#1]{\tikzpicture[#1]\pgfutil@ifnextchar\bgroup{\tikz@}{\tikz@@}}
\def\tikz@#1{#1\endtikzpicture}
\def\tikz@@{%
  \let\tikz@next=\tikz@collectnormalsemicolon%
  \ifnum\the\catcode`\;=\active\relax%
    \let\tikz@next=\tikz@collectactivesemicolon%
  \fi%
  \tikz@next}
\def\tikz@collectnormalsemicolon#1;{#1;\endtikzpicture}
{
  \catcode`\;=\active
  \gdef\tikz@collectactivesemicolon#1;{#1;\endtikzpicture}
}
% End old code

% Invokes '#1' if the command is invoked withing a tikzpicture and
% '#2' if not.
\def\tikzifinpicture#1#2{%
	\pgfutil@ifundefined{filldraw}{#2}{#1}% TT: This is a wrong
                                % test! Who uses this?...
}%

%
% Environment for scoping graphic state settings
%
\def\tikz@scope@env{\pgfutil@ifnextchar[\tikz@@scope@env{\tikz@@scope@env[]}}
\def\tikz@@scope@env[#1]{%
  \pgfscope%
  \begingroup%
  \let\tikz@atbegin@scope=\pgfutil@empty%
  \let\tikz@atend@scope=\pgfutil@empty%
  \let\tikz@options=\pgfutil@empty%
  \let\tikz@mode=\pgfutil@empty%
  \tikz@transparency@groupfalse%
  \tikzset{every scope/.try,#1}%
  \tikz@options%
  \iftikz@transparency@group\pgftransparencygroup\fi%
  \expandafter\tikz@atbegin@scope%
  \tikz@lib@scope@check%
}
\def\endtikz@scope@env{%
  \tikz@atend@scope%
  \iftikz@transparency@group\endpgftransparencygroup\fi%
  \endgroup%
  \endpgfscope%
  \tikz@lib@scope@check%
}

% Install a shortcut command which is only valid inside of a
% tikzpicture.
%
% It works in the same way as the '\path' shortcut does: it introduces
% a \let#1=#2 at the beginning of tikzpicture.
%
% #1: shortcut command inside of tikzpicture
% #2: real command name
\def\tikzaddtikzonlycommandshortcutlet#1#2{%
	\expandafter\def\expandafter\tikz@installcommands\expandafter{\tikz@installcommands
		\let#1=#2
	}%
}%

% Has the same effect as \tikzaddtikzonlycommandshortcutlet but uses
% \def#1{#2} instead of \let.
\def\tikzaddtikzonlycommandshortcutdef#1#2{%
	\expandafter\def\expandafter\tikz@installcommands\expandafter{\tikz@installcommands
		\def#1{#2}%
	}%
}%

%
% Install the abbreviated commands
%
\def\tikz@installcommands{%
  \ifnum\the\catcode`\;=\active\relax\expandafter\let\expandafter\tikz@origsemi\expandafter=\tikz@activesemicolon\fi%
  \ifnum\the\catcode`\:=\active\relax\expandafter\let\expandafter\tikz@origcolon\expandafter=\tikz@activecolon\fi%
  \ifnum\the\catcode`\|=\active\relax\expandafter\let\expandafter\tikz@origbar\expandafter=\tikz@activebar\fi%
  \let\tikz@origscope=\scope%
  \let\tikz@origendscope=\endscope%
  \let\tikz@origstartscope=\startscope%
  \let\tikz@origstopscope=\stopscope%
  \let\tikz@origpath=\path%
  \let\tikz@origagainpath=\againpath%
  \let\tikz@origdraw=\draw%
  \let\tikz@origpattern=\pattern%
  \let\tikz@origfill=\fill%
  \let\tikz@origfilldraw=\filldraw%
  \let\tikz@origshade=\shade%
  \let\tikz@origshadedraw=\shadedraw%
  \let\tikz@origclip=\clip%
  \let\tikz@origuseasboundingbox=\useasboundingbox%
  \let\tikz@orignode=\node%
  \let\tikz@origcoordinate=\coordinate%
  \let\tikz@origmatrix=\matrix%
  \let\tikz@origcalendar=\calendar%
  \let\tikz@origdv=\datavisualization%
  \let\tikz@origgraph=\graph%
  %
  \tikz@deactivatthings%
  %
  \let\scope=\tikz@scope@env%
  \let\endscope=\endtikz@scope@env%
  \let\startscope=\scope%
  \let\stopscope=\endscope%
  \let\path=\tikz@command@path%
  \let\againpath=\tikz@command@againpath%
  %
  \def\draw{\path[draw]}
  \def\pattern{\path[pattern]}
  \def\fill{\path[fill]}
  \def\filldraw{\path[fill,draw]}
  \def\shade{\path[shade]}
  \def\shadedraw{\path[shade,draw]}
  \def\clip{\path[clip]}
  \def\graph{\path graph}
  \def\useasboundingbox{\path[use as bounding box]}
  \def\node{\tikz@path@overlay{node}}
  \def\coordinate{\tikz@path@overlay{coordinate}}
  \def\matrix{\tikz@path@overlay{node[matrix]}}
  \def\calendar{\tikz@lib@cal@calendar}% 
  \def\datavisualization{\tikz@lib@datavisualization}%
}
\ifx\tikz@lib@cal@calendar\@undefined
\def\tikz@lib@cal@calendar{\PackageError{tikz}{You need to say \string\usetikzlibrary{calendar} to use the \string\calendar{} command}{}}
\fi
\ifx\tikz@lib@datavisualization\@undefined
\def\tikz@lib@datavisualization{\PackageError{tikz}{You need to say \string\usetikzlibrary{datavisualization} to use the \string\datavisualization{} command}{}}
\fi

\def\tikz@path@overlay#1{%
  \let\tikz@signal@path=\tikz@signal@path% for detection at begin of matrix cell
  \pgfutil@ifnextchar<{\tikz@path@overlayed{#1}}{\path #1}}
\def\tikz@path@overlayed#1<#2>{\path<#2> #1}

\def\tikz@uninstallcommands{%
  \ifnum\the\catcode`\;=\active\relax\expandafter\let\tikz@activesemicolon=\tikz@origsemi\fi%
  \ifnum\the\catcode`\:=\active\relax\expandafter\let\tikz@activecolon=\tikz@origcolon\fi%
  \ifnum\the\catcode`\|=\active\relax\expandafter\let\tikz@activebar=\tikz@origbar\fi%
  \let\scope=\tikz@origscope%
  \let\endscope=\tikz@origendscope%
  \let\startscope=\tikz@origstartscope%
  \let\stopscope=\tikz@origstopscope%
  \let\path=\tikz@origpath%
  \let\againpath=\tikz@origagainpath%
  \let\draw=\tikz@origdraw%
  \let\pattern=\tikz@origpattern%
  \let\fill=\tikz@origfill%
  \let\filldraw=\tikz@origfilldraw%
  \let\shade=\tikz@origshade%
  \let\shadedraw=\tikz@origshadedraw%
  \let\clip=\tikz@origclip%
  \let\useasboundingbox=\tikz@origuseasboundingbox%
  \let\node=\tikz@orignode%
  \let\coordinate=\tikz@origcoordinate%
  \let\matrix=\tikz@origmatrix%
  \let\calendar=\tikz@origcalendar%
  \let\datavisualization=\tikz@origdv%
  \let\graph=\tikz@origgraph%
}


{
  \catcode`\;=12
  \gdef\tikz@nonactivesemicolon{;}
  \catcode`\:=12
  \gdef\tikz@nonactivecolon{:}
  \catcode`\|=12
  \gdef\tikz@nonactivebar{|}
  \catcode`\!=12
  \gdef\tikz@nonactiveexlmark{!}
  \catcode`\;=\active
  \catcode`\:=\active
  \catcode`\|=\active
  \catcode`\"=\active
  \catcode`\!=\active
  \gdef\tikz@activesemicolon{;}%
  \gdef\tikz@activecolon{:}%
  \gdef\tikz@activebar{|}%
  \gdef\tikz@activequotes{"}%
  \gdef\tikz@activeexlmark{!}%
  \gdef\tikz@deactivatthings{%
    \def;{\tikz@nonactivesemicolon}%
    \def:{\tikz@nonactivecolon}%
    \def|{\tikz@nonactivebar}%
	\def!{\tikz@nonactiveexlmark}%
  }
}





% Constructs a path and draws/fills them according to the current
% settings.  

\def\tikz@command@path{%
  \let\tikz@signal@path=\tikz@signal@path% for detection at begin of matrix cell
  \pgfutil@ifnextchar[{\tikz@check@earg}%]
  {\pgfutil@ifnextchar<{\tikz@doopt}{\tikz@@command@path}}}
\def\tikz@signal@path{\tikz@signal@path}%
\def\tikz@check@earg[#1]{%
  \pgfutil@ifnextchar<{\tikz@swap@args[#1]}{\tikz@@command@path[#1]}}
\def\tikz@swap@args[#1]<#2>{\tikz@command@path<#2>[#1]}

\def\tikz@doopt{%
  \let\tikz@next=\tikz@eargnormalsemicolon%
  \ifnum\the\catcode`\;=\active\relax%
    \let\tikz@next=\tikz@eargactivesemicolon%
  \fi%
  \tikz@next}
\long\def\tikz@eargnormalsemicolon<#1>#2;{\alt<#1>{\tikz@@command@path#2;}{\tikz@path@do@at@end}}
{
  \catcode`\;=\active
  \long\global\def\tikz@eargactivesemicolon<#1>#2;{\alt<#1>{\tikz@@command@path#2;}{\tikz@path@do@at@end}}
}

\def\tikz@@command@path{%
  \edef\tikzscope@linewidth{\the\pgflinewidth}%
  \begingroup%
    \let\tikz@path@do@at@end=\tikz@lib@scope@check%
    \let\tikz@options=\pgfutil@empty%
    \let\tikz@mode=\pgfutil@empty%
    \let\tikz@moveto@waiting=\relax%
    \let\tikz@timer=\relax%
    \let\tikz@collected@onpath=\pgfutil@empty%
    \let\tikz@preactions=\pgfutil@empty%
    \let\tikz@postactions=\pgfutil@empty%
    \tikz@snakedfalse%
    \tikz@decoratepathfalse%
    \tikz@node@is@a@labelfalse%
    \tikz@expandcount=100\relax%
    \tikz@lastx=0pt%
    \tikz@lasty=0pt%
    \tikz@lastxsaved=0pt%
    \tikz@lastysaved=0pt%
    \tikzset{every path/.try}%
    \tikz@scan@next@command%
}
\def\tikz@scan@next@command{%
  \ifx\tikz@collected@onpath\pgfutil@empty%
  \else%
    \tikz@invoke@collected@onpath%
  \fi%
  \afterassignment\tikz@handle\let\@let@token=%
}
\newcount\tikz@expandcount

% Central dispatcher for commands
\def\tikz@handle{%
  \let\@next=\tikz@expand%
  \ifx\@let@token(%)
    \let\@next=\tikz@movetoabs%
  \else%
    \ifx\@let@token+%
      \let\@next=\tikz@movetorel%
    \else%
      \ifx\@let@token-%
        \let\@next=\tikz@lineto%
      \else%
        \ifx\@let@token.%
          \let\@next=\tikz@dot%
        \else%
          \ifx\@let@token r%
            \let\@next=\tikz@rect%
          \else%
            \ifx\@let@token n%
              \let\@next=\tikz@fig%
            \else%
              \ifx\@let@token[%]
                \let\@next=\tikz@parse@options%
              \else%
                \ifx\@let@token c%
                  \let\@next=\tikz@cchar%
                \else%
                  \ifx\@let@token\bgroup%
                    \let\@next=\tikz@beginscope%
                  \else%
                    \ifx\@let@token\egroup%
                      \let\@next=\tikz@endscope%
                    \else%
                      \ifx\@let@token;%
                        \let\@next=\tikz@finish%
                      \else%
                        \let\@next=\tikz@handle@more%
                      \fi%
                    \fi%
                  \fi%
                \fi%
              \fi%
            \fi%
          \fi%
        \fi%
      \fi%
    \fi%
  \fi%
  \@next%
}

% Continued...
\def\tikz@handle@more{%
  \ifx\@let@token a%
    \let\@next=\tikz@arcA%
  \else%
    \ifx\@let@token e%
      \let\@next=\tikz@e@char%
    \else%
      \ifx\@let@token g%
        \let\@next=\tikz@g@char%
      \else%
        \ifx\@let@token s%
           \let\@next=\tikz@schar%
        \else%
          \ifx\@let@token |%
             \let\@next=\tikz@vh@lineto%
          \else%
            \ifx\@let@token p%
              \let\@next=\tikz@pchar%
              \pgfsetmovetofirstplotpoint%
            \else%
              \ifx\@let@token t%
                \let\@next=\tikz@to%
              \else%
                \ifx\@let@token\pgfextra%
                  \let\@next=\tikz@extra%
                \else%
                  \ifx\@let@token\foreach%
                    \let\@next=\tikz@foreach%
                  \else%
                    \ifx\@let@token\pgf@stop%
                      \let\@next=\relax%
                    \else%
                      \ifx\@let@token\par%
                        \let\@next=\tikz@scan@next@command%
                      \else%
                        \ifx\@let@token d%
                          \let\@next=\tikz@decoration%
                        \else%
                          \ifx\@let@token l%
                            \let\@next=\tikz@l@char%\tikz@let@command%
                          \else%
                            \let\@next=\tikz@expand%
                          \fi%      
                        \fi%      
                      \fi%      
                    \fi%      
                  \fi%      
                \fi%      
              \fi%      
            \fi%  
          \fi%  
        \fi%
      \fi%
    \fi%
  \fi%
  \@next%
}

\def\tikz@l@char{%
  \pgfutil@ifnextchar e{\tikz@let@command}{%
    \pgfutil@ifnextchar i{\tikz@lsystem}{%
      \pgfutil@ifnextchar-{\tikz@@lsystem}{\tikz@expand}%
    }%
  }%
}

\def\tikz@lsystem{%
  \PackageError{tikz}{You need to say \string\usetikzlibrary{lindenmayersystems} to
    draw Lindenmayer systems}{}
}

\def\tikz@@lsystem{%
  \PackageError{tikz}{You need to say \string\usetikzlibrary{lindenmayersystems} to
    draw L-systems}{}
}

\def\tikz@pchar{\pgfutil@ifnextchar l{\tikz@plot}{\tikz@parabola}}
\def\tikz@cchar{%
  \pgfutil@ifnextchar i{\tikz@circle}%
  {\pgfutil@ifnextchar h{\tikz@children}{\tikz@cochar}}}%
\def\tikz@cochar o{%
  \pgfutil@ifnextchar o{\tikz@coordinate}{\tikz@cosine}}
\def\tikz@e@char{%
  \pgfutil@ifnextchar l{\tikz@ellipse}{\tikz@@e@char}}%
\def\tikz@@e@char dge{%
  \pgfutil@ifnextchar f{\tikz@edgetoparent}{\tikz@edge@plain}}%

\def\tikz@schar{\pgfutil@ifnextchar i{\tikz@sine}{\tikz@svg@path}}

\def\tikz@g@char r{\pgfutil@ifnextchar i{\tikz@grid}{\tikz@graph}}

% svg syntax
% svg[options] "..."

\def\tikz@svg@path{%
  \PackageError{tikz}{You need to say \string\usetikzlibrary{svg.path} to
    use the svg path command}{}
}


\def\tikz@finish{%
  % Rendering pipeline 
  % 
  % Step 1: Decorate path
  % 
  \iftikz@decoratepath%
    \tikz@lib@dec@decorate@path%
  \fi%
  % 
  % Step 1: Preactions
  % 
  \pgfsyssoftpath@getcurrentpath\tikz@actions@path%
  \edef\tikz@restorepathsize{%
    \global\pgf@pathmaxx=\the\pgf@pathmaxx%
    \global\pgf@pathmaxy=\the\pgf@pathmaxy%
    \global\pgf@pathminx=\the\pgf@pathminx%
    \global\pgf@pathminy=\the\pgf@pathminy%
  }%
  \tikz@preactions%
  %
  % Reset modes
  %
  \let\tikz@path@picture=\pgfutil@empty%
  \tikz@mode@fillfalse%
  \tikz@mode@drawfalse%
  \tikz@mode@doublefalse%
  \tikz@mode@clipfalse%
  \tikz@mode@boundaryfalse%
  \tikz@mode@fade@pathfalse%
  \tikz@mode@fade@scopefalse%
  \edef\tikz@pathextend{%
    {\noexpand\pgfqpoint{\the\pgf@pathminx}{\the\pgf@pathminy}}%
    {\noexpand\pgfqpoint{\the\pgf@pathmaxx}{\the\pgf@pathmaxy}}%
  }%
  \tikz@mode% installs the mode settings
  % Path fading counts as an option:
  \iftikz@mode@fade@path%
    \tikz@addoption{%
      \iftikz@fade@adjust%
        \pgfsetfadingforcurrentpath{\tikz@path@fading}{\tikz@do@fade@transform}%
      \else%
        \pgfsetfading{\tikz@path@fading}{\tikz@do@fade@transform}%
      \fi%
      \tikz@mode@fade@pathfalse% no more fading...
    }%
  \fi%
  % Rendering pipeline 
  %
  % Step 2: Install scope fading
  %
  \iftikz@mode@fade@scope%
    \iftikz@fade@adjust%
      \pgfsetfadingforcurrentpath{\tikz@scope@fading}{\tikz@do@fade@transform}%
    \else%
      \pgfsetfading{\tikz@scope@fading}{\tikz@do@fade@transform}%
    \fi%
    \tikz@mode@fade@scopefalse%
  \fi%
  %
  % Step 3: Setup options
  % 
  \ifx\tikz@options\pgfutil@empty%
  \else%
    \pgfsys@beginscope%
      \begingroup%
      \tikz@options%
  \fi%
  % 
  % Step 4: Do a fill if shade or a path picture follows.
  %
  \iftikz@mode@fill%
    \iftikz@mode@shade%
      \pgfsyssoftpath@getcurrentpath\tikz@temppath
      \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
      \pgfsyssoftpath@setcurrentpath\tikz@temppath%
      \pgfsyssoftpath@invokecurrentpath%
      \pgfsys@fill%
      \tikz@mode@fillfalse% no more filling...
    \else%
      \ifx\tikz@path@picture\pgfutil@empty%
      \else%
        \pgfsyssoftpath@getcurrentpath\tikz@temppath
        \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
        \pgfsyssoftpath@setcurrentpath\tikz@temppath%
        \pgfsyssoftpath@invokecurrentpath%
        \pgfsys@fill%
        \tikz@mode@fillfalse% no more filling...
      \fi%
    \fi%
  \fi%
  % 
  % Step 5: Do a shade if necessary.
  %
  \iftikz@mode@shade%
    \pgfsyssoftpath@getcurrentpath\tikz@temppath
    \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
    \pgfsyssoftpath@setcurrentpath\tikz@temppath%
    \pgfshadepath{\tikz@shading}{\tikz@shade@angle}%
    \tikz@mode@shadefalse% no more shading...
  \fi%
  % 
  % Step 5a: Do a path picture if necessary.
  %
  \ifx\tikz@path@picture\pgfutil@empty%
  \else%
    \begingroup%
      \pgfsys@beginscope%
        \pgfsyssoftpath@getcurrentpath\tikz@temppath
        \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
        \pgfsyssoftpath@setcurrentpath\tikz@temppath%
        \pgfsyssoftpath@invokecurrentpath%
        \pgfsys@clipnext%
        \pgfsys@discardpath%
        \pgf@relevantforpicturesizefalse%
        \expandafter\def\csname pgf@sh@ns@path picture bounding box\endcsname{rectangle}
        \expandafter\edef\csname pgf@sh@np@path picture bounding box\endcsname{%
          \def\noexpand\southwest{\noexpand\pgfqpoint{\the\pgf@pathminx}{\the\pgf@pathminy}}%
          \def\noexpand\northeast{\noexpand\pgfqpoint{\the\pgf@pathmaxx}{\the\pgf@pathmaxy}}%
        }
        \expandafter\def\csname pgf@sh@nt@path picture bounding box\endcsname{{1}{0}{0}{1}{0pt}{0pt}}
        \expandafter\def\csname pgf@sh@pi@path picture bounding box\endcsname{\pgfpictureid}
        \pgfinterruptpath%  
          \tikz@path@picture%
        \endpgfinterruptpath%
      \pgfsys@endscope%
    \endgroup%
    \let\tikz@path@picture=\pgfutil@empty%  
  \fi%
  % 
  % Step 6: Double stroke, if necessary
  %
  \iftikz@mode@draw%
    \iftikz@mode@double%
      % Change line width
      \begingroup%
        \pgfsys@beginscope%
          \tikz@double@setup%
    \fi%
  \fi%
  % 
  % Step 7: Do stroke/fill/clip as needed
  %
  \edef\tikz@temp{\noexpand\pgfusepath{%
    \iftikz@mode@fill fill,\fi%
    \iftikz@mode@draw draw,\fi%
    \iftikz@mode@clip clip,\fi%
    }}%
  \tikz@temp%
  \tikz@mode@fillfalse% no more filling
  % 
  % Step 8: Double stroke, if necessary
  %
  \iftikz@mode@draw%
    \iftikz@mode@double%
        \pgfsys@endscope%
      \endgroup%
    \fi%
  \fi%
  \tikz@mode@drawfalse% no more stroking
  %
  % Step 9: Postactions
  %
  \tikz@postactions%
  % 
  % Step 10: Add labels and nodes
  %
  \box\tikz@figbox%
  %
  % Step 11: Close option brace
  %
  \ifx\tikz@options\pgfutil@empty%
  \else%
      \endgroup%
    \pgfsys@endscope%
    \iftikz@mode@clip%
      \PackageError{tikz}{Extra options not allowed for clipping path command.}{}%
    \fi%
  \fi%
  \iftikz@mode@clip%
    \aftergroup\pgf@relevantforpicturesizefalse%
  \fi%
  \iftikz@mode@boundary%
    \aftergroup\pgf@relevantforpicturesizefalse%
  \fi%
  \endgroup%
  \global\pgflinewidth=\tikzscope@linewidth%
  \tikz@path@do@at@end%
}
\let\tikz@lib@scope@check\pgfutil@empty% this is a hook for the scopes library
\def\tikz@path@do@at@end{\tikz@lib@scope@check}

% Extra actions

\def\tikz@extra@preaction#1{%
  {%
    \pgfsys@beginscope%
      \setbox\tikz@figbox=\box\pgfutil@voidb@x%
      \path[#1];% do extra path
      \pgfsyssoftpath@setcurrentpath\tikz@actions@path% restore
      \tikz@restorepathsize%
    \pgfsys@endscope%
  }%
}

\def\tikz@extra@postaction#1{%
  {%
    \pgfsys@beginscope%
      \setbox\tikz@figbox=\box\pgfutil@voidb@x%
      \tikz@restorepathsize%
      \path[#1]\pgfextra{\pgfsyssoftpath@setcurrentpath\tikz@actions@path};% do extra path
      \pgf@resetpathsizes%
    \pgfsys@endscope%
  }%
}



\def\tikz@skip#1{\tikz@scan@next@command#1}
\def\tikz@expand{%
  \advance\tikz@expandcount by -1%
  \ifnum\tikz@expandcount<0\relax%
    \PackageError{tikz}{Giving up on this path. Did you forget a semicolon?}{}%
    \let\@next=\tikz@finish%
  \else%
    \let\@next=\tikz@@expand
  \fi%
  \@next}

\def\tikz@@expand{%
  \expandafter\tikz@scan@next@command\@let@token}



% Syntax for scopes: 
% {scoped path commands}

\newif\iftikz@auto@end@path

\def\tikz@beginscope{\begingroup\tikz@auto@end@pathfalse\tikz@scan@next@command}
\def\tikz@endscope{%
  \iftikz@auto@end@path\expandafter\tikz@finish\expandafter\egroup\else\expandafter\tikz@@endscope\fi%
}
\def\tikz@@endscope{% 
    \global\setbox\tikz@tempbox=\box\tikz@figbox%
    \edef\tikz@marshal{%
      \tikz@lastx=\the\tikz@lastx%
      \tikz@lasty=\the\tikz@lasty%
      \iftikz@current@point@local%
      \else%
        \tikz@lastxsaved=\the\tikz@lastxsaved%
        \tikz@lastysaved=\the\tikz@lastysaved%
        \ifx\tikz@moveto@waiting\relax%
          \let\tikz@moveto@waiting\relax%
        \else%
          \def\noexpand\tikz@moveto@waiting{\tikz@moveto@waiting}%
        \fi%
        \iftikz@shapeborder%
          \noexpand\tikz@shapebordertrue%
          \def\noexpand\tikz@shapeborder@name{\tikz@shapeborder@name}%
        \else%
          \noexpand\tikz@shapeborderfalse%
        \fi%
      \fi%
    }%
    \expandafter%
  \endgroup\tikz@marshal%
  \setbox\tikz@figbox=\box\tikz@tempbox%
  \tikz@scan@next@command}


% Syntax for pgfextra: 
% \pgfextra {normal tex text}
% \pgfextra normal tex text \endpgfextra

\def\tikz@extra{\pgfutil@ifnextchar\bgroup\tikz@@extra\relax}
\long\def\tikz@@extra#1{#1\tikz@scan@next@command}
\let\endpgfextra=\tikz@scan@next@command

\def\pgfextra{pgfextra}


% Syntax for \foreach: 
% \foreach \var in {list} {path text}
%
% Example:
%
% \draw (0,0) \foreach \x in {1,2,3} {-- (\x,0) circle (1cm)} -- (5,5);

\def\tikz@foreach{%
  \def\pgffor@beginhook{%
    \tikz@lastx=\tikz@foreach@save@lastx%
    \tikz@lasty=\tikz@foreach@save@lasty%
    \tikz@lastxsaved=\tikz@foreach@save@lastxsaved%
    \tikz@lastysaved=\tikz@foreach@save@lastysaved%
    \setbox\tikz@figbox=\box\tikz@tempbox\expandafter\tikz@scan@next@command\pgfutil@firstofone}%
  \def\pgffor@endhook{\pgfextra{%
      \xdef\tikz@foreach@save@lastx{\the\tikz@lastx}%
      \xdef\tikz@foreach@save@lasty{\the\tikz@lasty}%
      \xdef\tikz@foreach@save@lastxsaved{\the\tikz@lastxsaved}%
      \xdef\tikz@foreach@save@lastysaved{\the\tikz@lastysaved}%
      \global\setbox\tikz@tempbox=\copy\tikz@figbox\pgfutil@gobble}}%
  \def\pgffor@afterhook{%
    \tikz@lastx=\tikz@foreach@save@lastx%
    \tikz@lasty=\tikz@foreach@save@lasty%
    \tikz@lastxsaved=\tikz@foreach@save@lastxsaved%
    \tikz@lastysaved=\tikz@foreach@save@lastysaved%
    \setbox\tikz@figbox=\box\tikz@tempbox\tikz@scan@next@command}%
  \global\setbox\tikz@tempbox=\copy\tikz@figbox%
  \xdef\tikz@foreach@save@lastx{\the\tikz@lastx}%
  \xdef\tikz@foreach@save@lasty{\the\tikz@lasty}%
  \xdef\tikz@foreach@save@lastxsaved{\the\tikz@lastxsaved}%
  \xdef\tikz@foreach@save@lastysaved{\the\tikz@lastysaved}%
  \foreach}

  
% Syntax for againpath: 
% \againpath \somepathname

\def\tikz@command@againpath#1{%
  \pgfextra{%
    \pgfsyssoftpath@getcurrentpath\tikz@temp%
    \expandafter\pgfutil@g@addto@macro\expandafter\tikz@temp\expandafter{#1}%
    \pgfsyssoftpath@setcurrentpath\tikz@temp%
  }
}




%
% When this if is set, a just-scanned point is a shape and its border
% position still needs to be determined, depending on subsequent
% commands. 
%

\newif\iftikz@shapeborder


% Syntax for moveto: 
% <point>
\def\tikz@movetoabs{\tikz@moveto(}
\def\tikz@movetorel{\tikz@moveto+}
\def\tikz@moveto{%
  \tikz@scan@one@point{\tikz@@moveto}}
\def\tikz@@moveto#1{%
  \tikz@make@last@position{#1}%
  \iftikz@shapeborder%
    % ok, the moveto will have to wait. flag that we have a moveto in
    % wainting:
    \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
  \else%
    \pgfpathmoveto{\tikz@last@position}%
    \let\tikz@moveto@waiting=\relax%
  \fi%
  \tikz@scan@next@command%
}

\let\tikz@moveto@waiting=\relax % normally, nothing is waiting...

\def\tikz@flush@moveto{%
  \ifx\tikz@moveto@waiting\relax%
  \else%
    \pgfpathmoveto{\tikz@last@position}%
  \fi%
  \let\tikz@moveto@waiting=\relax%
}


\def\tikz@flush@moveto@toward#1#2#3{%
  % #1 = a point towards which the last moveto should be corrected
  % #2 = a dimension to which the corrected x-coordinate should be stored
  % #3 = a dimension for the corrected y-coordinate
  \ifx\tikz@moveto@waiting\relax%
    % do nothing
  \else%
    \pgf@process{\pgfpointshapeborder{\tikz@moveto@waiting}{#1}}%
    #2=\pgf@x%
    #3=\pgf@y%
    \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \pgfpathmoveto{\pgfqpoint{\pgf@x}{\pgf@y}}%
  \fi%
  \let\tikz@moveto@waiting=\relax%
}


%
% Collecting labels on the path 
%

\def\tikz@collect@coordinate@onpath#1coordinate{%
  \pgfutil@ifnextchar[{\tikz@@collect@coordinate@opt#1}{\tikz@@collect@coordinate@opt#1[]}}%}
\def\tikz@@collect@coordinate@opt#1[#2]{%
  \pgfutil@ifnextchar({\tikz@@collect@coordinate#1[#2]}{%
  \tikz@collect@label@onpath#1node[shape=coordinate,#2]{}}}%}
\def\tikz@@collect@coordinate#1[#2](#3){%
  \tikz@collect@label@onpath#1node[shape=coordinate,#2](#3){}}

\def\tikz@collect@label@onpath#1node{%
  \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath node}%
  \tikz@collect@label@scan#1}

\def\tikz@collect@label@scan#1{%  
  \pgfutil@ifnextchar({\tikz@collect@paran#1}%
  {\pgfutil@ifnextchar[{\tikz@collect@options#1}%
    {\pgfutil@ifnextchar\bgroup{\tikz@collect@arg#1}%
      {#1}}}%
}%}}

\def\tikz@collect@paran#1(#2){%
  \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath(#2)}%
  \tikz@collect@label@scan#1%
}
\def\tikz@collect@options#1[#2]{%
  \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath[#2]}%
  \tikz@collect@label@scan#1%
}
\def\tikz@collect@arg#1#2{%
  \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#2}}%
  #1%
}


\def\tikz@invoke@collected@onpath{%
  \tikz@node@is@a@labeltrue%
  \let\tikz@temp=\tikz@collected@onpath%
  \let\tikz@collected@onpath=\pgfutil@empty%
  \expandafter\tikz@scan@next@command\tikz@temp\pgf@stop%
  \tikz@node@is@a@labelfalse%
}




% Syntax for lineto: 
% -- <point>

\def\tikz@lineto{%
  \pgfutil@ifnextchar |%
  {\expandafter\tikz@hv@lineto\pgfutil@gobble}%
  {\expandafter\pgfutil@ifnextchar\tikz@activebar{\expandafter\tikz@hv@lineto\pgfutil@gobble}%
    {\expandafter\tikz@lineto@mid\pgfutil@gobble}}}
\def\tikz@lineto@mid{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@lineto@mid}%
  {%
    \pgfutil@ifnextchar c{\tikz@close}{%
      \pgfutil@ifnextchar p{\pgfsetlinetofirstplotpoint\expandafter\tikz@plot\pgfutil@gobble}%
        {\tikz@scan@one@point{\tikz@@lineto}}}}}
\def\tikz@@lineto#1{%
  % Record the starting point for later labels on the path:
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}
  \iftikz@shapeborder%
    % ok, target is a shape. recalculate end
    \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\tikz@last@position}}%
    \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
    \tikz@flush@moveto@toward{\tikz@last@position}\pgf@x\pgf@y%
    \tikz@path@lineto{\tikz@last@position}%
    \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \tikz@make@last@position{#1}%
    \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%    
  \else%
    % target is a reasonable point...
    % Record the starting point for later labels on the path:
    \tikz@make@last@position{#1}%
    \tikz@flush@moveto@toward{\tikz@last@position}\pgf@x\pgf@y%
    \tikz@path@lineto{\tikz@last@position}%
    \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \fi%
  \let\tikz@timer=\tikz@timer@line%
  \tikz@scan@next@command%
}

% snake or lineto?
\def\tikz@path@lineto#1{%
  \iftikz@snaked%
    {
      \pgfsyssoftpathmovetorelevantfalse%
      \pgfpathsnakesto{\tikz@presnake,{\tikz@snake}{\tikz@mainsnakelength}{\noexpand\tikz@snake@install@trans}{},\tikz@postsnake}{#1}%
    }
  \else%
    \pgfpathlineto{#1}%
  \fi%
}

% snake or lineto?
\def\tikz@path@close#1{%
  \iftikz@snaked%
    {%
      \pgftransformreset%
      \pgfpathsnakesto{\tikz@presnake,{\tikz@snake}{\tikz@mainsnakelength}{\noexpand\tikz@snake@install@trans}{},\tikz@postsnake}{#1}%
    }%
  \fi%
  \pgfpathclose%
}


% Syntax for lineto horizontal/vertical: 
% -| <point>

\def\tikz@hv@lineto{%
  \pgfutil@ifnextchar n
  {\tikz@collect@label@onpath\tikz@hv@lineto}
  {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@hv@lineto}%
    {\tikz@scan@one@point{\tikz@@hv@lineto}}}}
\def\tikz@@hv@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@yc=\tikz@lasty%
  \tikz@make@last@position{#1}%
  \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\pgf@yc}}\pgf@x\pgf@yc%
  \iftikz@shapeborder%
    % ok, target is a shape. have to work now:
    {%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\tikz@lastx}{\pgf@yc}}}%
      \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
      \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@yc}}%
      \tikz@path@lineto{\tikz@last@position}%
      \xdef\tikz@timer@end@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
    }%
    \let\tikz@timer@end=\tikz@timer@end@temp%
    \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%    
  \else%
    \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@yc}}%
    \tikz@path@lineto{\tikz@last@position}%
    \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
  \fi%
  \let\tikz@timer=\tikz@timer@hvline%
  \tikz@scan@next@command%
}

% Syntax for lineto vertical/horizontal: 
% |- <point>

\def\tikz@vh@lineto-{\tikz@vh@lineto@next}
\def\tikz@vh@lineto@next{%
  \pgfutil@ifnextchar n
  {\tikz@collect@label@onpath\tikz@vh@lineto@next}
  {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@vh@lineto@next}%
    {\tikz@scan@one@point\tikz@@vh@lineto}}}
\def\tikz@@vh@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xc=\tikz@lastx%
  \tikz@make@last@position{#1}%
  \tikz@flush@moveto@toward{\pgfqpoint{\pgf@xc}{\tikz@lasty}}\pgf@xc\pgf@y%
  \iftikz@shapeborder%
    % ok, target is a shape. have to work now:
    {%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@xc}{\tikz@lasty}}}%
      \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
      \tikz@path@lineto{\pgfqpoint{\pgf@xc}{\tikz@lasty}}%
      \tikz@path@lineto{\tikz@last@position}%
      \xdef\tikz@timer@end@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
    }%
    \let\tikz@timer@end=\tikz@timer@end@temp%
    \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%    
  \else%
    \tikz@path@lineto{\pgfqpoint{\pgf@xc}{\tikz@lasty}}%
    \tikz@path@lineto{\tikz@last@position}%
    \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \fi%
  \let\tikz@timer=\tikz@timer@vhline%
  \tikz@scan@next@command%
}

% Syntax for cycle: 
% -- cycle
\def\tikz@close c{%
  \pgfutil@ifnextchar o{\tikz@collect@coordinate@onpath\tikz@lineto@mid c}% oops, a coordinate
  {\tikz@@close c}}%
\def\tikz@@close cycle{%
  \tikz@flush@moveto%
  \tikz@path@close{\expandafter\pgfpoint\pgfsyssoftpath@lastmoveto}%
  \def\pgfstrokehook{}%
  \let\tikz@timer=\@undefined%
  \tikz@scan@next@command%
}


% Syntax for options: 
% [options]
\def\tikz@parse@options#1]{%
  \tikzset{#1}%
  \tikz@scan@next@command%
}

% Syntax for edges:
% edge [options] (coordinate)
% edge [options] node {node text} (coordinate)
\def\tikz@edge@plain{%
  \begingroup%
    \ifx\tikz@to@use@whom\pgfutil@undefined\else\tikz@to@use@whom\fi
    \let\tikz@to@or@edge@function=\tikz@do@edge%
    \tikz@to@or@edge}

% Syntax for to paths:
% to [options] (coordinate)
% to [options] node {node text} (coordinate)
\def\tikz@to o{%
  \tikz@to@use@last@coordinate%
  \let\tikz@to@or@edge@function=\tikz@do@to%
  \tikz@to@or@edge}
  
\def\tikz@to@or@edge{\pgfutil@ifnextchar[\tikz@@to@or@edge{\tikz@@to@or@edge[]}}%}
\def\tikz@@to@or@edge[#1]{%
  \def\tikz@@to@local@options{[#1]}%
  \let\tikz@collected@onpath=\pgfutil@empty%
  \tikz@@to@collect%
}
\def\tikz@@to@collect{%
  \pgfutil@ifnextchar(\tikz@@to@or@edge@coordinate%)
  {\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@to@collect}%
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@to@collect}%
      {\pgfutil@ifnextchar +{\tikz@scan@one@point\tikz@@to@or@edge@math}%
        {\PackageError{tikz}{(, +, coordinate, or node expected}{}%)
            \tikz@@to@or@edge@coordinate()}}}}%
}

\def\tikz@@to@or@edge@coordinate({%
  \pgfutil@ifnextchar${%$
    % Ok, parse directly
    \tikz@scan@one@point\tikz@@to@or@edge@math(%
  }{%
    \pgfutil@ifnextchar[{%]
      \tikz@scan@one@point\tikz@@to@or@edge@math(%
    }{%
      \tikz@@to@or@edge@@coordinate(%
    }%
  }%
}
\def\tikz@@to@or@edge@math#1{% 
  \pgf@process{#1}%
  \edef\tikztotarget{\the\pgf@x,\the\pgf@y}%
  \tikz@to@or@edge@function%
}

\def\tikz@@to@or@edge@@coordinate(#1){%
  \def\tikztotarget{#1}%
  \tikz@to@or@edge@function%
}

\def\tikz@do@edge{%
  \setbox\tikz@figbox=\hbox\bgroup%
    \unhbox\tikz@figbox%
    \hbox\bgroup
      \bgroup%
        \pgfinterruptpath%
          \pgfscope%
            \let\tikz@transform=\pgfutil@empty%
            \let\tikz@options=\pgfutil@empty%
            \let\tikz@tonodes=\tikz@collected@onpath%
            \def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}%
            \let\tikz@collected@onpath=\pgfutil@empty%
            \tikz@options%
            \tikz@transform%            
            % Typeset node:
            \let\tikz@after@path\pgfutil@empty%
            \tikz@atbegin@to%
            \path[style=every edge]\tikz@@to@local@options(\tikztostart)\tikz@to@path
            \pgfextra{\global\let\tikz@after@path@smuggle=\tikz@after@path};%
            \tikz@atend@to%
          \endpgfscope%
        \endpgfinterruptpath%
      \egroup
    \egroup%
  \egroup%
    \global\setbox\tikz@tempbox=\copy\tikz@figbox%
  \endgroup%
  \setbox\tikz@figbox=\box\tikz@tempbox%  
  \expandafter\tikz@scan@next@command\tikz@after@path%  
}

\def\tikz@do@to{%
  \let\tikz@tonodes=\tikz@collected@onpath%
  \def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}%
  \let\tikz@collected@onpath=\pgfutil@empty%
  \tikz@scan@next@command%
  {%
    \pgfextra{\let\tikz@after@path\pgfutil@empty}%
    \pgfextra{\tikz@atbegin@to}%
    [style=every to]\tikz@@to@local@options\tikz@to@path%
    \pgfextra{\tikz@atend@to}%
    \pgf@stop%
    \expandafter\tikz@scan@next@command\expandafter%
  }\tikz@after@path%
}


\def\tikz@to@use@last@coordinate{%
  \iftikz@shapeborder%
    \edef\tikztostart{\tikz@shapeborder@name}%
  \else%
    \edef\tikztostart{\the\tikz@lastx,\the\tikz@lasty}%
  \fi%
}
\def\tikz@to@use@last@fig@name{%
  \edef\tikztostart{\tikz@to@last@fig@name}%
}



% Syntax for graph path command:
% graph {...}
% See the graph library for details

\def\tikz@graph aph{\tikz@lib@graph@parser}

\def\tikz@lib@graph@parser{\pgfutil@ifnextchar[\tikz@graph@error{\tikz@graph@error[]}}%]
\def\tikz@graph@error[#1]#2{%
  \PackageError{tikz}{You need to say \string\usetikzlibrary{graph} in
  order to use the graph syntax}{}% 
  \tikz@lib@graph@parser@done%
}

\def\tikz@lib@graph@parser@done{%
  \tikz@scan@next@command%
}




% Syntax for edge from parent: 
% edge from parent [options]
\def\tikz@edgetoparent from parent{\pgfutil@ifnextchar[\tikz@@edgetoparent{\tikz@@edgetoparent[]}}%}
\def\tikz@@edgetoparent[#1]{%
  \let\tikz@edge@to@parent@needed=\pgfutil@empty%
  \tikz@node@is@a@labeltrue%
  \tikz@scan@next@command [style=edge from parent,#1] \tikz@edge@to@parent@path%
}


% Syntax for bezier curves
% .. controls(point) and (point) .. (target)
% .. controls(point) .. (target) 
% .. (target) % currently not supported

\def\tikz@dot.{\tikz@@dot}%
\def\tikz@@dot{%
  \pgfutil@ifnextchar n%
  {\tikz@collect@label@onpath\tikz@@dot}%
  {\pgfutil@ifnextchar c{\tikz@curveto@double}{\tikz@curveto@auto}}}

\def\tikz@curveto@double co{%
  \pgfutil@ifnextchar o{\tikz@collect@coordinate@onpath\tikz@@dot co}
  {\tikz@cureveto@@double}}
\def\tikz@cureveto@@double ntrols#1{%
  \tikz@scan@one@point\tikz@curveA#1%
}
\def\tikz@curveA#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  {%
    \tikz@make@last@position{#1}%
    \xdef\tikz@curve@first{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  }%
  \pgfutil@ifnextchar a
  {\tikz@curveBand}%
  {\let\tikz@curve@second\tikz@curve@first\tikz@curveCdots}%
}
\def\tikz@curveBand and{%
  \tikz@scan@one@point\tikz@curveB%
}
\def\tikz@curveB#1{%
  \def\tikz@curve@second{#1}%
  \tikz@curveCdots}
\def\tikz@curveCdots{%
  \afterassignment\tikz@curveCdot\let\@next=}
\def\tikz@curveCdot.{%
  \ifx\@next.%
  \else%
    \PackageError{tikz}{Dot expected}{}%
  \fi%
  \tikz@updatecurrenttrue%
  \tikz@curveCcheck%
}
\def\tikz@curveCcheck{%
  \pgfutil@ifnextchar n%
  {\tikz@collect@label@onpath\tikz@curveCcheck}
  {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@curveCcheck}
    {\tikz@scan@one@point\tikz@curveC}}%
}
\def\tikz@curveC#1{%
  \tikz@make@last@position{#1}%
  \edef\tikz@curve@third{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  {%
    \tikz@lastxsaved=\tikz@lastx%
    \tikz@lastysaved=\tikz@lasty%
    \tikz@make@last@position{\tikz@curve@second}%
    \xdef\tikz@curve@second{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  }%
  %
  % Start recalculating things in case start and end are shapes.
  %
  % First, the start:
  \ifx\tikz@moveto@waiting\relax%
  \else%
    \pgf@process{\pgfpointshapeborder{\tikz@moveto@waiting}{\tikz@curve@first}}%
    \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \pgfpathmoveto{\pgfqpoint{\pgf@x}{\pgf@y}}%
  \fi%
  \let\tikz@timer@cont@one=\tikz@curve@first%
  \let\tikz@timer@cont@two=\tikz@curve@second%    
  % Second, the end:
  \iftikz@shapeborder%
    % ok, target is a shape. recalculate third
    {%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\tikz@curve@second}}%
      \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
      \edef\tikz@curve@third{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
      \pgfpathcurveto{\tikz@curve@first}{\tikz@curve@second}{\tikz@curve@third}%
      \global\let\tikz@timer@end@temp=\tikz@curve@third% move out of group
    }%
    \let\tikz@timer@end=\tikz@timer@end@temp%
    \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%    
  \else%
    \pgfpathcurveto{\tikz@curve@first}{\tikz@curve@second}{\tikz@curve@third}%
    \let\tikz@timer@end=\tikz@curve@third
    \let\tikz@moveto@waiting=\relax%
  \fi%
  \let\tikz@timer=\tikz@timer@curve%  
  \tikz@scan@next@command%
}


% Syntax for rectangles: 
% rectangle <corner point> 
\def\tikz@rect ectangle{%
  \tikz@flush@moveto%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \tikz@@rect}%
\def\tikz@@rect{%
  \pgfutil@ifnextchar n
  {\tikz@collect@label@onpath\tikz@@rect}
  {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@rect}%
    {
      \pgf@xa=\tikz@lastx\relax%
      \pgf@ya=\tikz@lasty\relax%
      \tikz@scan@one@point\tikz@rectB}}}
\def\tikz@rectB#1{%
  \tikz@make@last@position{#1}%
  \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \let\tikz@timer=\tikz@timer@line%  
  \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \tikz@path@lineto{\pgfqpoint{\pgf@xa}{\tikz@lasty}}%
  \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
  \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@ya}}%
  \iftikz@snaked% 
    \tikz@path@lineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
  \fi%
  \pgfpathclose%
  \pgfpathmoveto{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
  \def\pgfstrokehook{}%
  \tikz@scan@next@command%
}



% Syntax for grids: 
% grid <corner point> 
\def\tikz@grid id{%
  \tikz@flush@moveto%
  \pgf@xa=\tikz@lastx\relax%
  \pgf@ya=\tikz@lasty\relax%
  \pgfutil@ifnextchar[{\tikz@gridA}{\tikz@gridA[]}}%}
\def\tikz@gridA[#1]{%
  \def\tikz@grid@options{#1}%
  \tikz@scan@one@point\tikz@gridB}%
\def\tikz@gridB#1{%
  \tikz@make@last@position{#1}%
  {%
    \let\tikz@after@path\pgfutil@empty%
    \expandafter\tikzset\expandafter{\tikz@grid@options}
    \tikz@checkunit{\tikz@grid@x}%
    \iftikz@isdimension%
      \pgf@process{\pgfpoint{\tikz@grid@x}{0pt}}%
    \else%
      \pgf@process{\pgfpointxy{\tikz@grid@x}{0}}%
    \fi%
    \pgf@xb=\pgf@x%
    \pgf@yb=\pgf@y%
    \tikz@checkunit{\tikz@grid@y}%
    \iftikz@isdimension%
      \pgf@process{\pgfpoint{0pt}{\tikz@grid@y}}%
    \else%
      \pgf@process{\pgfpointxy{0}{\tikz@grid@y}}%
    \fi%
    \advance\pgf@xb by\pgf@x%
    \advance\pgf@yb by\pgf@y%
    \pgfpathgrid[stepx=\pgf@xb,stepy=\pgf@yb]%
      {\pgfqpoint{\pgf@xa}{\pgf@ya}}{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
  \expandafter}%
  \expandafter\tikz@scan@next@command\tikz@after@path%
}



% Syntax for plot: 
% plot [local options] ...    % starts with a moveto
% -- plot [local options] ... % starts with a lineto
\def\tikz@plot lot{%
  \tikz@flush@moveto%
  \pgfutil@ifnextchar[{\tikz@@plot}{\tikz@@plot[]}}%}
\def\tikz@@plot[#1]{%
  \begingroup%
    \let\tikz@after@path\pgfutil@empty%
    \let\tikz@options=\pgfutil@empty%
    \tikzset{every plot/.try}%
    \tikzset{#1}%
    \pgfutil@ifnextchar f{\tikz@plot@f}%
    {\pgfutil@ifnextchar c{\tikz@plot@scan@points}%
      {\pgfutil@ifnextchar ({\tikz@plot@expression}{%
      \PackageError{tikz}{Cannot parse this plotting data}{}%
       \endgroup}}}}
\def\tikz@plot@f f{\pgfutil@ifnextchar i{\tikz@plot@file}{\tikz@plot@function}}

\def\tikz@plot@file ile#1{\def\tikz@plot@data{\pgfplotxyfile{#1}}\tikz@@@plot}%
\def\tikz@plot@scan@points coordinates#1{%
  \pgfplothandlerrecord\tikz@plot@data%
  \pgfplotstreamstart%
  \pgfutil@ifnextchar\pgf@stop{\pgfplotstreamend\expandafter\tikz@@@plot\pgfutil@gobble}
  {\tikz@scan@one@point\tikz@plot@next@point}%
  #1\pgf@stop%
}
\def\tikz@plot@next@point#1{%
  \pgfplotstreampoint{#1}%
  \pgfutil@ifnextchar\pgf@stop{\pgfplotstreamend\expandafter\tikz@@@plot\pgfutil@gobble}%
  {\tikz@scan@one@point\tikz@plot@next@point}%
}  
\def\tikz@plot@function unction#1{%
  \def\tikz@plot@filename{\tikz@plot@prefix\tikz@plot@id}%  
  \iftikz@plot@raw@gnuplot%
    \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{#1}}%
  \else%
    \iftikz@plot@parametric%   
      \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{%
          set samples \tikz@plot@samples;
          set parametric;
          plot [t=\tikz@plot@domain] #1}}%
    \else%
      \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{%
          set samples \tikz@plot@samples;
          plot [x=\tikz@plot@domain] #1}}%
    \fi%
  \fi%
  \tikz@@@plot%
}

\def\tikz@plot@no@resample{%
  \pgfutil@IfFileExists{\tikz@plot@filename.table}%
  {\def\tikz@plot@data{\pgfplotxyfile{\tikz@plot@filename.table}}}%
  {}%
}

\def\tikz@plot@expression(#1){%
  \edef\tikz@plot@data{\noexpand\pgfplotfunction{\expandafter\noexpand\tikz@plot@var}{\tikz@plot@samplesat}}%
  \expandafter\def\expandafter\tikz@plot@data\expandafter{\tikz@plot@data{\tikz@scan@one@point\pgfutil@firstofone(#1)}}%
  \tikz@@@plot%
}

\def\tikz@@@plot{%
    \def\pgfplotlastpoint{\pgfpointorigin}%
    \tikz@plot@handler%
    \tikz@plot@data%
    \global\let\tikz@@@temp=\pgfplotlastpoint%
    \ifx\tikz@plot@mark\pgfutil@empty%
    \else%
      % Marks are drawn after the path.
      \setbox\tikz@figbox=\hbox{%
        \unhbox\tikz@figbox%
        \hbox{{%
          \pgfinterruptpath%
            \pgfscope%
              \let\tikz@options=\pgfutil@empty%
              \let\tikz@transform=\pgfutil@empty%
              \tikzset{every mark}%
              \tikz@options%
              \ifx\tikz@mark@list\pgfutil@empty%
                \pgfplothandlermark{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}%
              \else
                \pgfplothandlermarklisted{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}{\tikz@mark@list}%
              \fi
              \tikz@plot@data%
            \endpgfscope
          \endpgfinterruptpath%
        }}%
      }%
    \fi%
    \global\setbox\tikz@tempbox=\copy\tikz@figbox%
    \global\let\tikz@after@path@smuggle=\tikz@after@path
  \endgroup%
  \setbox\tikz@figbox=\box\tikz@tempbox%  
  \tikz@make@last@position{\tikz@@@temp}%  
  \expandafter\tikz@scan@next@command\tikz@after@path@smuggle%
}


\pgfdeclareplotmark{ball}
{%
  \def\tikz@shading{ball}%
  \shade (0pt,0pt) circle (\pgfplotmarksize);%
}




% Syntax for cosine curves:
% cos <end of quarter-period>
\def\tikz@cosine s{\tikz@scan@one@point\tikz@@cosine}
\def\tikz@@cosine#1{%
  \tikz@flush@moveto%
  \pgf@process{#1}%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \advance\pgf@xc by-\tikz@lastx%
  \advance\pgf@yc by-\tikz@lasty%
  \advance\tikz@lastx by\pgf@xc%
  \advance\tikz@lasty by\pgf@yc%
  \tikz@lastxsaved=\tikz@lastx%
  \tikz@lastysaved=\tikz@lasty%
  \tikz@updatecurrenttrue%
  \pgfpathcosine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
  \tikz@scan@next@command%
}

% Syntax for sine curves:
% sin <end of quarter-period>
\def\tikz@sine in{\tikz@scan@one@point\tikz@@sine}
\def\tikz@@sine#1{%
  \tikz@flush@moveto%
  \pgf@process{#1}%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \advance\pgf@xc by-\tikz@lastx%
  \advance\pgf@yc by-\tikz@lasty%
  \advance\tikz@lastx by\pgf@xc%
  \advance\tikz@lasty by\pgf@yc%
  \tikz@lastxsaved=\tikz@lastx%
  \tikz@lastysaved=\tikz@lasty%
  \tikz@updatecurrenttrue%
  \pgfpathsine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
  \tikz@scan@next@command%
}

% Syntax for parabolas: 
% parabola[options] bend <coordinate> <coordinate>
\def\tikz@parabola arabola{%
  \pgfutil@ifnextchar[{\tikz@parabola@options}{\tikz@parabola@options[]}}%}

\def\tikz@parabola@options[#1]{%
  \def\tikz@parabola@option{#1}%
  \pgfutil@ifnextchar b{\tikz@parabola@scan@bend}{\tikz@scan@one@point\tikz@parabola@semifinal}}
\def\tikz@parabola@scan@bend bend{\tikz@scan@one@point\tikz@parabola@scan@bendB}
\def\tikz@parabola@scan@bendB#1{%
  \def\tikz@parabola@bend{#1}%
  \tikz@scan@one@point\tikz@parabola@semifinal%
}
\def\tikz@parabola@semifinal#1{%
  \tikz@flush@moveto%
  % Save original start:
  \pgf@xb=\tikz@lastx%
  \pgf@yb=\tikz@lasty%
  \tikz@make@last@position{#1}%
  \pgf@xc=\tikz@lastx%
  \pgf@yc=\tikz@lasty%
  \begingroup% now calculate bend:
    \let\tikz@after@path\pgfutil@empty%
    \expandafter\tikzset\expandafter{\tikz@parabola@option}%
    \tikz@lastxsaved=\tikz@parabola@bend@factor\tikz@lastx%
    \tikz@lastysaved=\tikz@parabola@bend@factor\tikz@lasty%
    \advance\tikz@lastxsaved by\pgf@xb%
    \advance\tikz@lastysaved by\pgf@yb%
    \advance\tikz@lastxsaved by-\tikz@parabola@bend@factor\pgf@xb%
    \advance\tikz@lastysaved by-\tikz@parabola@bend@factor\pgf@yb%
    \expandafter\tikz@make@last@position\expandafter{\tikz@parabola@bend}%
    % Calculate delta from bend
    \advance\pgf@xc by-\tikz@lastx%
    \advance\pgf@yc by-\tikz@lasty%
    % Ok, now calculate delta to bend
    \advance\tikz@lastx by-\pgf@xb%
    \advance\tikz@lasty by-\pgf@yb%
    \xdef\tikz@parabola@b{{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}}%
  \expandafter\endgroup%
  \expandafter\expandafter\expandafter\pgfpathparabola\expandafter\tikz@parabola@b%
  \expandafter\tikz@scan@next@command\tikz@after@path%
}


% Syntax for circles:
% circle [options] % where options should set, at least, radius
% circle (radius) % deprecated
%
% Syntax for ellipses:
% ellipse [options] % identical to circle.
% ellipse (x-radius and y-radius) % deprecated
%
% radii can be dimensionless, then they are in the xy-system
\def\tikz@circle ircle{\tikz@flush@moveto\tikz@@circle}
\def\tikz@ellipse llipse{\tikz@flush@moveto\tikz@@circle}
\def\tikz@@circle{%
  \pgfutil@ifnextchar(\tikz@@@circle
  {\pgfutil@ifnextchar[\tikz@circle@opt{%])
    \advance\tikz@expandcount by -10\relax% go down quickly
    \ifnum\tikz@expandcount<0\relax%
      \let\@next=\tikz@@circle@normal%
    \else%
      \let\@next=\tikz@@circle@scanexpand%
    \fi%
    \@next%
  }}%
}
\def\tikz@@circle@scanexpand{\expandafter\tikz@@circle}
\def\tikz@@circle@normal{\tikz@circle@opt[]}

\def\tikz@circle@opt[#1]{%
  {%
    \def\tikz@node@at{\tikz@last@position}%
    \let\tikz@transform=\pgfutil@empty%
    \tikzset{every circle/.try,#1}%
    \pgftransformshift{\tikz@node@at}%
    \tikz@transform%
    \tikz@do@circle{\pgfkeysvalueof{/tikz/x radius}}{\pgfkeysvalueof{/tikz/y radius}}
  }%
  \tikz@scan@next@command%
}

\def\tikz@@@circle(#1){%
  {%
    \pgftransformshift{\tikz@last@position}%
    \pgfutil@in@{ and }{#1}%
    \ifpgfutil@in@%
      \tikz@@ellipseB(#1)%
    \else%
      \tikz@do@circle{#1}{#1}%
    \fi%
  }%
  \tikz@scan@next@command%
}
\def\tikz@@ellipseB(#1 and #2){%
  \tikz@do@circle{#1}{#2}
}
\def\tikz@do@circle#1#2{
  \pgfmathparse{#1}%
  \let\tikz@ellipse@x=\pgfmathresult%
  \ifpgfmathunitsdeclared%
    \pgfmathparse{#2}%
    \let\tikz@ellipse@y=\pgfmathresult%
    \ifpgfmathunitsdeclared%
      \pgfpathellipse{\pgfpointorigin}{%
        \pgfqpoint{\tikz@ellipse@x pt}{0pt}}{\pgfpoint{0pt}{\tikz@ellipse@y pt}}%
    \else%
      \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an ellipse}{}%
    \fi%
  \else%
    \pgfmathparse{#2}%
    \let\tikz@ellipse@y=\pgfmathresult%
    \ifpgfmathunitsdeclared%
      \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an ellipse}{}%
    \else%
      \pgfpathellipse{\pgfpointorigin}{%
        \pgfpointxy{\tikz@ellipse@x}{0}}{\pgfpointxy{0}{\tikz@ellipse@y}}%
    \fi%
  \fi%
}

% Syntax 1 for arcs:
% arc (start angle:end angle:radius)
%
% Syntax 2 for arcs:
% arc (start angle:end angle:x-radius and y-radius)
%
% radius can be dimensionless, then the arc is in the xy-coordinate system
\def\tikz@arcA rc{\tikz@flush@moveto\tikz@arc@cont}%
\def\tikz@arc@cont{%
  \pgfutil@ifnextchar(%)
  {\tikz@@arcto}{%
    \pgfutil@ifnextchar[%]
    {\tikz@arc@opt}%
    {%
      \advance\tikz@expandcount by -10\relax% go down quickly
      \ifnum\tikz@expandcount<0\relax%
        \let\@next=\tikz@@arc@normal%
      \else%
        \let\@next=\tikz@@arc@scanexpand%
      \fi%
      \@next%
    }%
  }%
}
\def\tikz@@arc@scanexpand{\expandafter\tikz@arc@cont}
\def\tikz@@arc@normal{\tikz@arc@opt[]}


\def\tikz@arc@opt[#1]{%
  {%
    \tikzset{every arc/.try,#1}%
    \pgfkeysgetvalue{/tikz/start angle}\tikz@s
    \pgfkeysgetvalue{/tikz/end angle}\tikz@e
    \pgfkeysgetvalue{/tikz/delta angle}\tikz@d
    \ifx\tikz@s\pgfutil@empty%
      \pgfmathsetmacro\tikz@s{\tikz@e-\tikz@d}
    \else
      \ifx\tikz@e\pgfutil@empty%    
        \pgfmathsetmacro\tikz@e{\tikz@s+\tikz@d}
      \fi%
    \fi
    \tikz@do@arc{\tikz@s}{\tikz@e}
      {\pgfkeysvalueof{/tikz/x radius}}
      {\pgfkeysvalueof{/tikz/y radius}}
  }%
  \tikz@arcfinal%  
}

\def\tikz@@arcto(#1){%
  \edef\tikz@temp{(#1)}%
  \expandafter\tikz@@@arcto@check@slashand\tikz@temp%
}

\def\tikz@@@arcto@check@slashand(#1:#2:#3){%
  \pgfutil@in@{ and }{#3}%
  \ifpgfutil@in@% 
    \tikz@parse@arc@and(#1:#2:#3)%
  \else%
    \tikz@parse@arc@and(#1:#2:{#3} and {#3})%
  \fi%
  \tikz@arcfinal%  
}

\def\tikz@parse@arc@and(#1:#2:#3 and #4){%
  \tikz@do@arc{#1}{#2}{#3}{#4}%
}
\def\tikz@do@arc#1#2#3#4{%
  \pgfmathparse{#3}%
  \let\tikz@arc@x=\pgfmathresult%
  \ifpgfmathunitsdeclared%
    \pgfmathparse{#4}%
    \let\tikz@arc@y=\pgfmathresult%
    \ifpgfmathunitsdeclared%
      \tikz@@@arcfinal{\pgfpatharc{#1}{#2}{\tikz@arc@x pt and \tikz@arc@y pt}}
      {\pgfpointpolar{#1}{\tikz@arc@x pt and \tikz@arc@y pt}}
      {\pgfpointpolar{#2}{\tikz@arc@x pt and \tikz@arc@y pt}}%
    \else%
      \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an arc}{}%
    \fi%
  \else%
    \pgfmathparse{#4}%
    \let\tikz@arc@y=\pgfmathresult%
    \ifpgfmathunitsdeclared%
      \PackageError{tikz}{You cannot mix dimensions and dimensionless values in an arc}{}%
    \else%
      \tikz@@@arcfinal{\pgfpatharcaxes{#1}{#2}{\pgfpointxy{\tikz@arc@x}{0}}{\pgfpointxy{0}{\tikz@arc@y}}}
      {\pgfpointpolarxy{#1}{\tikz@arc@x and \tikz@arc@y}}{\pgfpointpolarxy{#2}{\tikz@arc@x and \tikz@arc@y}}%
     \fi%
  \fi%
}

\def\tikz@@@arcfinal#1#2#3{%
  #1%
  \pgf@process{#2}
  \xdef\tikz@arc@save@first{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  \pgf@process{#3}
  \xdef\tikz@arc@save@second{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
}

\def\tikz@arcfinal{%
  \pgf@process{\tikz@arc@save@first}%
  \advance\tikz@lastx by-\pgf@x%
  \advance\tikz@lasty by-\pgf@y%
  \pgf@process{\tikz@arc@save@second}%
  \advance\tikz@lastx by\pgf@x%
  \advance\tikz@lasty by\pgf@y%
  \tikz@lastxsaved=\tikz@lastx%
  \tikz@lastysaved=\tikz@lasty%
  \tikz@scan@next@command%
}


% Syntax for coordinates:
% coordinate[options] (coordinate name) at (point)
% where ``at (point)'' is optional
\def\tikz@coordinate ordinate{%
  \pgfutil@ifnextchar[{\tikz@@coordinate@opt}{\tikz@@coordinate@opt[]}}
\def\tikz@@coordinate@opt[#1]{%
  \pgfutil@ifnextchar({\tikz@@coordinate[#1]}
  {\tikz@fig ode[shape=coordinate,#1]{}}}%}
\def\tikz@@coordinate[#1](#2){%
  \pgfutil@ifnextchar a{\tikz@@coordinate@at[#1](#2)}
  {\tikz@fig ode[shape=coordinate,#1](#2){}}}
\def\tikz@@coordinate@at[#1](#2)a{%
  \pgfutil@ifnextchar t{\tikz@@coordinate@@at[#1](#2)a}%
  {\tikz@fig ode[shape=coordinate,#1](#2){}a}%
}
\def\tikz@@coordinate@@at[#1](#2)at#3({%
  \def\tikz@coordinate@caller{\tikz@fig ode[shape=coordinate,#1](#2)at}%
  \tikz@scan@one@point\tikz@@coordinate@at@math(%
}
\def\tikz@@coordinate@at@math#1{%
  \pgf@process{#1}%
  \edef\tikz@temp{(\the\pgf@x,\the\pgf@y)}%
  \expandafter\tikz@coordinate@caller\tikz@temp{}%
}
  


% Syntax for nodes:
% node[options] (node name) {label text}
%
% all of [options], (node name) and {label text} are optional. There
% can be multiple options before the label text as in
% node[draw] (a) [rotate=10] {text}
%
% A label text always ``ends'' the node.
\def\tikz@fig ode{%
  \edef\tikz@save@line@width{\the\pgflinewidth}%
  \begingroup%
  \let\tikz@fig@name=\pgfutil@empty%
    \begingroup%
      \tikz@is@matrixfalse%
      \let\nodepart=\tikz@nodepart%
      \let\tikz@do@after@node=\tikz@scan@next@command%
      \let\tikz@options=\pgfutil@empty%
      \let\tikz@after@path=\pgfutil@empty%
      \let\tikz@transform=\pgfutil@empty%
      \let\tikz@mode=\pgfutil@empty%
      \tikz@decoratepathfalse%
      \let\tikz@preactions=\pgfutil@empty%
      \let\tikz@postactions=\pgfutil@empty%
      \let\tikz@alias=\pgfutil@empty%
      \def\tikz@node@at{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
      \iftikz@node@is@a@label%
      \else%
        \let\tikz@time=\pgfutil@empty%
      \fi%
      \tikz@node@reset@hook%
      \tikzset{every node/.try}%
      \tikz@@scan@fig}%
\def\tikz@@scan@fig{%
  \pgfutil@ifnextchar a{\tikz@fig@scan@at}
  {\pgfutil@ifnextchar({\tikz@fig@scan@name}
    {\pgfutil@ifnextchar[{\tikz@fig@scan@options}%
      {\pgfutil@ifnextchar\bgroup{\tikz@fig@main}%
      {\PackageError{tikz}{A node must have a (possibly empty) label text}{}%
       \tikz@fig@main{}}}}}}%}}
\def\tikz@fig@scan@at at{%
  \tikz@scan@one@point\tikz@@fig@scan@at}
\def\tikz@@fig@scan@at#1{%
  \def\tikz@node@at{#1}\tikz@@scan@fig}%
\def\tikz@fig@scan@name(#1){%
	\pgfkeysvalueof{/tikz/name/.@cmd}#1\pgfeov% CF : this is now ALWAYS consistent with 'name=' option; allows overrides.
	\tikz@@scan@fig}%
% make it \long to allow \par in "pin" options etc:
\long\def\tikz@fig@scan@options[#1]{\tikzset{#1}\tikz@@scan@fig}%
\let\tikz@node@reset@hook=\pgfutil@empty%
\let\tikz@node@begin@hook=\pgfutil@empty%
\def\tikz@fig@main{\afterassignment\tikz@@fig@main\let\next=}
\def\tikz@@fig@main{%
    \pgfutil@ifundefined{pgf@sh@s@\tikz@shape}%
    {\PackageError{tikz}%
      {Unknown shape ``\tikz@shape.'' Using ``rectangle'' instead}{}%
      \def\tikz@shape{rectangle}}%
    {}%
    \tikzset{every \tikz@shape\space node/.try}%
    \tikz@node@begin@hook%
    \iftikz@is@matrix%
      \let\tikz@next=\tikz@do@matrix%
    \else%
      \let\tikz@next=\tikz@do@fig%
    \fi%
    \tikz@next%  
}
\def\tikz@do@fig{%  
    \setbox\pgfnodeparttextbox=\hbox%
      \bgroup%
        \tikzset{every text node part/.try}%
        \ifx\tikz@textopacity\pgfutil@empty%
        \else%
          \pgfsetfillopacity{\tikz@textopacity}%
          \pgfsetstrokeopacity{\tikz@textopacity}%
        \fi%
        \pgfinterruptpicture%
          \tikz@textfont%  
          \ifx\tikz@text@width\pgfutil@empty%
          \else%
            \begingroup%
            	\pgfmathsetlength{\pgf@x}{\tikz@text@width}%
              \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
                \tikz@text@action%
          \fi%
          \tikz@atbegin@node%
          \bgroup%
            \aftergroup\unskip%
            \ifx\tikz@textcolor\pgfutil@empty%
            \else%
              \pgfutil@colorlet{.}{\tikz@textcolor}%
            \fi%
            \pgfsetcolor{.}%
            \setbox\tikz@figbox=\box\pgfutil@voidb@x%
            \tikz@uninstallcommands%
            \aftergroup\tikz@fig@collectresetcolor%
            \tikz@halign@check%
            \ignorespaces%
}
\def\tikz@fig@collectresetcolor{%
  \pgfutil@ifnextchar\reset@color%
  {\reset@color\afterassignment\tikz@fig@collectresetcolor\let\tikz@temp=}%
  {\tikz@fig@boxdone}%
}
\def\tikz@fig@boxdone{%
            \tikz@atend@node%
          \ifx\tikz@text@width\pgfutil@empty%
          \else%
              \pgfutil@endminipage%
            \endgroup%
          \fi%
        \endpgfinterruptpicture%
      \egroup%
    \pgfutil@ifnextchar c{\tikz@fig@mustbenamed\tikz@fig@continue}%
    {\pgfutil@ifnextchar[{\tikz@fig@mustbenamed\tikz@fig@continue}%
      {\pgfutil@ifnextchar t{\tikz@fig@mustbenamed\tikz@fig@continue}
        {\pgfutil@ifnextchar e{\tikz@fig@mustbenamed\tikz@fig@continue}
          {\ifx\tikz@after@path\pgfutil@empty\expandafter\tikz@fig@continue\else\expandafter\tikz@fig@mustbenamed\expandafter\tikz@fig@continue\fi}}}}}%}

\def\tikz@do@matrix{%
    \tikzset{every matrix/.try}%
    \tikz@node@transformations%
    \tikz@fig@mustbenamed%
    \setbox\tikz@figbox=\hbox\bgroup%
      \setbox\pgfutil@tempboxa=\copy\tikz@figbox%
      \unhbox\pgfutil@tempboxa%
      \hbox\bgroup\bgroup%
          \pgfinterruptpath%
            \pgfscope%
              \tikz@options%
              \setbox\tikz@figbox=\box\pgfutil@voidb@x%
              \let\tikzmatrixname=\tikz@fig@name%
              \edef\tikz@m@anchor{\ifx\tikz@matrix@anchor\pgfutil@empty\tikz@anchor\else\tikz@matrix@anchor\fi}%
              \expandafter\pgfutil@in@\expandafter{\expandafter.\expandafter}\expandafter{\tikz@m@anchor}%
              \ifpgfutil@in@%
                \expandafter\tikz@matrix@split\tikz@m@anchor\relax%
              \else%
                \def\tikz@matrix@shift{\pgfpointorigin}%  
              \fi%
              \let\tikz@transform=\relax%
              \pgfmatrix%
              {\tikz@shape}%
              {\tikz@m@anchor}%
              {\tikz@fig@name}%
              {%
                \pgfutil@tempdima=\pgflinewidth%
                {\begingroup\tikz@finish}%
                \global\pgflinewidth=\pgfutil@tempdima%
              }%
              {\tikz@matrix@shift}%
              {%
                \tikz@matrix@make@active@ampersand%
                \def\pgfmatrixbegincode{%
                  \pgfsys@beginscope%
                  \tikz@common@matrix@code%
                  \tikz@atbegin@cell%
                }%
                \def\tikz@common@matrix@code{%
                  \let\tikz@options=\pgfutil@empty%
                  \let\tikz@mode=\pgfutil@empty%
                  \tikzset{every cell/.try={\the\pgfmatrixcurrentrow}{\the\pgfmatrixcurrentcolumn}}%
                  \tikzset{column \the\pgfmatrixcurrentcolumn/.try}%
                  \ifodd\pgfmatrixcurrentcolumn%
                    \tikzset{every odd column/.try}%
                  \else%
                    \tikzset{every even column/.try}%
                  \fi%
                  \tikzset{row \the\pgfmatrixcurrentrow/.try}%
                  \ifodd\pgfmatrixcurrentrow%
                    \tikzset{every odd row/.try}%
                  \else%
                    \tikzset{every even row/.try}%
                  \fi%
                  \tikzset{row \the\pgfmatrixcurrentrow\space column \the\pgfmatrixcurrentcolumn/.try}%
                  \tikz@options%
                }%
                \def\pgfmatrixendcode{%
                  \tikz@atend@cell%
                  \pgfsys@endscope%
                }%
                \def\pgfmatrixemptycode{%
                  \pgfsys@beginscope%
                  \tikz@common@matrix@code%
                  \tikz@at@emptycell%
                  \pgfsys@endscope%
                }%
                \aftergroup\tikz@do@matrix@cont}%
              \bgroup%
}
\def\tikz@do@matrix@cont{%            
            \endpgfscope
          \endpgfinterruptpath%
      \egroup\egroup%
    \egroup%
    %
    \tikz@node@finish%
}

{%
  \catcode`\&=13
  \gdef\tikz@matrix@make@active@ampersand{%
    \ifx\tikz@ampersand@replacement\pgfutil@empty%
      \catcode`\&=13%
      \let&=\pgfmatrixnextcell%
    \else%
      \expandafter\let\tikz@ampersand@replacement=\pgfmatrixnextcell%
    \fi%
  }%
}%


\def\tikz@matrix@split#1.#2\relax{%
  \def\tikz@m@anchor{text}%
  \def\tikz@matrix@shift{\pgfpointanchor{#1}{#2}}%
}
  
\def\tikz@fig@continue{%
    \ifx\tikz@text@width\pgfutil@empty%
    \else%
      \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
      \wd\pgfnodeparttextbox=\pgf@x%
    \fi%
    \ifx\tikz@text@height\pgfutil@empty%
    \else%
      \pgfmathsetlength{\pgf@x}{\tikz@text@height}%
      \ht\pgfnodeparttextbox=\pgf@x%
    \fi%
    \ifx\tikz@text@depth\pgfutil@empty%
    \else%
      \pgfmathsetlength{\pgf@x}{\tikz@text@depth}%
      \dp\pgfnodeparttextbox=\pgf@x%
    \fi%
    %
    % Node transformation
    %
    \tikz@node@transformations
    %
    \setbox\tikz@figbox=\hbox{%
      \setbox\pgfutil@tempboxa=\copy\tikz@figbox%
      \unhbox\pgfutil@tempboxa%
      \hbox{{%
          \pgfinterruptpath%
            \pgfscope%
              \tikz@options%
              \setbox\tikz@figbox=\box\pgfutil@voidb@x%
              \pgfmultipartnode{\tikz@shape}{\tikz@anchor}{\tikz@fig@name}{%
                \pgfutil@tempdima=\pgflinewidth%
                {\begingroup\tikz@finish}%
                \global\pgflinewidth=\pgfutil@tempdima%
              }%
            \endpgfscope
          \endpgfinterruptpath%
      }}%
    }%
    %
    \tikz@alias%
    \tikz@node@finish%
}


\def\tikz@fig@mustbenamed{%
  \ifx\tikz@fig@name\pgfutil@empty%
    % Assign a dummy name
    \global\advance\tikz@fig@count by1\relax
    \edef\tikz@fig@name{tikz@f@\the\tikz@fig@count}%
  \fi%
}

\def\tikz@node@transformations{
  % 
  % Possibly, we are ``online''
  % 
  \ifx\tikz@time\pgfutil@empty%
    \pgftransformshift{\tikz@node@at}%
    \iftikz@fullytransformed%
    \else%
      \pgftransformresetnontranslations%
    \fi%
  \else%
    \tikz@do@auto@anchor%
    \tikz@timer%
  \fi%
  % Invoke local transformations
  \tikz@transform%
}

\def\tikz@node@finish{%  
    \global\let\tikz@last@fig@name=\tikz@fig@name%
    \global\let\tikz@after@path@smuggle=\tikz@after@path%
    % shift box outside group
    \global\setbox\tikz@tempbox=\copy\tikz@figbox%
  \endgroup\endgroup%
  \setbox\tikz@figbox=\box\tikz@tempbox%
  \pgflinewidth=\tikz@save@line@width%
  \let\tikz@to@last@fig@name=\tikz@last@fig@name%
  \let\tikz@to@use@whom=\tikz@to@use@last@fig@name%
  \let\tikzlastnode=\tikz@last@fig@name%
  \ifx\tikz@after@path@smuggle\pgfutil@empty%
  \else%
    \tikz@scan@next@command{\tikz@after@path@smuggle}\pgf@stop%
  \fi%
  \tikz@do@after@node%
}
\let\tikz@fig@continue@orig=\tikz@fig@continue

\def\tikz@do@after@node{\tikz@scan@next@command}

\newif\iftikz@do@align

% Alignment handling
\def\tikz@halign@check{%
  \tikz@do@alignfalse
  \ifx\tikz@text@width\pgfutil@empty%
    \pgfkeysgetvalue{/tikz/node halign header}\tikz@align@header%
    \ifx\tikz@align@header\pgfutil@empty%
    \else%
      \tikz@do@aligntrue%
    \fi%
  \fi%
  \iftikz@do@align%
    % Bingo
    \setbox\tikz@align@aligned@box=\box\pgfutil@voidb@x% void
    \let\\=\tikz@align@newline%
    \expandafter\tikz@start@align%
  \fi%    
}
\def\tikz@align@newline{\unskip\pgfutil@ifnextchar[\tikz@@align@newline{\tikz@@align@newline[0pt]}}%}
\def\tikz@@align@newline[#1]{\egroup\tikz@align@continue\pgfmathparse{#1}\let\tikz@align@temp=\pgfmathresult\tikz@start@align}%
% Two safe boxes for alignment:
\let\tikz@align@aligned@box=\pgfnodeparttextbox
\let\tikz@align@line@box=\tikz@figbox

\def\tikz@start@align{%
  % Start collecting text:
  \setbox\tikz@align@line@box=\hbox\bgroup\bgroup%
    \aftergroup\tikz@align@collectresetcolor\ignorespaces%
}
\def\tikz@align@collectresetcolor{%
  \pgfutil@ifnextchar\reset@color%
  {\reset@color\afterassignment\tikz@align@collectresetcolor\let\tikz@temp=}%
  {\tikz@align@end@check}%
}
\def\tikz@align@end@check{%
  \egroup%
  \ifvoid\tikz@align@aligned@box%
    \setbox\tikz@align@aligned@box=\box\tikz@align@line@box%
  \else%
    \setbox\tikz@align@aligned@box=\vbox{%
      \expandafter\expandafter\expandafter\halign\expandafter\expandafter\expandafter{\tikz@align@header%
        \box\tikz@align@aligned@box\cr%
        \noalign{\vskip\tikz@align@temp pt}%
        \unhbox\tikz@align@line@box\unskip\cr}}%
  \fi%
  \pgfutil@ifnextchar\tikz@align@continue{}
  {%
    % Main continue
      \box\tikz@align@aligned@box%
    \egroup%
  }%
}
\def\tikz@align@continue{\tikz@@align@continue}
\let\tikz@@align@continue=\pgfutil@empty



% Syntax for parts of  nodes:
% node ... {... \nodepart[options]{name} ... \nodepart{name} ...}

\def\tikz@nodepart{\pgfutil@ifnextchar[\tikz@@nodepart{\tikz@@nodepart[]}}%}
\def\tikz@@nodepart[#1]#2{%
  \tikz@atend@node%
  \unskip%
  \gdef\tikz@nodepart@options{#1}%
  \gdef\tikz@nodepart@name{#2}%
  \global\let\tikz@fig@continue=\tikz@nodepart@continue%
  \pgfutil@ifnextchar x{\egroup\relax}{\egroup\relax}% gobble spaces
}
\def\tikz@nodepart@continue{%
  \global\let\tikz@fig@continue=\tikz@fig@continue@orig%
  % Now start new box:
   \expandafter\setbox\csname pgfnodepart\tikz@nodepart@name box\endcsname=\hbox%
      \bgroup%
        \tikzset{every \tikz@nodepart@name\space node part/.try}%
        \expandafter\tikzset\expandafter{\tikz@nodepart@options}%
        \pgfinterruptpicture%
          \tikz@textfont%  
          \ifx\tikz@text@width\pgfutil@empty%
          \else%
            \begingroup%
            	\pgfmathsetlength{\pgf@x}{\tikz@text@width}%
              \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
                \tikz@text@action%
          \fi%
          \bgroup%
            \aftergroup\unskip%
            \ifx\tikz@textcolor\pgfutil@empty%
            \else%
              \pgfutil@colorlet{.}{\tikz@textcolor}%
            \fi%
            \pgfsetcolor{.}%
            \setbox\tikz@figbox=\box\pgfutil@voidb@x%
            \tikz@uninstallcommands%
            \tikz@atbegin@node%
            \aftergroup\tikz@fig@collectresetcolor%
            \tikz@halign@check%
            \ignorespaces%
}

%
% "late" options can be used to "redo" a node
%
\tikzset{late options/.code=\tikz@late@options{#1}}
\def\tikz@late@options#1{%
  % Do a "virtual" node:
  \begingroup%
    \iftikz@shapeborder%
      \let\tikz@fig@name=\tikz@shapeborder@name%
    \else%
      \let\tikz@fig@name=\pgfutil@empty%
    \fi%
    \tikz@is@matrixfalse%
    \let\tikz@options=\pgfutil@empty%
    \let\tikz@after@path=\pgfutil@empty%
    \let\tikz@afternodepathoptions=\pgfutil@empty%
    \let\tikz@alias=\pgfutil@empty%
    \let\tikz@transform=\pgfutil@empty%
    \tikz@decoratepathfalse%
    \tikz@node@reset@hook%
    \tikzset{every node/.try,#1}%
    \ifx\tikz@fig@name\pgfutil@empty%
      \PackageError{tikz}{Late options must reference some existing
        node}{}%
    \fi%
    \tikz@node@begin@hook%
    \tikz@alias%
    \global\let\tikz@last@fig@name=\tikz@fig@name%
    \global\let\tikz@after@path@smuggle=\tikz@after@path%
  \endgroup%
  \let\tikz@to@last@fig@name=\tikz@last@fig@name%
  \let\tikz@to@use@whom=\tikz@to@use@last@fig@name%
  \let\tikzlastnode=\tikz@last@fig@name%
  \ifx\tikz@after@path@smuggle\pgfutil@empty%
  \else%
    \tikz@scan@next@command{\tikz@after@path@smuggle}\pgf@stop%
  \fi%
}


% Auto placement

\def\tikz@auto@pre{%
  \begingroup
    \pgfresetnontranslationattimefalse
    \pgfslopedattimetrue%
    \pgfallowupsidedownattimetrue%
    \tikz@timer%
    \pgf@x=\pgf@pt@aa pt% 
    \pgf@y=\pgf@pt@ab pt%
    \pgfpointnormalised{}%
}

\def\tikz@auto@post{%
    \global\let\tikz@anchor@smuggle=\tikz@anchor%
  \endgroup%
  \let\tikz@anchor=\tikz@anchor@smuggle%
}

\def\tikz@auto@anchor{%
    \ifdim\pgf@x>0.05pt%
      \ifdim\pgf@y>0.05pt%
        \def\tikz@anchor{south east}%
      \else\ifdim\pgf@y<-0.05pt%
        \def\tikz@anchor{south west}%
      \else
        \def\tikz@anchor{south}%
      \fi\fi%
    \else\ifdim\pgf@x<-0.05pt%
      \ifdim\pgf@y>0.05pt%
        \def\tikz@anchor{north east}%
      \else\ifdim\pgf@y<-0.05pt%
        \def\tikz@anchor{north west}%
      \else
        \def\tikz@anchor{north}%
      \fi\fi%
    \else%
      \ifdim\pgf@y>0pt%
        \def\tikz@anchor{east}%
      \else%
        \def\tikz@anchor{west}%
      \fi%
    \fi\fi%
}

\def\tikz@auto@anchor@prime{%
    \ifdim\pgf@x>0.05pt%
      \ifdim\pgf@y>0.05pt%
        \def\tikz@anchor{north west}%
      \else\ifdim\pgf@y<-0.05pt%
        \def\tikz@anchor{north east}%
      \else
        \def\tikz@anchor{north}%
      \fi\fi%
    \else\ifdim\pgf@x<-0.05pt%
      \ifdim\pgf@y>0.05pt%
        \def\tikz@anchor{south west}%
      \else\ifdim\pgf@y<-0.05pt%
        \def\tikz@anchor{south east}%
      \else
        \def\tikz@anchor{south}%
      \fi\fi%
    \else%
      \ifdim\pgf@y>0pt%
        \def\tikz@anchor{west}%
      \else%
        \def\tikz@anchor{east}%
      \fi%
    \fi\fi%
}




% Syntax for trees:
% node {...} child [options] {...} child [options] {...} ...
% node {...} child [options] foreach \var in {list} [options] {...} ...

\def\tikz@children{%
  % Start collecting the children:
  \let\tikz@children@list=\pgfutil@empty%
  \tikznumberofchildren=0\relax%
  \tikz@collect@children c}

\def\tikz@collect@children{\pgfutil@ifnextchar c{\tikz@collect@children@cchar}{\tikz@children@collected}}
\def\tikz@collect@children@cchar c{\pgfutil@ifnextchar h{\tikz@collect@child}{\tikz@children@collected c}}
\def\tikz@collect@child hild{\pgfutil@ifnextchar[{\tikz@collect@childA}{\tikz@collect@childA[]}}%}
\def\tikz@collect@childA[#1]{\pgfutil@ifnextchar f{\tikz@collect@children@foreach[#1]}{\tikz@collect@childB[#1]}}
\def\tikz@collect@childB[#1]{%
  \advance\tikznumberofchildren by1\relax
  \expandafter\def\expandafter\tikz@children@list\expandafter{\tikz@children@list \tikz@childnode[#1]}%
  \pgfutil@ifnextchar\bgroup{\tikz@collect@child@code}{\tikz@collect@child@code{}}}
\def\tikz@collect@child@code#1{%
  \expandafter\def\expandafter\tikz@children@list\expandafter{\tikz@children@list{#1}}%
  \tikz@collect@children%
}
\def\tikz@collect@children@foreach[#1]foreach#2in#3{%
  \pgfutil@ifnextchar\bgroup{\tikz@collect@children@foreachA{#1}{#2}{#3}}{\tikz@collect@children@foreachA{#1}{#2}{#3}{}}}
\def\tikz@collect@children@foreachA#1#2#3#4{%
  \expandafter\def\expandafter\tikz@children@list\expandafter
    {\tikz@children@list\tikz@childrennodes[#1]{#2}{#3}{#4}}%
  \c@pgf@counta=\tikznumberofchildren%
  \foreach#2in{#3}%
  {%
    \global\advance\c@pgf@counta by1\relax%
  }%
  \tikznumberofchildren=\c@pgf@counta%
  \tikz@collect@children%
}
\long\def\tikz@children@collected{%
  \begingroup%
    \advance\tikztreelevel by 1\relax%
    \let\tikz@options=\pgfutil@empty%
    \let\tikz@transform=\pgfutil@empty%
    \tikzset{level/.try=\the\tikztreelevel,level \the\tikztreelevel/.try}%
    \tikz@transform%            
    \let\tikzparentnode=\tikz@last@fig@name%
    % Transform to center of node
    \pgftransformshift{\pgfpointanchor{\tikzparentnode}{\tikz@growth@anchor}}%
    \tikznumberofcurrentchild=0\relax%
    \tikz@children@list%
    \global\setbox\tikz@tempbox=\copy\tikz@figbox%
  \endgroup%
  \setbox\tikz@figbox=\box\tikz@tempbox%  
  \tikz@scan@next@command%
}


% Syntax for children:
%
% child [all children options] foreach \var in {values} [child options] {...}
\def\tikz@childrennodes[#1]#2#3#4{%
  \c@pgf@counta=\tikznumberofcurrentchild\relax%
  \setbox\tikz@tempbox=\box\tikz@figbox%
  \foreach#2in{#3}{%
    \tikznumberofcurrentchild=\c@pgf@counta\relax%
    \setbox\tikz@figbox=\box\tikz@tempbox%
    \tikz@childnode[#1]{#4}%
    % we must now make the current child number and the figbox survive
    % the group
    \global\c@pgf@counta=\tikznumberofcurrentchild\relax%
    \global\setbox\tikz@tempbox=\box\tikz@figbox%
  }%
  \tikznumberofcurrentchild=\c@pgf@counta\relax%
  \setbox\tikz@figbox=\box\tikz@tempbox%
}


% Syntax for child:
%
% child
%
% child[options]
%
% child[options] {node (name) {child node text} ...
%   edge from parent[options] node {label text} node {label text}}

\def\tikz@childnode[#1]#2{%
  \advance\tikznumberofcurrentchild by1\relax%
  {\tikzset{every child/.try,#1}\expandafter}%
  \iftikz@child@missing%
  \else%
  \setbox\tikz@figbox=\hbox\bgroup%
    \unhbox\tikz@figbox%
    \hbox\bgroup\bgroup%
        \pgfinterruptpath%
          \pgfscope%
            \let\tikz@transform=\pgfutil@empty%
            \tikzset{every child/.try,#1}%
            \tikz@options%
            \tikz@transform%            
            \tikz@grow%
            % Typeset node:
            \edef\tikz@parent@node@name{[name=\tikzparentnode-\the\tikznumberofcurrentchild,style=every child node]}%
            \def\tikz@child@node@text{[shape=coordinate]{}}
            \tikz@parse@child@node#2\pgf@stop%
            \expandafter\expandafter\expandafter\node
            \expandafter\tikz@parent@node@name
              \tikz@child@node@text
              \pgfextra{\global\let\tikz@childnode@name=\tikz@last@fig@name};%
            \let\tikzchildnode=\tikz@childnode@name%
            {%
              \def\tikz@edge@to@parent@needed{edge from parent}
              \ifx\tikz@child@node@rest\pgfutil@empty%
                \path edge from parent;%
              \else%
                \path (0,0) \tikz@child@node@rest \tikz@edge@to@parent@needed;%
              \fi%
            }%
        \endpgfscope%
      \endpgfinterruptpath%
    \egroup\egroup%
  \egroup%
  \fi%
}

\def\tikz@parse@child@node{%
  \pgfutil@ifnextchar n{\tikz@parse@child@node@n}%
  {\pgfutil@ifnextchar c{\tikz@parse@child@node@c}%
    {\tikz@parse@child@node@rest}}}
\def\tikz@parse@child@node@rest#1\pgf@stop{\def\tikz@child@node@rest{#1}}
\def\tikz@parse@child@node@c c{\pgfutil@ifnextchar o{\tikz@parse@child@node@co}{\tikz@parse@child@node@rest c}}
\def\tikz@parse@child@node@co o{\pgfutil@ifnextchar o{\tikz@parse@child@node@coordinate}{\tikz@parse@child@node@rest co}}
\def\tikz@parse@child@node@coordinate ordinate{%
  \pgfutil@ifnextchar ({\tikz@@parse@child@node@coordinate}{%
    \def\tikz@child@node@text{[shape=coordinate]{}}%
    \tikz@parse@child@node@rest}}%}
\def\tikz@@parse@child@node@coordinate(#1){%
  \pgfutil@ifnextchar a{\tikz@p@c@n@c@at(#1)}{%
    \def\tikz@child@node@text{[shape=coordinate,name=#1]{}}%
    \tikz@parse@child@node@rest}}
\def\tikz@p@c@n@c@at(#1)at#2({%
  \def\tikz@child@node@text@pre{[shape=coordinate,name=#1]at}%
  \tikz@scan@one@point\tikz@p@c@n@c@at@math(%
}
\def\tikz@p@c@n@c@at@math#1{%
  \pgf@process{#1}%
  \edef\tikz@marshal{(\the\pgf@x,\the\pgf@y){}}%
  \expandafter\expandafter\expandafter\def%
  \expandafter\expandafter\expandafter\tikz@child@node@text%
  \expandafter\expandafter\expandafter{\expandafter\tikz@child@node@text@pre\tikz@marshal}%
  \tikz@parse@child@node@rest%
}
\def\tikz@parse@child@node@n node{%
  \let\tikz@child@node@text=\pgfutil@empty%
  \tikz@p@c@s}%
\def\tikz@p@c@s{%
  \pgfutil@ifnextchar a{\tikz@p@c@s@at}
  {\pgfutil@ifnextchar ({\tikz@p@c@s@paran}
    {\pgfutil@ifnextchar [{\tikz@p@c@s@bra}
      {\pgfutil@ifnextchar \bgroup{\tikz@p@c@s@group}
        {\PackageError{tikz}{Cannot parse this node}{}}}}}}%}}
\def\tikz@p@c@s@at at#1({%
  \tikz@scan@one@point\tikz@p@c@s@at@math(%
}
\def\tikz@p@c@s@at@math#1{%
  \pgf@process{#1}%
  \edef\tikz@marshal{ at(\the\pgf@x,\the\pgf@y)}%
  \expandafter\expandafter\expandafter\def%
  \expandafter\expandafter\expandafter\tikz@child@node@text%
  \expandafter\expandafter\expandafter{\expandafter\tikz@child@node@text\tikz@marshal}
  \tikz@p@c@s}
\def\tikz@p@c@s@paran(#1){%
  \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text(#1)}
  \tikz@p@c@s}
\def\tikz@p@c@s@bra[#1]{%
  \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text[#1]}
  \tikz@p@c@s}
\def\tikz@p@c@s@group#1{%
  \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text{#1}}
  \tikz@parse@child@node@rest}



% 
% Syntax for decorated subpaths:
%
% decorate [option] { subpath }
%
\def\tikz@decoration ecorate{%
  \pgfutil@ifnextchar[{\tikz@lib@decoration}{\tikz@lib@decoration[]}%]
}

\def\tikz@lib@decoration[#1]#2{\PackageError{tikz}{You need to load a decoration library}{}}

% The decorate path command:
\def\tikz@lib@dec@decorate@path{\PackageError{tikz}{You need to load a decoration library}{}}



% 
% Syntax for let :
%
% let \p1 = (coordinate), \p2 = (coordinate),... in 
%
\def\tikz@let@command et#1in{%
  \PackageError{tikz}{You need to say \string\usetikzlibrary{calc} to use the let command}{}%
}



%
% Timers
% 

\def\tikz@timer@line{%
  \pgftransformlineattime{\tikz@time}{\tikz@timer@start}{\tikz@timer@end}%
}

\def\tikz@timer@vhline{%
  \ifdim\tikz@time pt<0.5pt% first half
    \pgf@process{\tikz@timer@start}%
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \pgf@process{\tikz@timer@end}%
    \pgf@xb=\tikz@time pt%
    \pgf@xb=2\pgf@xb%    
    \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
        \noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}}%
    \tikz@marshal%
  \else% second half
    \pgf@process{\tikz@timer@start}%
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \pgf@process{\tikz@timer@end}%
    \pgf@xb=\tikz@time pt%
    \pgf@xb=2\pgf@xb%
    \advance\pgf@xb by-1pt%
    \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
      {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}{\noexpand\tikz@timer@end}}%
    \tikz@marshal%
  \fi%
}

\def\tikz@timer@hvline{%
  \ifdim\tikz@time pt<0.5pt% first half
    \pgf@process{\tikz@timer@start}%
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \pgf@process{\tikz@timer@end}%
    \pgf@xb=\tikz@time pt%
    \pgf@xb=2\pgf@xb%    
    \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
        \noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}}%
    \tikz@marshal%
  \else% second half
    \pgf@process{\tikz@timer@start}%
    \pgf@xa=\pgf@x%
    \pgf@ya=\pgf@y%
    \pgf@process{\tikz@timer@end}%
    \pgf@xb=\tikz@time pt%
    \pgf@xb=2\pgf@xb%
    \advance\pgf@xb by-1pt%
    \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
      {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}{\noexpand\tikz@timer@end}}%
    \tikz@marshal%
  \fi%
}

\def\tikz@timer@curve{%
  \pgftransformcurveattime{\tikz@time}{\tikz@timer@start}{\tikz@timer@cont@one}{\tikz@timer@cont@two}{\tikz@timer@end}%
}



%
% Coordinate systems
% 

\def\tikzdeclarecoordinatesystem#1#2{%
  \expandafter\def\csname tikz@parse@cs@#1\endcsname(##1){%
    \pgf@process{%
      #2%
      \global\let\tikz@smubble@b=\tikz@shapeborder@name%
    }%
    \let\tikz@shapeborder@name=\tikz@smubble@b%
    \edef\tikz@return@coordinate{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
}
\def\tikzaliascoordinatesystem#1#2{%
  \edef\pgf@marshal{\noexpand\let\expandafter\noexpand\csname
    tikz@parse@cs@#1\endcsname=\expandafter\noexpand\csname
    tikz@parse@cs@#2\endcsname}%
  \pgf@marshal%
}


% Default coodinate systems:

\tikzdeclarecoordinatesystem{canvas}
{%
  \tikzset{cs/.cd,x=0pt,y=0pt,#1}%
  \pgfpoint{\tikz@cs@x}{\tikz@cs@y}%
}

\tikzdeclarecoordinatesystem{canvas polar}
{%
  \tikzset{cs/.cd,angle=0,radius=0cm,#1}%
  \pgfpointpolar{\tikz@cs@angle}{\tikz@cs@xradius and \tikz@cs@yradius}%
}

\tikzdeclarecoordinatesystem{xyz}
{%
  \tikzset{cs/.cd,x=0,y=0,z=0,#1}%
  \pgfpointxyz{\tikz@cs@x}{\tikz@cs@y}{\tikz@cs@z}%
}

\tikzdeclarecoordinatesystem{xyz polar}
{%
  \tikzset{cs/.cd,angle=0,radius=0,#1}%
  \pgfpointpolarxy{\tikz@cs@angle}{\tikz@cs@xradius and \tikz@cs@yradius}%
}
\tikzaliascoordinatesystem{xy polar}{xyz polar}


\tikzdeclarecoordinatesystem{node}
{%
  \tikzset{cs/.cd,name=,anchor=none,angle=none,#1}%
  \ifx\tikz@cs@anchor\tikz@nonetext%
    \ifx\tikz@cs@angle\tikz@nonetext%
      \expandafter\ifx\csname pgf@sh@ns@\tikz@cs@node\endcsname\tikz@coordinate@text%
      \else
        \aftergroup\tikz@shapebordertrue%
        \edef\tikz@shapeborder@name{\tikz@cs@node}%
      \fi%
      \pgfpointanchor{\tikz@cs@node}{center}%
    \else%
      \pgfpointanchor{\tikz@cs@node}{\tikz@cs@angle}%
    \fi%
  \else%
    \pgfpointanchor{\tikz@cs@node}{\tikz@cs@anchor}%
  \fi%
}

% Intersection coordinates
\tikzset{cs/first line/.code=\def\tikz@cs@line@a{#1}\def\tikz@cs@type@a{line}}
\tikzset{cs/second line/.code=\def\tikz@cs@line@b{#1}\def\tikz@cs@type@b{line}}

\tikzset{cs/first node/.code=\tikz@cs@unpack{\tikz@cs@node@a}{\tikz@cs@type@a}{#1}}
\tikzset{cs/second node/.code=\tikz@cs@unpack{\tikz@cs@node@b}{\tikz@cs@type@b}{#1}}

\def\tikz@cs@unpack#1#2#3{%
  \expandafter\ifx\csname pgf@sh@ns@#3\endcsname\relax%
    \PackageError{tikz}{Undefined node ``#3''}{}%
  \else%
    \def#1{#3}%
    \edef#2{\csname pgf@sh@ns@#3\endcsname}%
  \fi%
}

\tikzset{cs/solution/.initial=1}

\tikzset{cs/horizontal line through/.store in=\tikz@cs@hori@line}
\tikzset{cs/vertical line through/.store in=\tikz@cs@vert@line}

\tikzdeclarecoordinatesystem{intersection}
{%
  \tikzset{cs/.cd,#1}%
  \expandafter\ifx\csname tikz@intersect@\tikz@cs@type@a @and@\tikz@cs@type@b\endcsname\relax%
    \PackageError{tikz}{I do not know how to compute the intersection
    of a \tikz@cs@type@a and a \tikz@cs@type@b. Try saying
    \string\usetikzlibrary{calc}}{}%
    \pgfpointorigin%
  \else%
    \csname tikz@intersect@\tikz@cs@type@a @and@\tikz@cs@type@b\endcsname%
  \fi%
}

\def\tikz@intersect@line@and@line{%
  \expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@a%
  \pgf@xa=\pgf@xc%
  \pgf@ya=\pgf@yc%
  \pgf@xb=\pgf@x%
  \pgf@yb=\pgf@y%
  \expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@b%
  \edef\pgf@marshal{%
    {\noexpand\pgfpointintersectionoflines%
      {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
      {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
      {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}}%
  \pgf@marshal%
}

\def\tikz@parse@line#1--{%
  \pgf@process{#1}%
  \pgf@xc=\pgf@x%
  \pgf@yc=\pgf@y%
  \tikz@scan@one@point\pgf@process%
}


\tikzdeclarecoordinatesystem{perpendicular}
{%
  \tikzset{cs/.cd,#1}%
  \expandafter\tikz@scan@one@point\expandafter\tikz@parse@intersection@a\tikz@cs@hori@line%
  \expandafter\tikz@scan@one@point\expandafter\tikz@parse@intersection@b\tikz@cs@vert@line%
  \pgfqpoint{\the\pgf@xb}{\the\pgf@ya}
}

\tikzdeclarecoordinatesystem{barycentric}
{%
  {%
    \pgf@xa=0pt% point
    \pgf@ya=0pt%
    \pgf@xb=0pt% sum
    \tikz@bary@dolist#1,=,%
    \pgfmathparse{1/\the\pgf@xb}%
    \global\pgf@x=\pgfmathresult\pgf@xa%
    \global\pgf@y=\pgfmathresult\pgf@ya%
  }%
}

\def\tikz@bary@dolist#1=#2,{%
  \def\tikz@temp{#1}%
  \ifx\tikz@temp\pgfutil@empty%
  \else
    \pgf@process{\pgfpointanchor{#1}{center}}%
    \pgfmathparse{#2}%
    \advance\pgf@xa by\pgfmathresult\pgf@x%
    \advance\pgf@ya by\pgfmathresult\pgf@y%
    \advance\pgf@xb by\pgfmathresult pt%
    \expandafter\tikz@bary@dolist%
  \fi%
}

\tikzset{cs/x/.store in=\tikz@cs@x}
\tikzset{cs/y/.store in=\tikz@cs@y}
\tikzset{cs/z/.store in=\tikz@cs@z}
\tikzset{cs/angle/.store in=\tikz@cs@angle}
\tikzset{cs/x radius/.store in=\tikz@cs@xradius}
\tikzset{cs/y radius/.store in=\tikz@cs@yradius}
\tikzset{cs/radius/.style={/tikz/cs/x radius=#1,/tikz/cs/y radius=#1}}
\tikzset{cs/name/.store in=\tikz@cs@node}
\tikzset{cs/anchor/.store in=\tikz@cs@anchor}



%
% Coordinate management
%


% Last position visited
\def\tikz@last@position{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}
\def\tikz@last@position@saved{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}

% Make given point the last position visited
\def\tikz@make@last@position#1{%
  \pgf@process{#1}%
  \tikz@lastx=\pgf@x\relax%
  \tikz@lasty=\pgf@y\relax%
  \iftikz@updatecurrent%
    \tikz@lastxsaved=\pgf@x\relax%
    \tikz@lastysaved=\pgf@y\relax%
  \fi%
  \tikz@updatecurrenttrue%
}

\newif\iftikz@updatecurrent
\tikz@updatecurrenttrue



% Scanner: Scans a point or a relative point. 
% It then calls the first parameter with the argument set to an
% appropriate pgf command representing that point.

\def\tikz@scan@one@point#1{%
  \let\tikz@to@use@whom=\tikz@to@use@last@coordinate%
  \tikz@shapeborderfalse%
  \pgfutil@ifnextchar+{\tikz@scan@relative#1}{\tikz@scan@absolute#1}}
\def\tikz@scan@absolute#1{%
  \pgfutil@ifnextchar({\tikz@scan@@absolute#1}%)
  {%
    \advance\tikz@expandcount by -1%
    \ifnum\tikz@expandcount<0\relax%
      \let\@next=\tikz@@scangiveup%
    \else%
      \let\@next=\tikz@@scanexpand%
    \fi%
    \@next{#1}%
  }%
}
\def\tikz@@scanexpand#1{\expandafter\tikz@scan@one@point\expandafter#1}
\def\tikz@@scangiveup#1{\PackageError{tikz}{Cannot parse this coordinate}{}#1{\pgfpointorigin}}
\def\tikz@scan@@absolute#1({%
  \pgfutil@ifnextchar[% uhoh... options!
  {\def\tikz@scan@point@recall{#1}\tikz@scan@options}%
  {\tikz@@@scan@@absolute#1(}%
}

\def\tikz@scan@options[#1]#2{%
  \def\tikz@scan@point@options{#1}%
  \tikz@@@scan@@absolute\tikz@scan@handle@options(#2%
}

\def\tikz@scan@handle@options#1{%
  {%
    % Ok, compute point with options set and zero transformation
    % matrix:
    \pgftransformreset%
    \let\tikz@transform=\pgfutil@empty%
    \expandafter\tikzset\expandafter{\tikz@scan@point@options}%
    \tikz@transform%
    \pgf@process{\pgfpointtransformed{#1}}%
    \xdef\tikz@marshal{\expandafter\noexpand\tikz@scan@point@recall{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
  }%
  \tikz@marshal%  
}

\def\tikz@@@scan@@absolute#1({%
  \pgfutil@ifnextchar{$}%$
  {\tikz@parse@calculator#1(}
  {\tikz@scan@no@calculator#1(}%
}
\def\tikz@scan@no@calculator#1(#2){%
  \edef\tikz@temp{(#2)}%
  \expandafter\tikz@@scan@@no@calculator\expandafter#1\tikz@temp%
}
\def\tikz@@scan@@no@calculator#1(#2){%
  \pgfutil@in@{cs:}{#2}%
  \ifpgfutil@in@%
    \let\@next\tikz@parse@coordinatesystem%
  \else%
    \pgfutil@in@{intersection }{#2}%
    \ifpgfutil@in@%
      \let\@next\tikz@parse@intersection%
    \else%
      \pgfutil@in@|{#2}%
      \ifpgfutil@in@
        \pgfutil@in@{-|}{#2}%
        \ifpgfutil@in@
          \let\@next\tikz@parse@hv%
        \else%
          \let\@next\tikz@parse@vh%
        \fi%
      \else%
        \pgfutil@in@:{#2}%
        \ifpgfutil@in@
          \let\@next\tikz@parse@polar%
        \else%
          \pgfutil@in@,{#2}%
          \ifpgfutil@in@%      
            \let\@next\tikz@parse@regular%
          \else%
            \let\@next\tikz@parse@node%
          \fi%
        \fi%
      \fi%
    \fi%
  \fi%
  \@next#1(#2)%
}

\def\tikz@parse@calculator#1($#2$){%
  \PackageError{tikz}{You need to say \string\usetikzlibrary{calc} for
    coordinate calculation}{}%
  #1{\pgfpointorigin}%
}

\def\tikz@parse@coordinatesystem#1(#2 cs:#3){%
  \let\tikz@return@coordinate=\pgfpointorigin%
  \pgfutil@ifundefined{tikz@parse@cs@#2}
  {\PackageError{tikz}{Unknown coordinate system '#2'}{}}
  {\csname tikz@parse@cs@#2\endcsname(#3)}%
  \expandafter#1\expandafter{\tikz@return@coordinate}%
}


\newif\iftikz@isdimension
\def\tikz@checkunit#1{%
  \pgfmathparse{#1}%
  \let\iftikz@isdimension=\ifpgfmathunitsdeclared%
}

\def\tikz@parse@polar#1(#2:#3){%
  \pgfutil@ifundefined{tikz@polar@dir@#2}
  {\tikz@@parse@polar#1(#2:#3)}
  {\tikz@@parse@polar#1(\csname tikz@polar@dir@#2\endcsname:#3)}%
}
\def\tikz@@parse@polar#1(#2:#3){%
  \pgfutil@in@{ and }{#3}%
  \ifpgfutil@in@%
    \edef\tikz@args{(#2:#3)}%
  \else%
    \edef\tikz@args{(#2:#3 and #3)}%
  \fi%
  \expandafter\tikz@@@parse@polar\expandafter#1\tikz@args%
}
\def\tikz@@@parse@polar#1(#2:#3 and #4){%
  \tikz@checkunit{#3}%
  \iftikz@isdimension%
    \tikz@checkunit{#4}%
    \iftikz@isdimension%
      \def\tikz@next{#1{\pgfpointpolar{#2}{#3 and #4}}}%
    \else%
      \PackageError{tikz}{You cannot mix dimension and dimensionless values for polar coordinates}{}
      \def\tikz@next{#1{\pgfpointorigin}}%
    \fi%
  \else%
    \tikz@checkunit{#4}%
    \iftikz@isdimension%
      \PackageError{tikz}{You cannot mix dimension and dimensionless values for polar coordinates}{}
      \def\tikz@next{#1{\pgfpointorigin}}%
    \else%
      \def\tikz@next{#1{\pgfpointpolarxy{#2}{#3 and #4}}}%
    \fi%
  \fi%
  \tikz@next%
}
\def\tikz@polar@dir@up{90}
\def\tikz@polar@dir@down{-90}
\def\tikz@polar@dir@left{180}
\def\tikz@polar@dir@right{0}
\def\tikz@polar@dir@north{90}
\def\tikz@polar@dir@south{-90}
\def\tikz@polar@dir@east{0}
\def\tikz@polar@dir@west{180}
\expandafter\def\csname tikz@polar@dir@north east\endcsname{45}
\expandafter\def\csname tikz@polar@dir@north west\endcsname{135}
\expandafter\def\csname tikz@polar@dir@south east\endcsname{-45}
\expandafter\def\csname tikz@polar@dir@south west\endcsname{-135}


% MW: 
% Check to see if the y-coordinate is inside {}. If it is, scan it and
% reinsert it into the stream inside an extra group. 
%
% MW: 
% Check to see if the y-coordinate is inside {}. If it is, scan it and
% reinsert it into the stream inside an extra group. 
%
\def\tikz@parse@regular#1(#2,{%
	\pgfutil@ifnextchar\bgroup{\tikz@@parse@regular#1{#2}}{\tikz@@@parse@regular#1{#2}}%
}
\def\tikz@@parse@regular#1#2#3{%
	\pgfutil@ifnextchar[{% Uh oh! An array index.
		\tikz@@@parse@regular#1{#2}{#3}}%
	  {\tikz@@@parse@regular#1{#2}{{#3}}}}
	  
% Originally \def\tikz@parse@regular#1(#2,#3){%
%
\def\tikz@@@parse@regular#1#2#3){%
  \pgfutil@in@,{#3}%
  \ifpgfutil@in@%  
    \tikz@parse@splitxyz{#1}{#2}#3,%
  \else%
    \tikz@checkunit{#2}%
    \iftikz@isdimension%
      \tikz@checkunit{#3}%
      \iftikz@isdimension%
        \def\@next{#1{\pgfpoint{#2}{#3}}}%
      \else%
        \def\@next{#1{\pgfpointadd{\pgfpoint{#2}{0pt}}{\pgfpointxy{0}{#3}}}}%
      \fi%
    \else%
      \tikz@checkunit{#3}%
      \iftikz@isdimension%
        \def\@next{#1{\pgfpointadd{\pgfpoint{0pt}{#3}}{\pgfpointxy{#2}{0}}}}%
      \else%
        \def\@next{#1{\pgfpointxy{#2}{#3}}}%
      \fi%
    \fi%
  \fi%
  \@next%
}

\def\tikz@parse@splitxyz#1#2#3,#4,{%
  \def\@next{#1{\pgfpointxyz{#2}{#3}{#4}}}%
}

\def\tikz@coordinate@text{coordinate}

\def\tikz@parse@node#1(#2){%
  \pgfutil@in@.{#2}% Ok, flag this
  \ifpgfutil@in@
    \tikz@calc@anchor#2\tikz@stop%
  \else%
    \tikz@calc@anchor#2.center\tikz@stop% to be on the save side, in
                                % case iftikz@shapeborder is ignored...
    \expandafter\ifx\csname pgf@sh@ns@#2\endcsname\tikz@coordinate@text%
    \else
      \tikz@shapebordertrue%
      \def\tikz@shapeborder@name{#2}%
    \fi%
  \fi%
  \edef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
  \tikz@marshal%
}

\def\tikz@calc@anchor#1.#2\tikz@stop{%
  \pgfpointanchor{#1}{#2}%
}


\def\tikz@parse@hv#1(#2){%
  \pgfutil@in@{ -| }{#2}%
  \ifpgfutil@in@%
    \let\tikz@next=\tikz@parse@hvboth%
  \else%
    \pgfutil@in@{ -|}{#2}%
    \ifpgfutil@in@%
      \let\tikz@next=\tikz@parse@hvleft%
    \else%
      \pgfutil@in@{-| }{#2}%
      \ifpgfutil@in@%
        \let\tikz@next=\tikz@parse@hvright%
      \else%
        \let\tikz@next=\tikz@parse@hvdone%
      \fi%
    \fi%
  \fi%
  \tikz@next#1(#2)}
\def\tikz@parse@hvboth#1(#2 -| #3){\tikz@parse@vhdone#1(#3|-#2)}
\def\tikz@parse@hvleft#1(#2 -|#3){\tikz@parse@vhdone#1(#3|-#2)}
\def\tikz@parse@hvright#1(#2-| #3){\tikz@parse@vhdone#1(#3|-#2)}
\def\tikz@parse@hvdone#1(#2-|#3){\tikz@parse@vhdone#1(#3|-#2)}

\def\tikz@parse@vh#1(#2){%
  \pgfutil@in@{ |- }{#2}%
  \ifpgfutil@in@%
    \let\tikz@next=\tikz@parse@vhboth%
  \else%
    \pgfutil@in@{ |-}{#2}%
    \ifpgfutil@in@%
      \let\tikz@next=\tikz@parse@vhleft%
    \else%
      \pgfutil@in@{|- }{#2}%
      \ifpgfutil@in@%
        \let\tikz@next=\tikz@parse@vhright%
      \else%
        \let\tikz@next=\tikz@parse@vhdone%
      \fi%
    \fi%
  \fi%
  \tikz@next#1(#2)}
\def\tikz@parse@vhboth#1(#2 |- #3){\tikz@parse@vhdone#1(#2|-#3)}
\def\tikz@parse@vhleft#1(#2 |-#3){\tikz@parse@vhdone#1(#2|-#3)}
\def\tikz@parse@vhright#1(#2|- #3){\tikz@parse@vhdone#1(#2|-#3)}
\def\tikz@parse@vhdone#1(#2|-#3){%
  {%
    \tikz@@@scan@@absolute\tikz@parse@vh@mid(#2)%
    \tikz@@@scan@@absolute\tikz@parse@vh@end(#3)%
    \xdef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}}%
  }%
  \tikz@marshal%
}
\def\tikz@parse@vh@mid#1{\pgf@process{#1}\pgf@xa=\pgf@x}
\def\tikz@parse@vh@end#1{\pgf@process{#1}\pgf@ya=\pgf@y}

\def\tikz@parse@intersection#1(intersection{%
  \pgfutil@ifnextchar o{%
    \tikz@parse@main@intersection#1 1%
  }{%
    \tikz@parse@main@intersection#1%
  }%
}
\def\tikz@parse@main@intersection#1#2of #3 and #4){%
  \tikzset{cs/solution=#2}%
  \pgfutil@in@{--}{#3}%
  \ifpgfutil@in@%
    \tikz@reparse@line{first}#3\pgf@stop%
  \else%
    \tikzset{cs/first node=#3}%
  \fi%
  \pgfutil@in@{--}{#4}%
  \ifpgfutil@in@%
    \tikz@reparse@line{second}#4\pgf@stop%
  \else%
    \tikzset{cs/second node=#4}%
  \fi%
  \tikz@parse@cs@intersection()% advanced hackery...
  \edef\pgf@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
  \pgf@marshal%
}
\def\tikz@reparse@line#1#2--#3\pgf@stop{%
  \tikzset{cs/#1 line={(#2)--(#3)}}%
}


\def\tikz@parse@intersection@a#1{\pgf@process{#1}\pgf@xa=\pgf@x\pgf@ya=\pgf@y}
\def\tikz@parse@intersection@b#1{\pgf@process{#1}\pgf@xb=\pgf@x\pgf@yb=\pgf@y}

\def\tikz@scan@relative#1+{%
  \pgfutil@ifnextchar+{\tikz@scan@plusplus#1}{\tikz@scan@oneplus#1}}

\def\tikz@scan@plusplus#1+{%
  \def\tikz@doafter{#1}%
  \tikz@scan@absolute\tikz@add%
}
\def\tikz@add#1{%
  \tikz@doafter{\pgfpointadd{#1}{\tikz@last@position@saved}}%
}
\def\tikz@scan@oneplus#1{%
  \def\tikz@doafter{#1}%
  \tikz@updatecurrentfalse%
  \tikz@scan@absolute\tikz@add%
} 


% Loading further libraries

% Include a library file.
%
% #1 = List of names of library file.
%  
% Description:
%
% This command includes a list of TikZ library files. For each file X in the
% list, the file tikzlibraryX.code.tex is included, provided this has
% not been done earlier. 
%
% For the convenience of Context users, both round and square brackets
% are possible for the argument.
%
% Example:
%
% \usetikzlibrary{arrows}
% \usetikzlibrary[patterns,topaths]

\def\usetikzlibrary{\pgfutil@ifnextchar[{\use@tikzlibrary}{\use@@tikzlibrary}}%}
\def\use@tikzlibrary[#1]{\use@@tikzlibrary{#1}}
\def\use@@tikzlibrary#1{%
  \edef\pgf@list{#1}%
  \pgfutil@for\pgf@temp:=\pgf@list\do{%
	\expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}%
	\ifx\pgf@temp\pgfutil@empty
	\else
		\expandafter\ifx\csname tikz@library@\pgf@temp @loaded\endcsname\relax%
		  \expandafter\global\expandafter\let\csname tikz@library@\pgf@temp @loaded\endcsname=\pgfutil@empty%
		  \expandafter\edef\csname tikz@library@#1@atcode\endcsname{\the\catcode`\@}
		  \expandafter\edef\csname tikz@library@#1@barcode\endcsname{\the\catcode`\|}
		  \catcode`\@=11
		  \catcode`\|=12
		  \input tikzlibrary\pgf@temp.code.tex
		  \catcode`\@=\csname tikz@library@#1@atcode\endcsname
		  \catcode`\|=\csname tikz@library@#1@barcode\endcsname
		\fi%
	\fi
  }%
}


% Always-present libraries:

\usetikzlibrary{topaths}




\endinput
