commit f50ed902fe86c1b0005826dfd8a49dd5258e3724 Author: Minseong Gwak Date: Wed Jun 3 09:20:51 2026 +0900 teamnote default diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..542f714 --- /dev/null +++ b/.gitignore @@ -0,0 +1,331 @@ +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bbl-SAVE-ERROR +*.bcf +*.bcf-SAVE-ERROR +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync +*.rubbercache +rubber.cache + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# attachfile2 +*.atfi + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc +*.loc + +# comment +*.cut + +# context +*.tuc +*.tui +*.tuo + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glg-abr +*.glo +*.glo-abr +*.gls +*.gls-abr +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hypdoc +*.hd + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# latexindent will create succesive backup files by default +#*.bak* + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.data.minted +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# spelling +*.spell.bad +*.spell.txt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# latexindent.pl +*.bak[0-9]* + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f1a10df --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "latex-workshop.latex.tools": [ + { + "name": "latexmk", + "command": "latexmk", + "args": [ + "-shell-escape", + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "-pdf", + "-outdir=%OUTDIR%", + "%DOC%" + ], + "env": {} + }], +} \ No newline at end of file diff --git a/main.pdf b/main.pdf new file mode 100644 index 0000000..b030c31 Binary files /dev/null and b/main.pdf differ diff --git a/main.tex b/main.tex new file mode 100644 index 0000000..7f6af12 --- /dev/null +++ b/main.tex @@ -0,0 +1,1068 @@ +\documentclass[landscape, 8pt, a4paper, oneside]{extarticle} +% \documentclass[portrait, 8pt, a4paper, oneside, twocolumn]{extarticle} +\usepackage{teamnote} + +\usepackage[hangul]{kotex} + +\usepackage[most]{tcolorbox} + +\usepackage{multirow} +\usepackage{adjustbox} +\usepackage{subfiles} +\usepackage{amsmath} + +\usepackage{etoolbox} +\AtBeginEnvironment{align*}{% + +\setlength{\abovedisplayskip}{0pt} +\setlength{\belowdisplayskip}{0pt} +\setlength{\abovedisplayshortskip}{0pt} +\setlength{\belowdisplayshortskip}{0pt} + +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage{enumitem} + +\setlistdepth{9} +\newlist{IdeaNote}{enumerate}{6} +\setlist[IdeaNote]{topsep=0pt,itemsep=-1ex,partopsep=1ex,parsep=1ex} +\setlist[IdeaNote, 1]{label= \Roman*. } +\setlist[IdeaNote, 2]{label= \Alph*. } +\setlist[IdeaNote, 3]{label= \arabic*. } +\setlist[IdeaNote, 4]{label= \roman*) } +\setlist[IdeaNote, 5]{label= \alph*) } +\setlist[IdeaNote, 6]{label= \arabic*) } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\usepackage{multicol} +\setlength\columnseprule{0.5pt} + +\teamnote{POSTECH}{ConSpirito}{}{ICPC Seoul Regional} + +\ShowUsage +\ShowComplexity +\HideAuthor + +\begin{document} + +\begin{multicols}{3} + +\maketitlepage + +\par\noindent\rule{\columnwidth}{0.4pt} + +\section{Have you...} + +\subsection{tried...} + +\begin{itemize} + \item \textcolor{red}{\textbf{Reading the problem once more?}} + \item doubting ``obvious" things? + \item writing obivous things? + \item radical greedy approach? + \item thinking in reverse direction? + \item a greedy algorithm? + \item network flow when your greedy algorithms stuck? + \item a dynamic programming? + \item checking the range of answer? + \item random algorithm? + \item graph modeling using states? + \item inverting state only on odd indexes? + \item calculating error bound on a real number usage? +\end{itemize} + +\subsection{checked...} + +\begin{itemize} + \item \textcolor{red}{\textbf{you have read the statement correctly?}} + \item typo copying the team note? + \item initialization on multiple test case problem? + \item additional information from the problem? + \item undefined behavior? + \item overflow? + \item function without return value? + \item real number error? + \item implicit conversion? + \item comparison between signed and unsigned integer? +\end{itemize} + +\subsection{Geometry?} +\begin{itemize} + \item 1 point? 2 points? line? 3 or more points on a line? + \item parallel line? points on line? circle? + \item degenerate case? endpoints of segment? +\end{itemize} + +% \pagebreak + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Algorithmic Idea Note} +When you don't have any ideas, please bruteforce it. +\begin{tcolorbox}[breakable, enhanced, sharp corners, colback=white, colframe=black, boxrule=1pt, left=0pt] + +\begin{IdeaNote} +\item Complete Search: Backtracking \& Pruning + +\item Math + \begin{IdeaNote} + \item Number Theory + \begin{IdeaNote} + \item Prime Number + \begin{IdeaNote} + \item Sieve of Eratosthenes, Prime Factorization + \item Fast Prime Verdict; Millar-Rabin + \item Fast Prime Factorization; Pollad Rho + \item Primitive Root + \end{IdeaNote} + \item Extended Euclidean Algorithm; Diophantos Equation + \item Chinese Remainder Theorem + \item Harmonic Lemma + \item Floor Sum (Sum of Rational Arithmetic Sequence) + \item Several Sieves + \end{IdeaNote} + \item Linear Programming + \begin{IdeaNote} + \item Solve (some) LP with Shortest Path + \end{IdeaNote} + \item FFT \& Polynomials + \begin{IdeaNote} + \item FFT : Convolution + \begin{IdeaNote} + \item High precision FFT with modulo 1e9+7 + \end{IdeaNote} + \item NTT : Number Theoretic Tranform + \item Quotient Ring (Formal Power Series) + \begin{IdeaNote} + \item Multiplication + \item FPS : Inverse / Division + \item Integration / Differentiation + \item FPS : Logarithm / Exponentiation + \item FPS : Power of Polynomial + \item Division - Quotient \& Remainder + \item Polynomial Taylor Shift + \item Multipoint Evaluation + \end{IdeaNote} + \end{IdeaNote} + \item Combinatorics + \begin{IdeaNote} + \item Labeled Combinatorial Target + \item The Twelvefold Way (12정도) + \item Generating Function + \begin{IdeaNote} + \item OGF(Ordinary Generating Function) + \item EGF(Exponentional Generating Function) + \item DGF?(Dirichlet Genetration Function) : Number Theory + \end{IdeaNote} + \item Umbral Calculus + \end{IdeaNote} + \end{IdeaNote} + +\item Linear Algebra + +\item Geometry + \begin{IdeaNote} + \item Basic Tools + \begin{IdeaNote} + \item Outer Product (CCW) + \item Sorting by Polar + \item Segment Intersection + \item Closest Point + \item Furthest Point + \end{IdeaNote} + \item Convex Polygon (Convex Hull) + \begin{IdeaNote} + \item Convex Hull Construction + \item Convex Layer + \item Rotating Calipers + \item Point Containment + \item Tangent to convex polygon + \item Inner and Outer Tangent of two Convex's + \end{IdeaNote} + \item General Polygon + \item Half Plane Intersection + \item Bulldozer Trick + \item Delaunay Triangulation : Voronoi diagram + \end{IdeaNote} + + +\item Greedy + \begin{IdeaNote} + \item Rearrangement Inequality + \end{IdeaNote} + +\item DP + \begin{IdeaNote} + \item DP Optimization + \begin{IdeaNote} + \item Convex Hull Trick + \item Alien's Trick (Lagrangian Relaxation) + \item Slope Trick + \end{IdeaNote} + \end{IdeaNote} + +\item String + \begin{IdeaNote} + \item KMP(Knuth-Morris-Pratt), Z, Manacher Algorithm + \item Trie + \item Aho-Corasick + \item Suffix Array \& LCP Array + \item Eertree + \item Wavelet Tree + \end{IdeaNote} + +\item Graph + \begin{IdeaNote} + \item Searching : DFS/BFS + \item DAG(Directed Acyclic Graph) : Topological Sorting + \item MST(Minimum Spanning Tree) + \begin{IdeaNote} + \item Kruskal Algorithm + \item Prim Algorithm + \item Euclidian MST + \end{IdeaNote} + \item Shortest Path + \begin{IdeaNote} + \item Dijkstra Algorithm + \item Bellman-Ford Algorithm + \item Floyd-Warshall Algorithm + \item Shortest Path DAG + \end{IdeaNote} + \item Connectivity + \begin{IdeaNote} + \item Offline Dynamic Connectivity (Odc) + \item Online Dynamic Connectivity + \begin{IdeaNote} + \item Euler Tour Tree + \item Top Tree + \end{IdeaNote} + \end{IdeaNote} + \item DFS tree + \begin{IdeaNote} + \item SCC(Strongly Connected Component) + \begin{IdeaNote} + \item Graph Compression + \item 2-SAT Problem + \item Offline Incremental SCC + \end{IdeaNote} + \item BCC (BiConnected Component) + \begin{IdeaNote} + \item Block Cut Tree + \item Cactus Graph + \end{IdeaNote} + \item Articulation Points and Bridges + \end{IdeaNote} + \item Network Flow + \begin{IdeaNote} + \item Bipartite Matching + \begin{IdeaNote} + \item Hall's Marrage Theorem + \item Minimum Vertex Cover on Bipartite + \item Maximum Independent Set on Bipartite + \item Minimum Path Cover on DAG + \item Maximum Antichain on DAG + \end{IdeaNote} + \item Ford-Fulkerson/Edmonds-Karp Algorithm + \item Dinic's Algorithm + \item Push-Relabel Algorithm + \item MCMF(Minimum Cost Maximum Flow) + \item Minimum s-t Cut = Maximum Flow + \item Global Cut(Stoer-Wagner Algorithm) + \item Circulation + \item General Matching + \end{IdeaNote} + \item Treewidth + \end{IdeaNote} + +\item Tree + \begin{IdeaNote} + \item LCA(Lowest Common Ancestor) + \item Heavy-Light Decomposition + \item Centroid Decomposition + \item Link-Cut Tree + \end{IdeaNote} + +\item Data Structure + \begin{IdeaNote} + \item C++ Standard Library + \begin{IdeaNote} + \item Stack, Queue, List, Vector, Deque + \item Priority Queue; Heap + \item Set, Map : Binary Search Tree + \item Unordered Set, Unordered Map : Hashing + \item PBDS(Policy-Based Data Structure) + \item Rope (Cord) + \end{IdeaNote} + \item Disjoint Set (Unoin-Find structure) + \begin{IdeaNote} + \item Union by Rank / Path Compression + \item UF with LCA (Making Root) + \item UF with Edge Weight + \item UF with Unjoining + \begin{IdeaNote} + \item Unjoin from latest (Stack undoing) + \item Unjoin from earliest (Queue undoing) + \item Unjoin by Priority (Priority undoing) + \end{IdeaNote} + \end{IdeaNote} + \item Sparse Table + \item Range Query Structure + \begin{IdeaNote} + \item Square Root Decomposition + \item Fenwick Tree + \item Segment Tree + \begin{IdeaNote} + \item Lazy Propagation \& Generalization + \item 금광 ST (Maximum Adjacent Sum of Given Range) + \item PST (Persistent Segment Tree) + \item MST (Merge Sort Tree) + \item Segment Tree on Tree (HLD) + \item Li-Chao Tree (Segment Add Get Min) + \item ST Beats + \item Kinetic ST + \end{IdeaNote} + \item Splay Tree + \begin{IdeaNote} + \item Range Reverse / Range Shift + \end{IdeaNote} + \end{IdeaNote} + \end{IdeaNote} + +\item Sorting \& Searching + \begin{IdeaNote} + \item Sorting + \item Searching + \begin{IdeaNote} + \item Binary Search : Monotone Sequence / function + \begin{IdeaNote} + \item Lower bount / Upper bound + \item LIS (Longest Increasing Subsequence) + \item PBS (Parallel Binary Search) + \end{IdeaNote} + \item Ternary Search : Unimodal Sequence / function + \begin{IdeaNote} + \item Fibonacci Search (Golden Ratio Search) + \end{IdeaNote} + \end{IdeaNote} + \end{IdeaNote} + +\item Numerical Analysis + \begin{IdeaNote} + \item Numerical Differentiation + \item Gradient Descent + \end{IdeaNote} + +\item Technic + \begin{IdeaNote} + \item Coordinate Compression + \item Two Pointer/Sliding Window + \item Sweeping + \item Meet in the Middle + \item Bitmasking + \item Small to Large + \item Randomization + \begin{IdeaNote} + \item Verifying Matrix Multiplication + \end{IdeaNote} + \item Query Technic + \begin{IdeaNote} + \item Offline Query + \begin{IdeaNote} + \item Mo's Algorithm + \end{IdeaNote} + \end{IdeaNote} + \end{IdeaNote} + +\end{IdeaNote} + +\end{tcolorbox} + + +\Algorithm{POROGOD}{}{}{bash}{source/poro.cpp} + +\pagebreak + +% \Algorithm{astilate}{}{}{cpp}{source/Fundemental.cpp} + +\subsection{Tips for Inequality with Rational Number} +Let $A$, $B$, $x$, $n$ be integer, and operator `/' means floor division(quotient). +\begin{align*} + Ax \leqslant B & \Leftrightarrow x \leqslant B/A \\ + Ax < B & \Leftrightarrow x \leqslant (B-1)/A \\ + Ax \geqslant B & \Leftrightarrow x \geqslant (B+A-1)/A \\ + Ax > B & \Leftrightarrow x \geqslant B/A+1 \\ \\ + x < n & \Leftrightarrow x+1\leqslant n +\end{align*} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Math} +\subfile{source/Math/math} +\subsection{Prime Number} + +\subsubsection{Distribution of Prime Number} + +\begin{center} + \begin{tabular}{| + >{\columncolor[HTML]{BFBFBF}}c |c| + >{\columncolor[HTML]{BFBFBF}}c |c| + >{\columncolor[HTML]{BFBFBF}}c |c|} + \hline + 1e2 & 25 & 1e6 & 78,498 & 1e10 & \textless 5e8 \\ \hline + 1e3 & 168 & 1e7 & 664,579 & 1e11 & \textless 5e9 \\ \hline + 1e4 & 1,229 & 1e8 & \textless 6e6 & 1e12 & \textless 4e10 \\ \hline + 1e5 & 9,592 & 1e9 & \textless 6e7 & 1e13 & \textless 4e11 \\ \hline + \end{tabular} +\end{center} + +\subsubsection{Prime Gap} +\begin{align*} + 2 \cdot 10^{5} \text{ 이하의 소수 간극 } &\le 100\\ + 2^{32} \text{ 이하의 소수 간극 } &\le 464 \\ + 2^{64} \text{ 이하의 소수 간극 } &\le 1550 +\end{align*} + +\Algorithm{Miller-Rabin Algorithm} +{\texttt{is\_p(X)} : returns true if $X$ is prime, otherwise false. +\begin{align*} +\text{ When } X \le 2^{32}, D &= \{2, 7, 61\} \text{ is sufficient; } \\ +X \le 2^{64}, D &= \{p | p \text{ is prime}, p \le 37 \} \text{ is sufficient.} +\end{align*}} +{$\mathcal O (\log^3 X)$} +{cpp} +{source/Math/MillerRabin.cpp} + +\Algorithm{Pollad Rho Algorithm} +{ \texttt{po\_rho(N)} : returns array of prime factors of X.} +{$\mathcal O (N^{1/4})$} +{cpp} +{source/Math/PolladRho.cpp} + +\Algorithm{Primitive Root} +{Calculate one of the primitive roots of given prime.} +{}{cpp} +{source/Math/PrimitiveRoot.cpp} + +\Algorithm{Diopantos Equation(Extended Euclidian Algorithm)} +{\texttt{diophantos(a, b)} : return one integer solution of $ax+by=1$, satisfying $0 \le x < b$. } +{$\mathcal O \left(\log \left( \max(a, b) \right) \right)$} +{cpp} +{source/Math/Diophantos.cpp} + +\Algorithm{Chinese Remainder Theorem} +{\texttt{crt(pll p, pll q)} : return \texttt{pll r}, satisfying follows: +\begin{align*} + x &\equiv \texttt{p.fi} \mod \texttt{p.se} \\ +\text{and } x &\equiv \texttt{q.fi} \mod \texttt{q.se} \\ + \leftrightarrow x &\equiv \texttt{r.fi} \mod \texttt{r.se} +\end{align*} +If there's no such \texttt{r}, return $\{-1, -1\}$. +} +{$\mathcal O(\log A)$} +{cpp} +{source/Math/CRT.cpp} + +\Algorithm{Harmonic Lemma} +{\texttt{f(N)} : return the value +$$\sum_{i=1}^{N} \left\lfloor \frac{N}{i} \right\rfloor = \left\lfloor \frac{N}{1}\right\rfloor + \left\lfloor \frac{N}{2} \right\rfloor + \cdots + \left\lfloor \frac{N}{N}\right\rfloor $$ +Using the fact that $\left\lfloor \frac{N}{x} \right\rfloor$ has $\mathcal O(\sqrt N)$ different values.} +{$\mathcal O(\sqrt N )$} +{cpp} +{source/Math/Harmonic.cpp} + +\Algorithm{Floor Sum (Sum of Floor of Rational Arithmetic Sequence)} +{\texttt{floor\_sum(A, B, C, N)} : return the value +$$\sum_{x=0}^{N-1} \left\lfloor \frac{Ax+B}{C} \right\rfloor $$} +{$\mathcal O(\log N)$} +{cpp} +{source/Math/FloorSum.cpp} + +\Algorithm{FFT - Convolution} +{} +{$\mathcal O (N\log N)$} +{cpp} +{source/Math/FFTConv.cpp} + + + +\Algorithm{NTT - Number Theoretic Transform} +{helloworld} +{} +{cpp} +{source/Math/NTT.cpp} + +\subsubsection{Good prime numbers to run NTT} +\begin{center} +\begin{adjustbox}{width=0.8\columnwidth} +\begin{tabular}{|c|c| +>{\columncolor[HTML]{C0C0C0}}l |} +\hline +595 591 169 & 71\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +645 922 817 & 77\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +897 581 057 & 107\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +998 244 353 & 119\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +1 300 234 241 & 155\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +1 224 736 769 & 73\textless{}\textless{}24|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +2 130 706 433 & 127\textless{}\textless{}24|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +167 772 161 & 5\textless{}\textless{}25|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2} +469 762 049 & 7\textless{}\textless{}26|1 & \multirow{-9}{*}{\cellcolor[HTML]{C0C0C0}$\omega$ = 3} \\ \hline +\end{tabular} +\end{adjustbox} +\end{center} + +\Algorithm{Polynomial (Formal Power Series)} +{} +{} +{cpp} +{source/Math/Polynomial.cpp} + +\subsection{Combinatorics} +\subsubsection{Labeled Combinatorial Target} +\begin{itemize} + \item Permutation, Combination (with, w/o repetition) + \begin{itemize} + \item Permutation $_nP_r = \frac{n!}{r!(n-r)!}$ + \item Combination $_nC_r = \binom n k = \frac{n!}{r!}$ + \item Permutation with repetition $_n\Pi_r = n^r$ + \item Combination with repetition $_nH_r = _{n+r-1}C_r$ + \end{itemize} + \item Catalan Number $C_n$ : the number of regular bracket string of length $2n$. + \begin{itemize} + \item $C_n = \frac{1}{n+1}\binom {2n}n$ + \item $C_n : 1, 1, 2, 5, 14, 42, 132,429,1430,\cdots$ (from index 0) + \item OGF of $C_n$ : $c(x) = 1+xc(x)^2, c(c) = \frac{1-\sqrt{1-4x}}{2x}$ + \item Catalan's triangle $C(n, k)$ : the number of string with $n$ X's, $k$ Y's, where the number of Y's is not greater than the number of X's when written down the string. + \begin{itemize} + \item i.e. $C(4, 3)$ : XXXXYYY, XXYXYYX are OK, but XXYYYXX is not OK. + \item $C(n, k) = \binom{n+k}{k} - \binom{n+k}{k-1} = \frac{n-k+1}{n+1}\binom{n+k}{k}$ + \item We can give the condition relax : $C_m(n, k)$ : the number of string with $n$ X's, $k$ Y's, where the number of Y's is not greater than (the number of X's) + $m$ when written down the string. + \item $C_m(n, k) = \binom{n+k}{k}-\binom{n+k}{k-m}$ when $m\leqslant k \leqslant n+m-1$. + \item $C_1(n, k) = C(n, k)$ + \end{itemize} + \end{itemize} + \item Derangement(교란순열) $D_n$ : the number of permutation of length $n$ which $\forall i\;p_i \neq i$. + \begin{itemize} + \item $D_n : 1, 0, 1, 2, 9, 44, 265, 1854, 14833, 133496,1334961 \cdots$ (from index 0) + \item EGF of $D_n$ : $D(x) = \sum_{n=0} \frac{D_n}{n!}x^n = \frac{e^{-x}}{1-x}$ + \end{itemize} + \item Stirling Number of the 1st/2nd kind. + \begin{itemize} + \item Unsigned Stirling Number of the 1st kind $c(n, k) = \genfrac{[}{]}{0pt}{}{n}{k}$ : the number of permutation of length n with k disjoint cycles. + \begin{itemize} + \item $c(n+1, k) = n \times c(n, k) + c(n, k-1)$ + \item with boundary condition $c(0, 0) = 1, c(n, 0) = c(0, k) = 0 \; \forall n, k>0$ + \item $c(n, k)$ + \begin{itemize} + \item $c(0, 0) = 1$; $c(x_{\neq0}, 0) = 0$; $c(x, x) = 1$ + \item $c(x, x) = 1$ + \item $c(5, *) = \{0, 24, 50, 35, 10 1\}$ + \item $c(6, *) = \{0, 120, 274, 225, 85, 15, 1\}$ + \end{itemize} +% \begin{tabular}{| +% >{\columncolor[HTML]{ECECEC}}r | +% >{\columncolor[HTML]{F8F9FA}}r |r|r|r|l|l|l|} +% \hline +% \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} \textit{n\textbackslash{}k}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{0}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{1}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{2}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{3}} & \multicolumn{1}{r|}{\cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{4}}} & \multicolumn{1}{r|}{\cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{5}}} & \multicolumn{1}{r|}{\cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{6}}} \\ \hline +% {\color[HTML]{202122} \textbf{0}} & {\color[HTML]{202122} 1} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{} & & & \\ \hline +% {\color[HTML]{202122} \textbf{1}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{} & & & \\ \hline +% {\color[HTML]{202122} \textbf{2}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \multicolumn{1}{l|}{} & & & \\ \hline +% {\color[HTML]{202122} \textbf{3}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 2} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 3} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & & & \\ \hline +% {\color[HTML]{202122} \textbf{4}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 6} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 11} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 6} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1}} & & \\ \hline +% {\color[HTML]{202122} \textbf{5}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 24} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 50} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 35} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 10}} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1}} & \\ \hline +% {\color[HTML]{202122} \textbf{6}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 120} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 274} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 225} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 85}} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 15}} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1}} \\ \hline +% \end{tabular} + \item OGF of $\genfrac{[}{]}{0pt}{}{n}{k}$ : for fixed $n$, $\sum_{k=0}^n \genfrac{[}{]}{0pt}{}{n}{k} x^k = x(x+1)(x+2)\cdots(x+n-1)$ : we can calculate it by polynomial shift \& divide and conquer + \item EGF of $\genfrac{[}{]}{0pt}{}{n}{k}$ : for fixed $k$, $\sum_{n=k}^\infty \genfrac{[}{]}{0pt}{}{n}{k} \frac{x^n}{n!} = \frac{(-\log(1-z))^k}{k!} $ + \item Signed Stirling Number of the 1st kind $s(n, k) = (-1)^{n-k}c(n, k)$ + \item EGF of $s(n, k)$ : for fixed $k$, $\sum_{n=k}^\infty s(n, k) \frac{x^n}{n!} = \frac{(\log(1+z))^k}{k!} $ + \end{itemize} + \item Stirling Number of the 2nd kind $S(n, k) = \genfrac{\{}{\}}{0pt}{}{n}{k}$ : the number of partition of $n$ labeled objects into $k$ nonempty unlabelled subsets. + \begin{itemize} + \item $S(n, k) = \frac{1}{k!}\sum_{i=0}^k(-1)^{k-i}\binom{k}{i}i^n$ + \item $S(n,k)=S(n - 1,k - 1)+k\cdot S(n - 1,k)$ + \item $S(n, k)$ + \begin{itemize} + \item $S(0, 0) = 1$; $S(x_{\neq 0}, 0) = 0$; $S(x, x) = 1$ + \item $S(5, *) = \{0, 1, 15, 25, 10, 1\}$ + \item $S(6, *) = \{0, 1, 31, 90, 65, 15, 1\}$ + \end{itemize} +% \begin{tabular}{| +% >{\columncolor[HTML]{ECECEC}}r | +% >{\columncolor[HTML]{F8F9FA}}r |r|r|r|l|l|l|} +% \hline +% \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} \textit{\textbf{n\textbackslash{}k}}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{0}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{1}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{2}} & \cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{3}} & \multicolumn{1}{r|}{\cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{4}}} & \multicolumn{1}{r|}{\cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{5}}} & \multicolumn{1}{r|}{\cellcolor[HTML]{ECECEC}{\color[HTML]{202122} \textbf{6}}} \\ \hline +% {\color[HTML]{202122} \textbf{0}} & {\color[HTML]{202122} 1} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{} & & & \\ \hline +% {\color[HTML]{202122} \textbf{1}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{} & & & \\ \hline +% {\color[HTML]{202122} \textbf{2}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \multicolumn{1}{l|}{} & & & \\ \hline +% {\color[HTML]{202122} \textbf{3}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 3} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & & & \\ \hline +% {\color[HTML]{202122} \textbf{4}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 7} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 6} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1}} & & \\ \hline +% {\color[HTML]{202122} \textbf{5}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 15} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 25} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 10}} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1}} & \\ \hline +% {\color[HTML]{202122} \textbf{6}} & {\color[HTML]{202122} 0} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 31} & \cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 90} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 65}} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 15}} & \multicolumn{1}{r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} 1}} \\ \hline +% \end{tabular} + \item OGF of $\genfrac{\{}{\}}{0pt}{}{n}{k}$ : for fixed $n$, $\sum_{k=0}^n\genfrac{\{}{\}}{0pt}{}{n}{k}x^k=T_n(x)$, where $T_n(x) = e^{-x}\sum_{k=0}^{\infty}\frac{k^n}{k!}x^k$ is Touchard Polynomials. + \item EGF of $\genfrac{\{}{\}}{0pt}{}{n}{k}$ : for fixed $k$, $\sum_{n=k}^\infty\genfrac{\{}{\}}{0pt}{}{n}{k}\frac{x^n}{n!}=\frac{(e^x-1)^k}{k!}$ + \end{itemize} + \end{itemize} + \item Bell Number $B_n$ : the number of partition of set with size $n$. + \begin{itemize} + \item i.e. partitionize $\{a, b, c\}$ is $\{\{a\}, \{b\}, \{c\}\}, \{\{a , b\}, \{c\}\}$, $\{\{b, c\}, \{a\}\}, \{\{c, a\}, \{b\}\}, \{\{a, b, c\}\}$. Therefore, $B_3 = 5$. + \item $B_n : 1,1,2,5,15,52,203,877,4140,\cdots$ (from index 0) + \item $B_n = \sum_{k=0}^n\genfrac{\{}{\}}{0pt}{}{n}{k}$ (2nd kind of stirling number) + \item EGF of $B_n$ : $B(x) = \sum_{n=0}\frac{B_n}{n!}x^n=e^{e^x-1}$ + \item Ordered Bell Number(Fubini Number) $a_n$ : the number of distinct weak ordering on a set of n elements. + \begin{itemize} + \item $a_n : 1, 1, 3, 13, 75, 541, 4683, 47293, 545835, 7087261, \cdots$ + \item $a_n = \sum_{k=0}^nk!\genfrac{\{}{\}}{0pt}{}{n}{k}$ (stirling number of the 2nd kind) + \item EGF of $a_n$ : $a(x) = \sum_{n=0}^\infty \frac{a_n}{n!}x^n = \frac{1}{2-e^x}$ + \end{itemize} + \end{itemize} + \item Integer Partition $P(n, k)$ : the number of partitions of $n$ into exactly $k$ parts. + \begin{itemize} + \item i.e. $P(4, 2) = 2$ since $4 = 1+3 = 2+2$ + \item we also say $P(n) = \sum_{k=1}^{n}P(n, k)$ + \item $P(n, k)$ + \begin{itemize} + \item $P(x, 1) = P(x, x) = 1$ + \item $P(8, *) = \{1, 4, 5, 5, 3, 2, 1, 1\}$ + \item $P(9, *) = \{1, 4, 7, 6, 5, 3, 2, 1, 1\}$ + \end{itemize} + \item $P(n) = \{1, 2, 3, 5, 7, 11, 15, 22, 30, 42\}$ + +% \begin{tabular}{| +% >{\columncolor[HTML]{EAECF0}}c | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l | +% >{\columncolor[HTML]{F8F9FA}}l |} +% \hline +% \multicolumn{1}{|r|}{\cellcolor[HTML]{F8F9FA}{\color[HTML]{202122} \textit{\textbf{n\textbackslash{}k}}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{1}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{2}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{3}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{4}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{5}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{6}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{7}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{8}}} & \multicolumn{1}{c|}{\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{9}}} \\ \hline +% {\color[HTML]{202122} \textbf{1}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{2}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{3}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{4}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{5}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{6}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 3} & {\color[HTML]{202122} 3} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{7}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 3} & {\color[HTML]{202122} 4} & {\color[HTML]{202122} 3} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{8}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 4} & {\color[HTML]{202122} 5} & {\color[HTML]{202122} 5} & {\color[HTML]{202122} 3} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} } \\ \hline +% {\color[HTML]{202122} \textbf{9}} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 4} & {\color[HTML]{202122} 7} & {\color[HTML]{202122} 6} & {\color[HTML]{202122} 5} & {\color[HTML]{202122} 3} & {\color[HTML]{202122} 2} & {\color[HTML]{202122} 1} & {\color[HTML]{202122} 1} \\ \hline +% \end{tabular} + \end{itemize} + \item 12정도(the Twelvefold Way) : the number of functions \\ + (Domain $|N| = n$, Codomain $|X| = x$)\\ + \begin{tabular}{| +>{\columncolor[HTML]{F8F9FA}}c |c|c|c|} +\hline +\cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textit{\textbf{$f$-class}}} & \cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{Any $f$}} & \cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{Injective}} & \cellcolor[HTML]{EAECF0}{\color[HTML]{202122} \textbf{Surjective}} \\ \hline +{\color[HTML]{202122} \textbf{Distinct $f$}} & \textit{$_n\Pi_x$} & \textit{$_xP_n$} & $x!\genfrac{\{}{\}}{0pt}{}{n}{k}$ \\ \hline +{\color[HTML]{202122} \textit{\textbf{\begin{tabular}[c]{@{}c@{}}$S_n$ orbits\\ $f \circ S_n$\end{tabular}}}} & \textit{$_xH_n$} & \textit{$_xC_n$} & $_{n-1}C_{n-x}$ \\ \hline +{\color[HTML]{202122} \textit{\textbf{\begin{tabular}[c]{@{}c@{}}$S_x$ orbits\\ $S_x \circ f$\end{tabular}}}} & $\sum_{k=0}^x \genfrac{\{}{\}}{0pt}{}{n}{k}$ & $[n \leqslant x]$ & $\genfrac{\{}{\}}{0pt}{}{n}{k}$ \\ \hline +{\color[HTML]{202122} \textit{\textbf{\begin{tabular}[c]{@{}c@{}}$S_n\times S_x$ orbits\\ $S_x \circ f \circ S_n$\end{tabular}}}} & $P(n+x, x)$ & $[n \leqslant x]$ & $P(n, x)$ \\ \hline +\end{tabular} +\end{itemize} + +% \Algorithm{General Lucas Comb} +% {} +% {} +% {cpp} +% {source/Math/general_lucas.cpp} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Linear Algebra} + +\Algorithm{Matrix} +{} +{} +{cpp} +{"source/Linear Algebra/Matrix.cpp"} + +\Algorithm{Berlekamp Massey} +{} +{} +{cpp} +{"source/Linear Algebra/BerlekampMassey.cpp"} + +\Algorithm{XOR Basis} +{} +{} +{cpp} +{"source/Linear Algebra/XORBasis.cpp"} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Geometry} +\Algorithm{Mindset} +{} +{} +{cpp} +{source/Geometry/Mindset.cpp} + +\Algorithm{Point in Convex Polygon} +{\texttt{isunder(upper\_hull[], (length of upper\_hull), x)} : return true if $x$(point) is under upper\_hull, otherwise false; + +\texttt{isunder(lower\_hull[], (length of lower\_hull), x, true)} : return true if $x$(point) is over lower\_hull, otherwise false. + +Point in Polygon : isunder(upper, u, x) \&\& isupper(lower, u, x, true)} +{} +{cpp} +{source/Geometry/PointInConvexPolygon.cpp} + +\Algorithm{Geo} +{} +{} +{cpp} +{source/Geometry/Geo.cpp} + +\Algorithm{Half-Plane Intersection} +{} +{} +{cpp} +{source/Geometry/HPI.cpp} + +\Algorithm{Bulldozer} +{} +{} +{cpp} +{source/Geometry/Bulldozer.cpp} + + +% \Algorithm{kactl templete} +% {} +% {} +% {cpp} +% {source/Geometry/geometry_kaere.cpp} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Greedy} +\subsection{Rearrange Inequality - Extensions} +Let $A_i, B_i$ be non-decreasing sequence of length $n$, and $p$ be some permutation, and let $inc := (1, 2, \dots, n-1, n), \;dec := (n, n-1, \dots, 2, 1)$. + +\begin{align*} +S(p) &= \sum_{i=1}^n A_i B_{p_i} + && \text{ maximize } S &&&\Rightarrow p : inc&&&&\\ + & && \text{ minimize } S &&&\Rightarrow p:dec&&&&\\ +P_{max}(p) &= \max_i(A_iB_{p_i}) + && \text{ minimize } P_{max} &&&\Rightarrow p : dec&&&&\\ +P_{min}(p) &= \min_i(A_iB_{p_i}) + && \text{ maximize } P_{min} &&&\Rightarrow p:dec&&&&\\ +A_{max}(p) &= \max_i(A_i+B_{p_i}) && \text +{ minimize } A_{max} &&& \Rightarrow p:dec&&&&\\ +A_{min}(p) &= \min_i(A_i+B_{p_i}) && \text{ maximize } A_{min} &&& \Rightarrow p:dec&&&&\\ +D_{max}(p) &= \max_i|A_i-B_{p_i}| && \text{ minimize } D_{max} &&& \Rightarrow p:inc&&&&\\ +D_{min}(p) &= \min_i|A_i-B_{p_i}| && \text{ maximize } D_{min} &&& \Rightarrow p:?&&&&\\ +\end{align*} +\begin{align*} + \text{ Permutate } A \text{ s.t.} \text{ maximize } & \sum_{i=1}^n {A_i A_{i+1}} \;(\text{Let } A_{n+1} = A_1) \\ &\Rightarrow \text{ Pendulum Arrangement } +\end{align*} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{DP} + +\Algorithm{LIS} +{}{}{cpp}{source/DP/LIS.cpp} + +\subsection{DP Optimization} + +\subsubsection{Convex Hull Optimization} +\begin{align*} + \text{ Recurrence : }& D[i] = \min_{j j \\ +0 & \text{otherwise} +\end{cases}$, with $r_{i, j}$ be the random integer in $[1, p-1]$. After construct $T$, the maximum size of $G$ is $\textrm{rank}(T)/2$ with high probability. + +If we want the result of matching, use:} +{$O(n^3)$} +{cpp} +{source/Graph/Matching.cpp} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Tree} + +\Algorithm{HLD(Heavy Light Decomposition)} +{} +{} +{cpp} +{source/Tree/HLD.cpp} + +\Algorithm{Centroid Tree} +{} +{} +{cpp} +{source/Tree/Centroid.cpp} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Data Structure} + +\Algorithm{PBDS - Policy-Based Data Structure} +{} +{Equivalent to std::set} +{cpp} +{source/DS/PBDS.cpp} + +% \Algorithm{rope}{}{}{cpp}{} + +\Algorithm{Union and Find - Queue Undoing} +{} +{$\mathcal O(\log^2N)$} +{cpp} +{source/DS/UF_QUndo.cpp} + +\Algorithm{Fenwick Tree}{}{}{cpp} +{source/DS/Fenwick.cpp} + +\Algorithm{Segment Tree} +{} +{$\mathcal O(\log N)$} +{cpp} +{source/DS/SegmentTree.cpp} + +% \Algorithm{Segment Tree Generalization} +% {} +% {$\mathcal O(\log N)$} +% {cpp} +% {source/DS/SegmentTree.cpp} + +\Algorithm{Segment Tree Beats} +{} +{$\mathcal O(\log N)$ on updating and querying} +{cpp} +{source/DS/STBeats.cpp} + +\Algorithm{Li-Chao Tree} +{} +{} +{cpp} +{source/DS/LiChaoTree.cpp} + +\Algorithm{Splay Tree} +{} +{} +{cpp} +{source/DS/SplayTree.cpp} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Numerical Analysis} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Technic} +\Algorithm{Cartesian Tree} +{} +{} +{cpp} +{source/Technic/CartesianTree.cpp} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Misc} +\Algorithm{Negative Division on C/C++} +{Procedure : (1) make both dividend and divisor positive, and calc the quotient (2) decide the sign of quotient, and calc $r$ as $a-b \times q$. Following shows the floored division, not the truncated division.} +{} +{cpp} +{source/Misc/NegDiv.cpp} + + + +\Algorithm{Fast Input} +{Fast Input with fread. Do not use with scanf, cin, or other input function. Use \texttt{forr(i, n) read(arr[i]);} instead of \texttt{forr(i, n) scanf("\%d", arr+i);}. Use \texttt{read(s+1)} instead of \texttt{scanf("\%s", s+1);}.} +{} +{cpp} +{source/Misc/FastI.cpp} + +\Algorithm{MT19937 Random Number} +{} +{} +{cpp} +{source/Misc/mt19937.cpp} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{center} +\bigskip +--- Document end --- +\end{center} + +\end{multicols} + +\end{document} diff --git a/source/DP/DnC.cpp b/source/DP/DnC.cpp new file mode 100644 index 0000000..81918c9 --- /dev/null +++ b/source/DP/DnC.cpp @@ -0,0 +1,12 @@ +//D[t][s...e]를 구해야 하고, j의 탐색 범위는 [l, r] +void f(int t, int s, int e, int l, int r){ + if(s > e) return; + int m = s + e >> 1; + int opt = l; + for(int i=l; i<=r; i++){ + if(D[t-1][opt] + C[opt][m] > D[t-1][i] + C[i][m]) opt = i; + } + D[t][m] = D[t-1][opt] + C[opt][m]; + f(t, s, m-1, l, opt); + f(t, m+1, e, opt, r); +} \ No newline at end of file diff --git a/source/DP/LIS.cpp b/source/DP/LIS.cpp new file mode 100644 index 0000000..a59118a --- /dev/null +++ b/source/DP/LIS.cpp @@ -0,0 +1,17 @@ +template vi lis(const vector& S) { + if (S.empty()) return {}; + vi prev(sz(S)); + typedef pair p; + vector

res; + rep(i,0,sz(S)) { + // change 0 -> i for longest non-decreasing subsequence + auto it = lower_bound(all(res), p{S[i], 0}); + if (it == res.end()) res.emplace_back(), it = res.end()-1; + *it = {S[i], i}; + prev[i] = it == res.begin() ? 0 : (it-1)->second; + } + int L = sz(res), cur = res.back().second; + vi ans(L); + while (L--) ans[L] = cur, cur = prev[cur]; + return ans; +} \ No newline at end of file diff --git a/source/DP/LineContainer.cpp b/source/DP/LineContainer.cpp new file mode 100644 index 0000000..9f510ad --- /dev/null +++ b/source/DP/LineContainer.cpp @@ -0,0 +1,30 @@ +struct Line { + mutable ll k, m, p; + bool operator<(const Line& o) const { return k < o.k; } + bool operator<(ll x) const { return p < x; } +}; + +struct LineContainer : multiset> { + // (for doubles, use inf = 1/.0, div(a,b) = a/b) + static const ll inf = LLONG_MAX; + ll div(ll a, ll b) { // floored division + return a / b - ((a ^ b) < 0 && a % b); } + bool isect(iterator x, iterator y) { + if (y == end()) return x->p = inf, 0; + if (x->k == y->k) x->p = x->m > y->m ? inf : -inf; + else x->p = div(y->m - x->m, x->k - y->k); + return x->p >= y->p; + } + void add(ll k, ll m) { + auto z = insert({k, m, 0}), y = z++, x = y; + while (isect(y, z)) z = erase(z); + if (x != begin() && isect(--x, y)) isect(x, y = erase(y)); + while ((y = x) != begin() && (--x)->p >= y->p) + isect(x, erase(y)); + } + ll query(ll x) { + assert(!empty()); + auto l = *lower_bound(x); + return l.k * x + l.m; + } +}; \ No newline at end of file diff --git a/source/DP/LineContainerGMS.cpp b/source/DP/LineContainerGMS.cpp new file mode 100644 index 0000000..f2ca023 --- /dev/null +++ b/source/DP/LineContainerGMS.cpp @@ -0,0 +1,38 @@ +namespace LC +{ + +vll line; +int getline(ll c) +{ + int k = 0, st = 20; + while(st+1) + { + int now = k+(1<= line.size()) continue; + + if(line[now].fi*c+line[now].se < line[now-1].fi*c+line[now-1].se) k = now; + } + return k; +} +void pushline(pll C) +{ + while(line.size() >= 2) + { + pll A = line[line.size()-2]; + pll B = line.back(); + + A = {A.fi-C.fi, A.se-C.se}; + B = {B.fi-C.fi, B.se-C.se}; + A.se = -A.se; B.se = -B.se; + + if(A.fi<0) A = {-A.fi, -A.se}; + if(B.fi<0) B = {-B.fi, -B.se}; + + + if(A.se*B.fi >= B.se*A.fi) line.pop_back(); + else break; + } + line.pb(C); +} + +} // namespace LC \ No newline at end of file diff --git a/source/DP/SlopeTrick.cpp b/source/DP/SlopeTrick.cpp new file mode 100644 index 0000000..0358db9 --- /dev/null +++ b/source/DP/SlopeTrick.cpp @@ -0,0 +1,52 @@ +const int N = 1e6+7; +int arr[N]; +priority_queue pq; +ll ans = 0; +int main() +{ + getint(n); + forr(i, n) scanf("%d", arr+i); + + pq.push(arr[1]); int t=0; ll val = 0; + fors(i, 2, n) + { + t++; + int r = t + pq.top(); + if(r <= arr[i]) pq.push(arr[i]-t); + else + { + pq.push(arr[i]-t); pq.push(arr[i]-t); pq.pop(); + ans += r-arr[i]; + } + } + + printf("%lld", ans); +} + + +int arr[N]; +priority_queue pq; +int ans2[N]; +int main() +{ + getint(n); + forr(i, n) scanf("%d", arr+i); + + pq.push(arr[1]); ll ans = 0; + ans2[1] = arr[1]; + fors(i, 2, n) + { + int r = (i-1) + pq.top(); + if(r <= arr[i]) pq.push(arr[i]-(i-1)); + else + { + pq.push(arr[i]-(i-1)); pq.push(arr[i]-(i-1)); pq.pop(); + ans += r-arr[i]; + } + + ans2[i] = pq.top() + (i-1); + } + + fore(i, n-1, 1) ans2[i] = min(ans2[i], ans2[i+1]-1); + forr(i, n) printf("%d\n", ans2[i]); +} \ No newline at end of file diff --git a/source/DP/SoS.cpp b/source/DP/SoS.cpp new file mode 100644 index 0000000..a842eb5 --- /dev/null +++ b/source/DP/SoS.cpp @@ -0,0 +1,22 @@ +int n = 20; +vector a(1 << n); + +// keeps track of the sum over subsets +// with a certain amount of matching bits in the prefix +vector> dp(1 << n, vector(n)); + +vector sos(1 << n); +for (int mask = 0; mask < (1 << n); mask++) { + dp[mask][-1] = a[mask]; + for (int x = 0; x < n; x++) { + dp[mask][x] = dp[mask][x - 1]; + if (mask & (1 << x)) { dp[mask][x] += dp[mask - (1 << x)][x - 1]; } + } + sos[mask] = dp[mask][n - 1]; +} + +//////////////////////////////////////////// +D[i]에 미리 i에 해당하는 값을 넣어둔다 +fors(d, 0, 19) fors(i,0,(1<<20)-1) + if(i & (1< D[i] : sum of subset of mask i \ No newline at end of file diff --git a/source/DS/Fenwick.cpp b/source/DS/Fenwick.cpp new file mode 100644 index 0000000..42bd6ef --- /dev/null +++ b/source/DS/Fenwick.cpp @@ -0,0 +1,9 @@ +ll tree[N]; +void update(int i,ll x) { + while(i < N) tree[i] += x, i += i&-i; +} +int query(int i) { + ll s = 0; + while(i) s += tree[i], i -= i&-i; + return s; +} \ No newline at end of file diff --git a/source/DS/LiChaoTree.cpp b/source/DS/LiChaoTree.cpp new file mode 100644 index 0000000..4139eb0 --- /dev/null +++ b/source/DS/LiChaoTree.cpp @@ -0,0 +1,47 @@ +const ll L = 1e9+7, inf = 2*L*L+7; +struct Line { + ll a, b; + ll operator()(ll x){return a*x+b;} + Line():a(0),b(-inf){} + Line(ll a, ll b):a(a), b(b){} +}; +struct Node {ll l, r; Line v; Node():l(-1), r(-1), v(){}}; +using LiChao = vector; + +// add Line v in [l, r] +void update(LiChao& seg, Line v, ll l, ll r, ll s=-L, ll e=L, ll i=0) { + if(e < l or r < s) return; + if(s == e) { seg[i].v = (seg[i].v(s) > v(s))?seg[i].v:v; return; } + + ll mid=(s+e)>>1; + if(l <= s && e <= r) { + Line A = seg[i].v, B = v; if(A(s) < B(s)) swap(A, B); + if(A(e) >= B(e)) seg[i].v = A; + else if(A(mid) >= B(mid)) { + seg[i].v = A; + if(seg[i].r == -1) seg[i].r = seg.size(), seg.pb(Node()); + update(seg, B, mid+1, e, mid+1, e, seg[i].r); + } + else { + seg[i].v = B; + if(seg[i].l == -1) seg[i].l = seg.size(), seg.pb(Node()); + update(seg, A, s, mid, s, mid, seg[i].l); + } + return; + } +if(seg[i].l == -1) seg[i].l = seg.size(), seg.pb(Node()); +if(seg[i].r == -1) seg[i].r = seg.size(), seg.pb(Node()); + update(seg, v, l, r, s, mid, seg[i].l); + update(seg, v, l, r, mid+1, e, seg[i].r); +} +// query max_{l_i <= x <= r_i} (a_i*x + b_i) +ll query(LiChao& seg, ll x, ll s=-L, ll e=L, ll i=0) { + if(i == -1 or x < s or e < x) return -inf; + if(s == e) return seg[i].v(x); + ll mid = (s+e)>>1; + return max({query(seg, x, s, mid, seg[i].l), query(seg, x, mid+1, e, seg[i].r), seg[i].v(x)}); +} + +// LiChao seg(1, Node()); +// update(seg, {a, b}, l, r); +// ll v = query(seg, x); \ No newline at end of file diff --git a/source/DS/PBDS.cpp b/source/DS/PBDS.cpp new file mode 100644 index 0000000..f869d81 --- /dev/null +++ b/source/DS/PBDS.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include +using namespace __gnu_pbds; +using namespace __gnu_cxx; + +template +using indexed_set = tree, rb_tree_tag, tree_order_statistics_node_update>; + +indexed_set s; +s.insert(3); s.insert(2); s.insert(3); s.insert(9); s.insert(7); //2 3 7 9 +s.insert(5); //2 3 5 7 9 +s.erase(5); //2 3 7 9 + +auto x = s.find_by_order(2); // *x : 7 + +s.order_of_key(6) // 2 +s.order_of_key(7) // 2 +s.order_of_key(8) // 3 + +///////////////////////////////////////////////////////////// +// greater_equal <- ordered_multiset / greater <- ordered_multiset +#define oset_greater tree, rb_tree_tag, tree_order_statistics_node_update> +#define oset_less tree, rb_tree_tag, tree_order_statistics_node_update> + +void oset_m_erase(ordered_set_greater &OS, ll val){ + int index = OS.order_of_key(val); + oset_greater::iterator it = OS.find_by_order(index); + if(it != OS.end() && *it == val) OS.erase(it); +} + + +///////////////////////////////////////////////////////////// +rope r; +r.insert(r.size() - t, i); //r.size()-t번째 자리에 i를 삽입 +r.substr(a, b - a + 1) // a부터 (b-a+1)개 만큼을 잘라낸다. 즉, [a, b] 선택 diff --git a/source/DS/STBeats.cpp b/source/DS/STBeats.cpp new file mode 100644 index 0000000..12f7fe9 --- /dev/null +++ b/source/DS/STBeats.cpp @@ -0,0 +1,86 @@ +const int inf = 1e9+7; +#define data _data +struct data{ + ll mx, mx_cnt, mx2, sum; + + constexpr data(ll m):mx(m), mx_cnt(1), mx2(-inf), sum(m) {} + constexpr data(ll mx, ll mx_cnt, ll mx2, ll sum):mx(mx), mx_cnt(mx_cnt), mx2(mx2), sum(sum) {} +}; +data join(data A, data B) +{ + if(A.mx == B.mx) + return {A.mx, A.mx_cnt+B.mx_cnt, max(A.mx2, B.mx2), A.sum+B.sum}; + if(A.mx < B.mx) swap(A, B); + return {A.mx, A.mx_cnt, max(A.mx2, B.mx), A.sum+B.sum}; +} +using Seg = vector; + +void init(Seg& seg, int i, int s, int e, ll* A) +{ + if(s == e) { seg[i] = A[s]; return; } + int mid = (s+e)/2; + init(seg, i*2, s, mid, A); init(seg, i*2+1, mid+1, e, A); + seg[i] = join(seg[i*2], seg[i*2+1]); +} + +void prop(Seg& seg, int i, int s, int e) +{ + if(s == e) return; + + for(auto t : {i*2, i*2+1}) { + if(seg[t].mx > seg[i].mx) { + seg[t].sum -= seg[t].mx_cnt * (seg[t].mx - seg[i].mx); + seg[t].mx = seg[i].mx; + } + } +} + +void update(Seg& seg, int i, int s, int e, int a, int b, ll v) +{ + prop(seg, i, s, e); + if(e; + +void init(Seg& seg, int i, int s, int e, ll *A) { + if(s == e) {seg[i] = A[s]; return;} + int mid = (s+e)>>1; + init(seg, i*2, s, mid, A); init(seg, i*2+1, mid+1, e, A); + seg[i] = join(seg[i*2], seg[i*2+1]); +} +void prop(Seg& seg, int i, int s, int e) { + seg[i].sum += seg[i].lazy * (e-s+1); + if(s != e) for(auto t:{i*2, i*2+1}) seg[t].lazy += seg[i].lazy; + seg[i].lazy = 0; +} + +void update(Seg& seg, int i, int s, int e, int a, int b, ll v) { + prop(seg, i, s, e); + if(e>1; + update(seg, i*2, s, mid, a, b, v); update(seg, i*2+1, mid+1, e, a, b, v); + seg[i] = join(seg[i*2], seg[i*2+1]); +} + +ll query(Seg& seg, int i, int s, int e, int a, int b) { + prop(seg, i, s, e); + if(e>1; + return query(seg, i*2, s, mid, a, b) + query(seg, i*2+1, mid+1, e, a, b); +} diff --git a/source/DS/SegmentTree_GMS.cpp b/source/DS/SegmentTree_GMS.cpp new file mode 100644 index 0000000..c91d9c7 --- /dev/null +++ b/source/DS/SegmentTree_GMS.cpp @@ -0,0 +1,160 @@ +namespace GMS +{ + template + class Segtree { + class Node { + Node *l, *r; + int s,e; D v; + public: + Node(int s, int e) :l(0), r(0), s(s), e(e), v(_e){}; + ~Node(){delete l; delete r;} + + template + friend void init(Node* node, Dini arr[] = NULL) { + int s = node->s, e=node->e, mid=(s+e)/2; + if(s == e) { + node->v = D(arr?arr[s]:_e); + return; + } + + node->l = new Node(s, mid); + init(node->l, arr); + node->r = new Node(mid+1, e); + init(node->r, arr); + + node->v = join(node->l->v, node->r->v); + } + friend D _query(Node* node, int a, int b) { + int s=node->s, e=node->e; + if(a <= s and e <= b) return node->v; + if(b < s or e < a) return _e; + + return join(_query(node->l, a, b), _query(node->r, a, b)); + } + friend void _update + (Node* node, int i, function upd) { + int s=node->s, e=node->e; + if(i < s or e < i) return; + if(s == e) + { + node->v = upd(node->v); + return; + } + + _update(node->l, i, upd); + _update(node->r, i, upd); + + node->v = join(node->l->v, node->r->v); + } + }; + + Node *root; + public: + template + Segtree(int s,int e, Dini arr[] = NULL) { + root = new Node(s, e); + init(root, arr); + } + ~Segtree(){delete root;} + D query(int s, int e) + {return _query(root, s, e);} + void update(int i, function upd) + {_update(root, i, upd);} + }; + + + template + class LZSegtree { + class Node { + Node *l, *r; + int s,e; + D v; L lz; + + void prop() { + v = apply(v, lz, e-s+1); + if(l) l->lz = give(l->lz, lz); + if(r) r->lz = give(r->lz, lz); + + lz = _l; + } + + public: + Node(int s, int e) + :l(0), r(0), s(s), e(e), v(_e), lz(_l){}; + ~Node(){delete l; delete r;} + + template + friend void init(Node* node, Dini arr[] = NULL) { + int s = node->s, e=node->e, mid=(s+e)/2; + if(s == e) + { + node->v = D(arr?arr[s]:_e); + return; + } + + node->l = new Node(s, mid); + init(node->l, arr); + node->r = new Node(mid+1, e); + init(node->r, arr); + + node->v = join(node->l->v, node->r->v); + } + friend D _query(Node* node, int a, int b) { + node->prop(); + int s=node->s, e=node->e; + if(a <= s and e <= b) return node->v; + if(b < s or e < a) return _e; + + return join(_query(node->l, a, b), _query(node->r, a, b)); + } + friend void _update + (Node* node, int a, int b, function upd){ + node->prop(); + int s=node->s, e=node->e; + if(b < s or e < a) return; + if(a <= s and e <= b) + { + node->lz = upd(node->lz); + node->prop(); + return; + } + + _update(node->l, a, b, upd); + _update(node->r, a, b, upd); + + node->v = join(node->l->v, node->r->v); + } + }; + + Node *root; + public: + template + LZSegtree(int s,int e, Dini arr[] = NULL) + { + root = new Node(s, e); + init(root, arr); + } + ~LZSegtree(){delete root;} + D query(int s, int e){return _query(root, s, e);} + void update(int s, int e, function upd){_update(root, s, e, upd);} + }; +} // namespace GMS + +////////////////////////////////////////////////////// +#define data _data + +struct data { + int m, m_cnt; + constexpr data(int m):m(m), m_cnt(1){} + constexpr data(int m, int m_cnt):m(m), m_cnt(m_cnt){} +}; +data join(data A, data B) { + if(A.m == B.m) return data(A.m, A.m_cnt+B.m_cnt); + if(A.m < B.m) return A; + else return B; +} +data apply(data A, int lz, int len) + {return {A.m+lz, A.m_cnt};} +int give(int a, int b){return a+b;} + +using Seg = GMS::LZSegtree; diff --git a/source/DS/SplayTree.cpp b/source/DS/SplayTree.cpp new file mode 100644 index 0000000..dc46b95 --- /dev/null +++ b/source/DS/SplayTree.cpp @@ -0,0 +1,127 @@ +struct Node +{ + Node *p, *l, *r; int cnt; ll val; + ll m, M, sum; ll lazy; bool flip, dum; + Node(ll val, bool dum = false): p(0), l(0), r(0), cnt(1), val(val), m(val), M(val), sum(val), lazy(0), flip(0), dum(dum){} + void fix(){ + cnt = 1+(l?l->cnt:0)+(r?r->cnt:0); + sum = val+(l?l->sum:0)+(r?r->sum:0); + m = min({val, (l?l->m:inf), (r?r->m:inf)}); + M = max({val, (l?l->M:-1), (r?r->M:-1)}); + } + void prop(){ + if(flip){ +swap(l, r); if(l) l->flip = !l->flip; if(r) r->flip = !r->flip; flip = false; + } + if(lazy){ +val += lazy; sum += cnt * lazy; if(l) l->lazy += lazy; if(r) r->lazy += lazy; lazy = 0; + } + } + +} *root; + +// 자기보다 더 높은 노드를 루트로 하는 SplayTree를 조작하는 경우, 하위 SplayTree는 unvalid된다. +struct SplayTree{ + Node *root = NULL, *rp = NULL; + SplayTree(){} + SplayTree(Node *rt){ + if(!rt) return; + root = rt; rp = rt->p; + } + void mop(Node *node){ + if(node == root) node->prop(); + else mop(node->p); + if(node->l) node->l->prop(); + if(node->r) node->r->prop(); + } + + void rotate(Node *node){ + if(!root) return; + if(node->p == rp) return; + if(node->p->l == node){ + Node *p = node->p, *g = p->p; + Node *a = node->l, *b = node->r, *c = p->r; + p->l = b; if(b) b->p = p; + p->r = c; if(c) c->p = p; + node->l = a; if(a) a->p = node; + node->r = p; p->p = node; + node->p = g; if(g) (g->l == p?g->l:g->r) = node; + p->fix(); node->fix(); + if(p == root) root = node; + } + else{ + Node *p = node->p, *g = p->p; + Node *a = p->l, *b = node->l, *c = node->r; + p->l = a; if(a) a->p = p; + p->r = b; if(b) b->p = p; + node->l = p; p->p = node; + node->r = c; if(c) c->p = node; + node->p = g; if(g) (g->l == p?g->l:g->r) = node; + p->fix(); node->fix(); + if(p == root) root = node; + } + } + + void splay(Node* node){ + if(!root) return; assert(node); mop(node); + while(node->p != rp){ + Node *p, *g; + p = node->p; g = p->p; + if(g == rp) rotate(node); + else if((p->l == node) == (g->l == p)) rotate(p), rotate(node); + else rotate(node), rotate(node); + } + root = node; + } + + Node* insert(ll val, bool dum = false){ + if(!root) return root = new Node(val, dum); + Node *now = root; while(now->r) now = now->r; + Node* ret = now->r = new Node(val, dum); + now->r->p = now; return splay(ret), ret; + } + + Node* find_kth(int k) { // 0-indexed + assert(root); assert(root->cnt > k); + Node *now = root; now->prop(); + while(true){ + while(now->l and now->l->cnt > k) now = now->l, now->prop(); + k -= now->l?now->l->cnt:0; + if(k == 0) break; + k--; now = now->r; + now->prop(); + } + return splay(now), now; + } + // s-1, e+1번째 노드가 항상 존재해야 한다. + Node* gather(int s, int e){ + find_kth(e+1); + SplayTree(root->l).find_kth(s-1); + assert(root->l->r); return root->l->r; + } + void update(int i, int j, ll val){ + Node *node = gather(i, j); node->lazy += val; + node->prop(); node->p->fix(); node->p->p->fix(); + } + void reverse(int i, int j){ + Node *node = gather(i, j); node->flip = !node->flip; + } + void p_vals(){p_vals(root, 0, false);} + void p_vals(Node* node, ll lz, bool flip){ + lz += node->lazy; flip ^= node->flip; + if(!flip){ + if(node->l) p_vals(node->l, lz, flip); + if(!node->dum) printf("%lld ", node->val+lz); + if(node->r) p_vals(node->r, lz, flip); + } + else{ + if(node->r) p_vals(node->r, lz, flip); + if(!node->dum) printf("%lld ", node->val+lz); + if(node->l) p_vals(node->l, lz, flip); + } + } +}; +// SplayTree sp; +// fors(i, 0, n+1) arr[i] = sp.insert(i, i==0 or i == n+1); +// Node* node = sp.gather(l, r); sp.reverse(l, r); +// sp.find_kth(k); sp.splay(arr[k]); \ No newline at end of file diff --git a/source/DS/UF_QUndo.cpp b/source/DS/UF_QUndo.cpp new file mode 100644 index 0000000..29462d5 --- /dev/null +++ b/source/DS/UF_QUndo.cpp @@ -0,0 +1,60 @@ +struct dsu_pb { + const int N; + vi par; stack > s; + + dsu_pb(int N):N(N), par(N) { + fors(i, 0, N-1) par[i] = -1; + } + int root(int i) { + if(par[i] < 0) return i; + return root(par[i]); + } + bool join(int i, int j) { + i = root(i); j = root(j); + s.push({{i, par[i]}, {j, par[j]}}); + if(i == j) return false; + if(-par[i] < -par[j]) swap(i, j); + par[i] += par[j]; par[j] = i; + return true; + } + +protected: + void unjoin() { + assert(!s.empty()); + auto [i, j] = s.top(); s.pop(); + par[i.fi] = i.se; par[j.fi] = j.se; + } +}; + +struct dsu_pf : public dsu_pb { + vector > st; // fi==0 -> B type, fi==1 -> A type + vector > tmp[2]; + int A=0, B=0; + dsu_pf(int N):dsu_pb(N){} + + bool join(int i, int j) { + st.pb({0, {i, j}}); B++; + return dsu_pb::join(i, j); + } + void pop_front() { + assert(!st.empty()); + if(A == 0) { + forr(i, B) unjoin(); + A = B; B = 0; reverse(all(st)); + for(auto &[b, p]:st) b = 1, dsu_pb::join(p.fi, p.se); + } + else if(st.back().fi == false) { + tmp[st.back().fi].pb(st.back()); st.pop_back(); unjoin(); + while(tmp[0].size() != tmp[1].size() and (unsigned) A != tmp[1].size()) { + tmp[st.back().fi].pb(st.back()); + st.pop_back(); + unjoin(); + } + for(auto i:{0, 1}) reverse(all(tmp[i])); + for(auto i:{0, 1}) for(auto v:tmp[i]) + st.pb(v), dsu_pb::join(v.se.fi, v.se.se); + tmp[0].clear(); tmp[1].clear(); + } + A--; st.pop_back(); unjoin(); + } +}; \ No newline at end of file diff --git a/source/Fundemental.cpp b/source/Fundemental.cpp new file mode 100644 index 0000000..1c61be6 --- /dev/null +++ b/source/Fundemental.cpp @@ -0,0 +1,22 @@ +#include + +#define getint(n) int n; scanf("%d%*c", &n) +#define getll(n) long long n; scanf("%lld%*c", &n) +#define getchar(n) char n; scanf("%c%*c", &n); +#define intab getint(a); getint(b) + +#define forr(i, n) for(int i=1;i<=(n);i++) +#define fors(i, s, e) for(int i=(s); i<=(e); i++) +#define fore(i, e, s) for(int i=(e); i>=(s); i--) + +#define fi first +#define se second +#define all(v) (v).begin(), (v).end() +#define rall(v) (v).rbegin(), (v).rend() +#define pb push_back + +using namespace std; +using ll = long long; using lll = __int128_t; +using pii = pair; using pll = pair; +using vi = vector; using vl = vector; +using vii = vector; using vll = vector; \ No newline at end of file diff --git a/source/Geometry/Bulldozer.cpp b/source/Geometry/Bulldozer.cpp new file mode 100644 index 0000000..1fdfad6 --- /dev/null +++ b/source/Geometry/Bulldozer.cpp @@ -0,0 +1,60 @@ +struct ray +{ + ll x, y, dx, dy; int i, j; + ray(pll A, pll B, int i = 0, int j = 0) + { + if(A.fi == B.fi && A.se > B.se) swap(A, B), swap(i, j); + + if(A.fi>B.fi) swap(A, B), swap(i, j); + this->i = i; this->j = j; + x = A.fi; y = A.se; + dx = B.fi-A.fi; dy = B.se-A.se; + } + friend bool operator<(const ray& A, const ray& B) + { + return (A.dy*B.dx == B.dy*A.dx)?A.x == B.x?A.dx > p; vector vec; +int num[N]; + +void solve() +{ + getint(n); + p.pb({{0, 0}, 0}); + forr(i, n) + { + getll(a); getll(b); getchar(c); + p.pb({{a, b}, c=='R'}); + } + sort(p.begin()+1, p.end()); + forr(i, n) num[i] = i; + + Seg s(1, n, p); + + forr(i, n) fors(j, i+1, n) vec.pb(ray(p[i].fi, p[j].fi, i, j)); + sort(all(vec)); + + ll ans = s.query(1, n).m; + for(auto r:vec) + { + int i = r.i, j = r.j; + assert(num[i]+1 == num[j]); + + int ii = p[num[i]].se; + int jj = p[num[j]].se; + //printf("%d %d %d %d\n", i, j, ii, jj); + s.update(num[j], [ii](Dta A){return Dta(ii);}); + //printf("%d\n", s.query(1, n).m); + s.update(num[i], [jj](Dta A){return Dta(jj);}); + //printf("%d\n", s.query(1, n).m); + + swap(p[num[i]], p[num[j]]); + swap(num[i], num[j]); + + ans = max(ans, (ll)s.query(1, n).m); + } + printf("%lld\n", ans); +} diff --git a/source/Geometry/Geo.cpp b/source/Geometry/Geo.cpp new file mode 100644 index 0000000..7af55e8 --- /dev/null +++ b/source/Geometry/Geo.cpp @@ -0,0 +1,26 @@ +forr(i, now) vec.pb(A[i]); +sort(all(vec)); + +vll upper; +for(auto i:vec) +{ + while(upper.size() >= 2 && ccw(upper[upper.size()-2], upper.back(), i) >= 0) + upper.pop_back(); + upper.push_back(i); +} + +reverse(all(vec)); +vll lower; +for(auto i:vec) +{ + while(lower.size() >= 2 && ccw(lower[lower.size()-2], lower.back(), i) >= 0) + lower.pop_back(); + lower.push_back(i); +} + +assert(upper.front() == lower.back() && lower.front() == upper.back()); +upper.pop_back(); lower.pop_back(); + +vll hull; +hull.insert(hull.end(), all(upper)); +hull.insert(hull.end(), all(lower)); \ No newline at end of file diff --git a/source/Geometry/HPI.cpp b/source/Geometry/HPI.cpp new file mode 100644 index 0000000..ed4bfad --- /dev/null +++ b/source/Geometry/HPI.cpp @@ -0,0 +1,50 @@ +using ld = long double; +using pdd = pair; +using line = pair; // half plane : left side of vector fi->se + +const ld eps = 1e-9; +pdd operator*(const pdd& a, ld s) { return {a.fi * s, a.se * s}; } +inline bool equals(ld a, ld b) { return abs(a - b) < eps; } + +bool line_intersect(line& a, line& b, pdd& v) { + ld det = (a.se - a.fi) / (b.se - b.fi); + if (equals(det, 0)) return 0; + ld t = ((b.fi - a.fi) / (b.se - b.fi)) / det; + v = a.fi + (a.se - a.fi) * t; + return 1; +} + +bool bad(line& a, line& b, line& c) { + pdd v; if(!line_intersect(a, b, v)) return 0; + return (c.se - c.fi) / (v - c.fi) <= eps; +} + +vector HPI(vector& lns) { + auto lsgn = [&](const line& a) { + if(a.fi.se == a.se.se) return a.fi.fi > a.se.fi; + return a.fi.se > a.se.se; + }; + sort(lns.begin(), lns.end(), [&](const line& a, const line& b) { + if(lsgn(a) != lsgn(b)) return lsgn(a) < lsgn(b); + return (a.se - a.fi) / (b.se - b.fi) > 0; + }); + + deque dq; + for(auto l : lns){ + while(dq.size() >= 2 && bad(dq[dq.size()-2], dq.back(), l)) dq.pop_back(); + while(dq.size() >= 2 && bad(dq[0], dq[1], l)) dq.pop_front(); + + if(dq.size() < 2 || !bad(dq.back(), l, dq[0])) dq.pb(l); + } + + vector res; + if(dq.size() >= 3) { + for(int i = 0; i < (int)dq.size(); i++) { + int j = (i + 1) % (int)dq.size(); + pdd v; + if(!line_intersect(dq[i], dq[j], v)) continue; + res.push_back(v); + } + } + return res; +} \ No newline at end of file diff --git a/source/Geometry/Mindset.cpp b/source/Geometry/Mindset.cpp new file mode 100644 index 0000000..77af704 --- /dev/null +++ b/source/Geometry/Mindset.cpp @@ -0,0 +1,47 @@ +using pii=pair; +pii operator+(pii A, pii B){return {A.fi+B.fi, A.se+B.se};} +pii operator-(pii A, pii B){return {A.fi-B.fi, A.se-B.se};} +ll operator*(pii A, pii B){return (ll)A.fi*B.fi+(ll)A.se*B.se;} // inner product +ll operator/(pii A, pii B){return (ll)A.fi*B.se-(ll)A.se*B.fi;} // outer product + +// 각도 정렬 (O = pii(0, 0)) +sort(P+1, P+1+n, [](pii A, pii B) { + if(B == O) return false; + if(A == O) return true; + return (AB:A/B<0; +}); + +// 선분 교차 +// Segment : fi에서 시작하는 se 벡터 +// fi + k * se, 0 <= k <= 1 + +using Segment = pair; +int isJoin(const Segment& A, const Segment& B) { + if(B.se/A.se != 0) { + ll p = (A.fi-B.fi)/A.se; + ll q = B.se/A.se; + + if(q<0) q = -q, p = -p; + if(p < 0 or p > q) return false; + + p = (B.fi-A.fi)/B.se; + q = A.se/B.se; + + if(q<0) q = -q, p = -p; + if(p < 0 or p > q) return false; + + return true; + } + else { + if((A.fi-B.fi)/A.se != 0) return false; + + ll p = A.fi*A.se, q = (A.fi+A.se)*A.se; + ll r = B.fi*A.se, s = (B.fi+B.se)*A.se; + + if(p>q) swap(p, q); if(r>s) swap(r, s); + + if(max(p, r) > min(q, s)) return false; + + return true; + } +} diff --git a/source/Geometry/PointInConvexPolygon.cpp b/source/Geometry/PointInConvexPolygon.cpp new file mode 100644 index 0000000..2a5b574 --- /dev/null +++ b/source/Geometry/PointInConvexPolygon.cpp @@ -0,0 +1,16 @@ +auto isunder = [](pii upper[], int u, pii x, bool inv = false){ // inv==true : isover + int r = inv?-1:1; + int idx = lower_bound(upper+1, upper+1+u, x, + [&r](pii a, pii b){return r*a.fi u) return false; + if(idx == 1) { + if(r*x.fi < r*upper[1].fi) return false; + else { + int h = upper[1].se; + if(upper[2].fi == upper[1].fi) h = upper[2].se; + + return r*x.se <= r*h; + } + } + return ccw(upper[idx-1], upper[idx], x) <= 0; +}; \ No newline at end of file diff --git a/source/Geometry/geometry_kaere.cpp b/source/Geometry/geometry_kaere.cpp new file mode 100644 index 0000000..faa4799 --- /dev/null +++ b/source/Geometry/geometry_kaere.cpp @@ -0,0 +1,163 @@ +typedef pair pll; +#define _x first +#define _y second + +pll operator-(const pll &a, const pll &b){ + return {a._x - b._x, a._y - b._y}; +} + +ll cross(const pll &a, const pll &b){ + return a._x * b._y - b._x * a._y; +} + +ll dot(const pll &a, const pll &b){ + return a._x * b._x + a._y * b._y; +} + +int ccw(const pll &p1, const pll &p2, const pll &p3){ + ll res = cross(p2 - p1, p3 - p1); + return (res != 0) * (res < 0 ? -1 : 1); +} + +// dist of point - point +double dist(const pll &p1, const pll &p2){ + return sqrt((p1._x - p2._x) * (p1._x - p2._x) + (p1._y - p2._y) * (p1._y - p2._y)); +} + +// dist of line - point +double dist(const pll &l1, const pll &l2, const pll &p){ + ll area = abs(cross(l2 - l1, p - l1)); + return area / dist(l1, l2); +} + +// dist of seg - point +double segDist(P& s, P& e, P& p) { + if (s==e) return (p-s).dist(); + auto d = (e-s).dist2(), t = min(d,max(.0,(p-s).dot(e-s))); + return ((p-s)*d-(e-s)*t).dist()/d; +} + +P perp() const { return P(-y, x); } // rotates +90 degrees +int sgn(T x) { return (x > 0) - (x < 0); } // sign of x + +// Returns where p is as seen from s towards e. 1/0/-1 <-> left/on line/right. +int sideOf(P s, P e, P p) { return sgn(s.cross(e, p)); } + +// Returns a vector of either 0, 1, or 2 intersection points. +template +vector

circleLine(P c, double r, P a, P b) { + P ab = b - a, p = a + ab * (c-a).dot(ab) / ab.dist2(); + double s = a.cross(b, c), h2 = r*r - s*s / ab.dist2(); + if (h2 < 0) return {}; + if (h2 == 0) return {p}; + P h = ab.unit() * sqrt(h2); + return {p - h, p + h}; +} + +// Computes the pair of points at which two circles intersect. +typedef Point P; +bool circleInter(P a,P b,double r1,double r2,pair* out) { + if (a == b) { assert(r1 != r2); return false; } + P vec = b - a; + double d2 = vec.dist2(), sum = r1+r2, dif = r1-r2, + p = (d2 + r1*r1 - r2*r2)/(d2*2), h2 = r1*r1 - p*p*d2; + if (sum*sum < d2 || dif*dif > d2) return false; + P mid = a + vec*p, per = vec.perp() * sqrt(fmax(0, h2) / d2); + *out = {mid + per, mid - per}; + return true; +} + +// Returns true iff p lies on the line segment from s to e. +template bool onSegment(P s, P e, P p) { + return p.cross(s, e) == 0 && (s - p).dot(e - p) <= 0; +} + +// Circumcircle +typedef Point P; +double ccRadius(const P& A, const P& B, const P& C) { + return (B-A).dist()*(C-B).dist()*(A-C).dist()/ + abs((B-A).cross(C-A))/2; +} +P ccCenter(const P& A, const P& B, const P& C) { + P b = C-A, c = B-A; + return A + (b*c.dist2()-c*b.dist2()).perp()/b.cross(c)/2; +} + +// Minimum enclosing circle +pair mec(vector

ps) { + shuffle(all(ps), mt19937(time(0))); + P o = ps[0]; + double r = 0, EPS = 1 + 1e-8; + rep(i,0,sz(ps)) if ((o - ps[i]).dist() > r * EPS) { + o = ps[i], r = 0; + rep(j,0,i) if ((o - ps[j]).dist() > r * EPS) { + o = (ps[i] + ps[j]) / 2; + r = (o - ps[i]).dist(); + rep(k,0,j) if ((o - ps[k]).dist() > r * EPS) { + o = ccCenter(ps[i], ps[j], ps[k]); + r = (o - ps[i]).dist(); + } + } + } + return {o, r}; +} + +// point inside convex hull in logN +bool inHull(const vector

& l, P p, bool strict = true) { + int a = 1, b = sz(l) - 1, r = !strict; + if (sz(l) < 3) return r && onSegment(l[0], l.back(), p); + if (sideOf(l[0], l[a], l[b]) > 0) swap(a, b); + if (sideOf(l[0], l[a], p) >= r || sideOf(l[0], l[b], p)<= -r) + return false; + while (abs(a - b) > 1) { + int c = (a + b) / 2; + (sideOf(l[0], l[c], p) > 0 ? b : a) = c; + } + return sgn(l[a].cross(l[b], p)) < r; +} + +// convex hull +vector convex_hull(vector &arr){ + vector up, down; + for(auto p : arr){ + while(up.size() >= 2 && ccw(up[up.size() - 2], up[up.size() - 1], p) >= 0) up.pop_back(); + while(down.size() >= 2 && ccw(down[down.size() - 2], down[down.size() - 1], p) <= 0) down.pop_back(); + up.push_back(p); + down.push_back(p); + } + up.insert(up.end(), down.rbegin() + 1, down.rend()); + return up; +} + +// rotating callipers +typedef Point P; +array hullDiameter(vector

S) { + int n = sz(S), j = n < 2 ? 0 : 1; + pair> res({0, {S[0], S[0]}}); + rep(i,0,j) + for (;; j = (j + 1) % n) { + res = max(res, {(S[i] - S[j]).dist2(), {S[i], S[j]}}); + if ((S[(j + 1) % n] - S[j]).cross(S[i + 1] - S[i]) >= 0) + break; + } + return res.second; +} + +// Closest pair +typedef Point P; +pair closest(vector

v) { + assert(sz(v) > 1); + set

S; + sort(all(v), [](P a, P b) { return a.y < b.y; }); + pair> ret{LLONG_MAX, {P(), P()}}; + int j = 0; + for (P p : v) { + P d{1 + (ll)sqrt(ret.first), 0}; + while (v[j].y <= p.y - d.x) S.erase(v[j++]); + auto lo = S.lower_bound(p - d), hi = S.upper_bound(p + d); + for (; lo != hi; ++lo) + ret = min(ret, {(*lo - p).dist2(), {*lo, p}}); + S.insert(p); + } + return ret.second; +} \ No newline at end of file diff --git a/source/Geometry/namespace_geometry.cpp b/source/Geometry/namespace_geometry.cpp new file mode 100644 index 0000000..7cefcba --- /dev/null +++ b/source/Geometry/namespace_geometry.cpp @@ -0,0 +1,109 @@ +template +class Point { +public: + T x, y; + Point() : x(0), y(0) {}; + Point(T _x, T _y) : x(_x), y(_y) {}; + + Point operator+(Point p2){ + return Point(x + p2.x, y + p2.y); + } + Point operator-(Point p2){ + return Point(x - p2.x, y - p2.y); + } + T operator*(Point p2){ + return x * p2.x + y * p2.y; + } + T operator/(Point p2) { + return x * p2.y - p2.x * y; + } + T operator==(Point p2) { + return (x == p2.x) && (y == p2.y); + } + T sqdist() { + return x*x + y*y; + } + bool operator<(Point p2) { + if(y == p2.y) + return x < p2.x; + return y < p2.y; + } + +}; + +namespace geometry { + template + ll ccw(Point center, Point p2, Point p3) { + ll res = (p2 - center) / (p3 - center); + return (res > 0) - (res < 0); + } + + template + double theta(Point center, Point p2, Point p3) { + return acos(p2 * p3 / sqrt(p2.sqdist() * p3.sqdist())); + } + + template + function &, Point &, Point)> cmp_point = [](Point &l, Point &r, Point O = {(T)0, (T)0}) -> bool { + return (l < O) != (r < O) ? l < r : l/r > 0; + }; + + template + T sq_dist(Point &p1, Point &p2) { + return (p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y); + } + + template + double dist(Point &p1, Point &p2) { + return sqrt((double)sq_dist(p1, p2)); + } + + template + double line_point_dist(pair, Point> &l, Point p) + { + Point p1 = p - l.first, p2 = l.second - l.first; + return abs(p1 / p2)/(dist(l.first, l.second)); + } + + template + double line_min_dist(pair, Point> &l1, pair, Point> &l2) { + double ans = INFINITY; + ans = min({ans, dist(l1.first, l2.first), dist(l1.first, l2.second), dist(l1.second, l2.first), dist(l1.second, l2.second)}); + + if((l1.second - l1.first)*(l2.first - l1.first) > 0 && (l1.first - l1.second)*(l2.first - l1.second) > 0) + ans = min({ans, line_point_dist(l1, l2.first)}); + if((l1.second - l1.first)*(l2.second - l1.first) > 0 && (l1.first - l1.second)*(l2.second - l1.second) > 0) + ans = min({ans, line_point_dist(l1, l2.second)}); + swap(l1, l2); + if((l1.second - l1.first)*(l2.first - l1.first) > 0 && (l1.first - l1.second)*(l2.first - l1.second) > 0) + ans = min({ans, line_point_dist(l1, l2.first)}); + if((l1.second - l1.first)*(l2.second - l1.first) > 0 && (l1.first - l1.second)*(l2.second - l1.second) > 0) + ans = min({ans, line_point_dist(l1, l2.second)}); + swap(l1, l2); + return ans; + } + + template + vector convex_hull(vector> &pts) { + assert(pts.size() >= 2); + vector> res; + + swap(pts[0], *min_element(pts.begin(), pts.end())); + sort(pts.begin()+1, pts.end(), [&pts](Point &a, Point &b){ + ll cw = ccw(pts[0], a, b); + if(cw) return cw > 0; + return sq_dist(pts[0], a) < sq_dist(pts[0], b); + }); + auto itr = pts.begin(); + res.push_back(*(itr++)); res.push_back(*(itr++)); + + while(itr != pts.end()) + { + while(res.size() >= 2 && ccw(res[res.size()-2], res[res.size()-1], *itr) <= 0) + res.pop_back(); + res.push_back(*(itr++)); + } + return res; + } +} +using namespace geometry; diff --git a/source/Graph/2SAT.cpp b/source/Graph/2SAT.cpp new file mode 100644 index 0000000..8744c18 --- /dev/null +++ b/source/Graph/2SAT.cpp @@ -0,0 +1,5 @@ +ok = true; // 1<=i&&i<=n : $x$, n+1<=i&&i<=2*n : $!x$ +forr(i, n) { + if (scn[i] == scn[i+n]) ok = false; + ans[i] = (scn[i] < scn[i+n]); +} \ No newline at end of file diff --git a/source/Graph/BipartiteMatching.cpp b/source/Graph/BipartiteMatching.cpp new file mode 100644 index 0000000..7b4c18c --- /dev/null +++ b/source/Graph/BipartiteMatching.cpp @@ -0,0 +1,13 @@ +vector sideadj[N]; +int selby[M]; +int chk[M], c; +bool matching(int s) { + for(auto i : sideadj[s]) { + if(chk[i] == c) continue; + chk[i] = c; + if(selby[i] and !matching(selby[i])) continue; + selby[i] = s; + return true; + } + return false; +} \ No newline at end of file diff --git a/source/Graph/Dinic.cpp b/source/Graph/Dinic.cpp new file mode 100644 index 0000000..b7e5fa1 --- /dev/null +++ b/source/Graph/Dinic.cpp @@ -0,0 +1,69 @@ +struct Edge { + int to, cap, now; + Edge* rev; + Edge(int to,int cap):to(to), cap(cap), now(0){} + int left(){return cap - now;} + void flow(int f){now += f; rev->now -= f;} + void reset(){now = 0;} +}; +vector adj[N]; + +int lv[N]; bool chk[N]; +bool bfs(int S, int T) { + queue q; + q.push(S); lv[S] = 0; chk[S] = true; + while(!q.empty()) { + int s = q.front(); q.pop(); + for(auto i : adj[s]) { + if(i->left() and !chk[i->to]) { + lv[i->to] = lv[s]+1; chk[i->to] = true; + q.push(i->to); + } + } + } + return chk[T]; +} + +Edge* hist[N]; int last[N]; +bool dfs(int s, int T) { + if(s == T) return true; + + for(int &j=last[s]; j < adj[s].size(); j++) { + int i = adj[s][j]->to; + if(adj[s][j]->left() == 0 or lv[i] != lv[s]+1) continue; + hist[i] = adj[s][j]; + + if(dfs(i, T)) return true; + } + return false; +} + +ll flow(int S,int T) { + ll ans = 0; + while(bfs(S, T)) { + while(dfs(S, T)) { + int m = 2e9; + int now = T; + while(S != now) { + m = min(m, hist[now]->left()); + now = hist[now]->rev->to; + } + now = T; + while(S != now) + hist[now]->flow(m), now = hist[now]->rev->to; + ans += m; + } + memset(last, 0, sizeof last); + memset(chk, 0, sizeof chk); + } + return ans; +} +// isDir : isDirected => 양방향 간선이면 false +void connect(int from, int to, int cap, bool isDir = true) { + Edge *fw, *bw; + fw = new Edge(to, cap); + bw = new Edge(from, !isDir ? cap : 0); + fw->rev = bw; bw->rev = fw; + adj[from].push_back(fw); + adj[to].push_back(bw); +} \ No newline at end of file diff --git a/source/Graph/DominatorTree.cpp b/source/Graph/DominatorTree.cpp new file mode 100644 index 0000000..5063d7d --- /dev/null +++ b/source/Graph/DominatorTree.cpp @@ -0,0 +1,51 @@ +// https://ideone.com/aO6cH4 +namespace dtree{ // by cki86201 +vector E[N], RE[N], rdom[N]; +int S[N], RS[N], cs; +int par[N], val[N], sdom[N], rp[N], dom[N]; +void clear(int n) { cs = 0; + for(int i=0;i<=n;i++) { + par[i] = val[i] = sdom[i] = rp[i] = dom[i] = S[i] = RS[i] = 0; + E[i].clear(); RE[i].clear(); rdom[i].clear(); + } +} +void add_edge(int x, int y) { E[x].push_back(y); } +void Union(int x, int y) { par[x] = y; } +int Find(int x, int c = 0) { + if(par[x] == x) return c ? -1 : x; + int p = Find(par[x], 1); + if(p == -1) return c ? par[x] : val[x]; + if(sdom[val[x]] > sdom[val[par[x]]]) val[x] = val[par[x]]; + par[x] = p; + return c ? p : val[x]; +} +void dfs(int x) { + RS[ S[x] = ++cs ] = x; + par[cs] = sdom[cs] = val[cs] = cs; + for(int e : E[x]) { + if(S[e] == 0) dfs(e), rp[S[e]] = S[x]; + RE[S[e]].push_back(S[x]); + } +} +int solve(int s, int *up) { // Calculate idoms + dfs(s); + for(int i=cs;i;i--) { + for(int e : RE[i]) sdom[i] = min(sdom[i], sdom[Find(e)]); + if(i > 1) rdom[sdom[i]].push_back(i); + for(int e : rdom[i]) { + int p = Find(e); + if(sdom[p] == i) dom[e] = i; + else dom[e] = p; + } + if(i > 1) Union(i, rp[i]); + } + for(int i=2;i<=cs;i++) if(sdom[i] != dom[i]) dom[i] = dom[dom[i]]; + for(int i=2;i<=cs;i++) up[RS[i]] = RS[dom[i]]; + return cs; +} +} // namespace dtree + +int par[N]; +dtree::add_edge(a, b); // a -> b +int cnt = dtree::solve(s, par); +// cnt : s에서 도달할 수 있는 정점, par: dominator tree의 par diff --git a/source/Graph/MCMF.cpp b/source/Graph/MCMF.cpp new file mode 100644 index 0000000..ce0dcb6 --- /dev/null +++ b/source/Graph/MCMF.cpp @@ -0,0 +1,67 @@ +struct Edge { + int to, cap, now; + ll cost; + Edge* rev; + Edge(int to,int cap, ll cost) + :to(to), cap(cap), now(0), cost(cost){} + int left(){return cap - now;} + ll flow(int f) + {now += f; rev->now -= f; return cost * f;} + void reset(){now = 0;} +}; +vector adj[N]; +Edge* hist[N]; ll dist[N]; bool inQueue[N], chk[N]; +bool spfa(int s, int t) { + memset(dist, 0, sizeof(dist)); + memset(chk, 0, sizeof(chk)); chk[s] = true; + queue q; + memset(inQueue, 0, sizeof(inQueue)); + q.push(s); inQueue[s] = true; + while(!q.empty()) { + int now = q.front(); + q.pop(); inQueue[now] = false; + + for(auto e : adj[now]) { + int next = e->to; + if(e->left() > 0 and + (chk[next] == false + or dist[next] > dist[now] + e->cost)) { + chk[next] = true; + dist[next] = dist[now] + e->cost; + hist[next] = e; + if(!inQueue[next]) + q.push(next), inQueue[next] = true; + } + } + } + return chk[t]; +} +// cost가 들어가면 항상 단방향만 가능하다. (양방향 : 2번 connect) +void connect(int from, int to, int cap, ll cost) { + Edge *fw, *bw; + fw = new Edge(to, cap, cost); + bw = new Edge(from, 0, -cost); + fw->rev = bw; bw->rev = fw; + adj[from].push_back(fw); + adj[to].push_back(bw); +} +//maximum matching & minimum cost +pair flow(int S,int T) { + ll ans = 0; ll cost = 0; + while(spfa(S, T)) { + int m = 2e9; + + int now = T; + while(S != now) { + m = min(m, hist[now]->left()); + now = hist[now]->rev->to; + } + now = T; + while(S != now) { + cost += hist[now]->flow(m); + now = hist[now]->rev->to; + } + ans += m; + } + return {ans, cost}; +} \ No newline at end of file diff --git a/source/Graph/Matching.cpp b/source/Graph/Matching.cpp new file mode 100644 index 0000000..22eb9a6 --- /dev/null +++ b/source/Graph/Matching.cpp @@ -0,0 +1,74 @@ +// From https://github.com/koosaga/olympiad +// matching_short.cpp +const int MAXN = 2020 + 1; +// 1-based Vertex index +int vis[MAXN], par[MAXN], orig[MAXN], match[MAXN], aux[MAXN], t, N; +vector conn[MAXN]; +queue Q; +void addEdge(int u, int v) { conn[u].push_back(v); conn[v].push_back(u); } +void init(int n) { + N = n; t = 0; + for(int i=0; i<=n; ++i) { + conn[i].clear(); + match[i] = aux[i] = par[i] = 0; + } +} +void augment(int u, int v) { + int pv = v, nv; + do { + pv = par[v]; nv = match[pv]; + match[v] = pv; match[pv] = v; + v = nv; + } while(u != pv); +} +int lca(int v, int w) { + ++t; + while(true) { + if(v) { + if(aux[v] == t) return v; aux[v] = t; + v = orig[par[match[v]]]; + } + swap(v, w); + } +} +void blossom(int v, int w, int a) { + while(orig[v] != a) { + par[v] = w; w = match[v]; + if(vis[w] == 1) Q.push(w), vis[w] = 0; + orig[v] = orig[w] = a; + v = par[w]; + } +} +bool bfs(int u) { + fill(vis+1, vis+1+N, -1); iota(orig + 1, orig + N + 1, 1); + Q = queue (); Q.push(u); vis[u] = 0; + while(!Q.empty()) { + int v = Q.front(); Q.pop(); + for(int x: conn[v]) { + if(vis[x] == -1) { + par[x] = v; vis[x] = 1; + if(!match[x]) return augment(u, x), true; + Q.push(match[x]); vis[match[x]] = 0; + } + else if(vis[x] == 0 && orig[v] != orig[x]) { + int a = lca(orig[v], orig[x]); + blossom(x, v, a); blossom(v, x, a); + } + } + } + return false; +} +int Match() { + int ans = 0; + // find random matching (not necessary, constant improvement) + vector V(N-1); iota(V.begin(), V.end(), 1); + shuffle(V.begin(), V.end(), mt19937(0x94949)); + for(auto x: V) if(!match[x]){ + for(auto y: conn[x]) if(!match[y]) { + match[x] = y, match[y] = x; + ++ans; break; + } + } + for(int i=1; i<=N; ++i) if(!match[i] && bfs(i)) ++ans; + return ans; +} \ No newline at end of file diff --git a/source/Graph/TarjanSCC.cpp b/source/Graph/TarjanSCC.cpp new file mode 100644 index 0000000..333ae33 --- /dev/null +++ b/source/Graph/TarjanSCC.cpp @@ -0,0 +1,28 @@ +vi adj[N]; +int in[N], c = 0; +stack p; +bool fin[N]; int scn[N], nscc = 0; +int dfs(int s) { + in[s] = ++c; + p.push(s); + + int m = c; + for(auto i : adj[s]) { + if(in[i] == 0) m = min(m, dfs(i)); + else if(!fin[i]) m = min(m, in[i]); + } + + if(m == in[s]) { + nscc++; + while(p.top() != s) + { + int i = p.top(); p.pop(); + scn[i] = nscc; fin[i] = true; + } + p.pop(); + scn[s] = nscc; fin[s] = true; + } + return m; +} + +forr(i, n) if(!fin[i]) dfs(i); \ No newline at end of file diff --git a/source/Linear Algebra/BerlekampMassey.cpp b/source/Linear Algebra/BerlekampMassey.cpp new file mode 100644 index 0000000..a8661dd --- /dev/null +++ b/source/Linear Algebra/BerlekampMassey.cpp @@ -0,0 +1,107 @@ +// https://gist.github.com/koosaga/d4afc4434dbaa348d5bef0d60ac36aa4 +vector berlekamp_massey(vector x){ + vector ls, cur; int lf, ld; + for(int i=0; i c(i-lf-1); c.push_back(k); + for(auto &j : ls) c.push_back(-j * k % mod); + if(c.size() < cur.size()) c.resize(cur.size()); + for(int j=0; j=(int)cur.size()) + tie(ls, lf, ld) = make_tuple(cur, i, (t - x[i]) % mod); + cur = c; + } + for(auto &i : cur) i = (i % mod + mod) % mod; + return cur; +} +int get_nth(vector rec, vector dp, ll n){ + int m = rec.size(); + vector s(m), t(m); + s[0] = 1; + if(m != 1) t[1] = 1; + else t[0] = rec[0]; + auto mul = [&rec](vector v, vector w){ + int m = v.size(); + vector t(2 * m); + for(int j=0; j= mod) t[j+k] -= mod; + } + } + for(int j=2*m-1; j>=m; j--){ + for(int k=1; k<=m; k++){ + t[j-k] += (ll)t[j] * rec[k-1] % mod; + if(t[j-k] >= mod) t[j-k] -= mod; + } + } + t.resize(m); + return t; + }; + while(n){ + if(n & 1) s = mul(s, t); + t = mul(t, t); + n >>= 1; + } + ll ret = 0; + for(int i=0; i get_min_poly(int n, vector M){ + // smallest poly P such that A^i = sum_{j < i} {A^j \times P_j} + vector rnd1, rnd2; + mt19937 rng(0x14004); + auto randint = [&rng](int lb, int ub){ + return uniform_int_distribution(lb, ub)(rng); + }; + fors(i, 0, n-1) rnd1.push_back(randint(1, mod - 1)); + fors(i, 0, n-1) rnd2.push_back(randint(1, mod - 1)); + vector gobs; + fors(i, 0, 2*n+1){ + int tmp = 0; + fors(j, 0, n-1){ + tmp += (ll)rnd2[j] * rnd1[j] % mod; + if(tmp >= mod) tmp -= mod; + } + gobs.push_back(tmp); + vector nxt(n); + for(auto &i : M){ + nxt[i.x] += (ll)i.v * rnd1[i.y] % mod; + if(nxt[i.x] >= mod) nxt[i.x] -= mod; + } + rnd1 = nxt; + } + auto sol = berlekamp_massey(gobs); + reverse(sol.begin(), sol.end()); + return sol; +} + +ll det(int n, vector M){ + vector rnd; + mt19937 rng(0x14004); + auto randint = [&rng](int lb, int ub){ + return uniform_int_distribution(lb, ub)(rng); + }; + fors(i, 0, n-1) rnd.push_back(randint(1, mod - 1)); + for(auto &i : M){ + i.v = (ll)i.v * rnd[i.y] % mod; + } + auto sol = get_min_poly(n, M)[0]; + if(n % 2 == 0) sol = mod - sol; + for(auto &i : rnd) sol = (ll)sol * ipow(i, mod - 2) % mod; + return sol; +} diff --git a/source/Linear Algebra/Matrix.cpp b/source/Linear Algebra/Matrix.cpp new file mode 100644 index 0000000..69eccc0 --- /dev/null +++ b/source/Linear Algebra/Matrix.cpp @@ -0,0 +1,56 @@ +class Matrix { +private: + ll c, r, mod; vector> arr; + ll power(ll x, ll y, ll p) { + if (y == 0) return 1; + ll v = power(x, y/2, p) % p; + v = (v * v) % p; + return (y%2 == 0)? v : (x * v) % p; + } + ll modInverse(ll a, ll p) { return power(a, p-2, p); } +public: + Matrix(int _n, int _m, ll p) : c(_n), r(_m), mod(p), arr(_n, vl(_m, 0)){} + void setI() { assert(c == r); for(int i=0; i Inverse() { + assert(c == r); + Matrix victim = *this, retm(c, c, mod); retm.setI(); + for (int k = 0; k < c; k++) { + int t = k - 1; while (t + 1 < c && !victim[++t][k]); + if (t == c - 1 && !victim[t][k]) + return {false, Matrix(0, 0, 0)}; + victim.swaprow(k, t), retm.swaprow(k, t); + ll d = victim[k][k]; + for (int j = 0; j < c; j++) { + victim[k][j] = (victim[k][j] * modInverse(d, mod))%mod; + retm[k][j] = (retm[k][j] * modInverse(d, mod))%mod; + } + for (int i = 0; i= k) victim[i][j] = (victim[i][j] - victim[k][j] * m + mod*mod)%mod; + retm[i][j] = (retm[i][j] - retm[k][j] * m + mod*mod)%mod; + } + } + } + return {true, retm}; + } + vector GaussElimination() { + assert(c == r - 1); + vector retv(c, 0.0); + for(ll i=0; i= 0; p--) { + retv[p] = arr[p][c] / arr[p][p]; + for (q = p - 1; q >= 0; q--) + arr[q][c] = arr[q][c] - arr[q][p] * retv[p]; + } + return retv; + } +}; \ No newline at end of file diff --git a/source/Linear Algebra/XORBasis.cpp b/source/Linear Algebra/XORBasis.cpp new file mode 100644 index 0000000..da2fcd3 --- /dev/null +++ b/source/Linear Algebra/XORBasis.cpp @@ -0,0 +1,5 @@ +vector basis; +void insert(ll x) { + for(auto i:basis) x = min(x, x ^ basis[i]); + if (x != 0) basis.push_back(x); +} diff --git a/source/Math/CRT.cpp b/source/Math/CRT.cpp new file mode 100644 index 0000000..36276b5 --- /dev/null +++ b/source/Math/CRT.cpp @@ -0,0 +1,13 @@ +pll crt(pll p, pll q) { + if(p.fi > q.fi) swap(p, q); + auto [a, A] = p; + auto [b, B] = q; + + ll g = gcd(A, B); + if((b-a)%g != 0) return {-1, -1}; + + ll i = A, j = B, k = b-a; + i/=g; j/=g; k/=g; + auto [x, y] = diophantos(i, j); + return {(ll)((a+(lll)A*k*x)%(A*B/g)), A*B/g}; +} \ No newline at end of file diff --git a/source/Math/Diophantos.cpp b/source/Math/Diophantos.cpp new file mode 100644 index 0000000..ee52470 --- /dev/null +++ b/source/Math/Diophantos.cpp @@ -0,0 +1,12 @@ +pll diophantos(ll a, ll b) { + assert(a>0 and b>=0); + if(b == 0) return {1, 0}; + auto [y, x] = diophantos(b, a%b); y = y-(a/b)*x; + if(x < 0 or x >= b) { + ll t = x/b; + if(x%b < 0) t--; + + x -= b*t; y += a*t; + } + return {x, y}; +} \ No newline at end of file diff --git a/source/Math/FFTConv.cpp b/source/Math/FFTConv.cpp new file mode 100644 index 0000000..5d98a61 --- /dev/null +++ b/source/Math/FFTConv.cpp @@ -0,0 +1,61 @@ +using cpx = complex; +using vcpx = vector; +void fft(vcpx &a, bool inv = false) { + int n = a.size(), j = 0; assert((n&-n) == n); + for(int i=1; i> 1); + while(j >= bit) { + j -= bit; bit >>= 1; + } + j += bit; if(i < j) swap(a[i], a[j]); + } + vcpx roots(n/2); + prec c = 2 * pi * (inv ? -1 : 1); + for(int i=0; i=c or b>=c) return n*(n-1)/2 * (a/c) + n * (b/c) + floor_sum(a%c, b%c, c, n); + ll m = (a*(n-1)+b)/c; + return m*n - floor_sum(c, c-b+a-1, a, m); +} \ No newline at end of file diff --git a/source/Math/Harmonic.cpp b/source/Math/Harmonic.cpp new file mode 100644 index 0000000..e1d7190 --- /dev/null +++ b/source/Math/Harmonic.cpp @@ -0,0 +1,12 @@ +ll harmonic(ll n) { + ll ans = 0; + for(ll i = 1; i <= n; i = n/(n/i)+ 1) { + //for j \in [i, n/(n/i)] : n/j == n/i + + ans += n/i * (n/(n/i) - i + 1); + + // \sum_{i=1}^n {f(n/i)} + // ans += f(n/i) * (n/(n/i) - i + 1) + } + return ans; +} \ No newline at end of file diff --git a/source/Math/MillerRabin.cpp b/source/Math/MillerRabin.cpp new file mode 100644 index 0000000..4b8dcd4 --- /dev/null +++ b/source/Math/MillerRabin.cpp @@ -0,0 +1,26 @@ +ll pow(ll a, ll b, ll mod) { + ll ret = 1; + for(int st=0; (1LL< +ll pow(ll a, ll b) { + a %= mod; + ll ret = 1; + while(b != 0) { + if(b&1) ret = ret*a%mod; + a = a*a%mod; b>>=1; + } + return ret; +} +template +void ntt(vector &a, bool inv = false) { + static_assert(mod <= (ll)2e9, "mod should be less than 2e9"); + int n = a.size(), j = 0; + + assert((n & -n) == n && (mod-1)%n == 0); + + for(int i=1; i> 1); + while(j >= bit) { + j -= bit; + bit >>= 1; + } + j += bit; + if(i < j) swap(a[i], a[j]); + } + + static vector root[30], iroot[30]; + for(int st=1; (1<(w, (mod-1)/(1<(w, (mod-1)/(1<(t, mod-2); + + iroot[st].pb(1); + for(int i=1; i<(1<<(st-1)); i++) + iroot[st].pb(iroot[st].back()*t%mod); + } + } + + vector* r = (inv?root:iroot); + + for(int st = 1; (1<(n, mod-2); + for(int i=0; i +vl conv(vl A, vl B) { + int n = A.size(), m = B.size(); + int t = 1; while(t < n+m-1) t*=2; + A.resize(t); B.resize(t); + + ntt(A); ntt(B); + + fors(i, 0, t-1) A[i] = A[i]*B[i]%mod; + + ntt(A, true); + A.resize(n+m-1); + + return A; +} +} // namespace GMS \ No newline at end of file diff --git a/source/Math/PolladRho.cpp b/source/Math/PolladRho.cpp new file mode 100644 index 0000000..3128e35 --- /dev/null +++ b/source/Math/PolladRho.cpp @@ -0,0 +1,22 @@ +void fact(ll n, vl& ret) { + if(n == 1) return; + else if(n%2 == 0) ret.pb(2), fact(n/2, ret); + else if(is_p(n)) ret.pb(n); + else { + ll a, b, c, g = n; + auto f = [&c, &n](ll x)->ll{return (c+(lll)x*x)%n;}; + + do { + if(g == n) a=b=rand()%(n-2)+2, c=rand()%20+1; + a=f(a); b=f(f(b)); + g = gcd(a-b, n); + } while(g == 1); + fact(g, ret); fact(n/g, ret); + } +} +vl po_rho(ll n) { + vl ret; + fact(n, ret); + sort(all(ret)); + return ret; +} \ No newline at end of file diff --git a/source/Math/Polynomial.cpp b/source/Math/Polynomial.cpp new file mode 100644 index 0000000..2111d1f --- /dev/null +++ b/source/Math/Polynomial.cpp @@ -0,0 +1,149 @@ +namespace GMS { +template +struct Qring : public vl { + using poly = Qring; + Qring() : vl(1, 0) {} + Qring(ll c) : vl(1, c%mod) {} + Qring(ll c, int n) : vl(n, c%mod) {} + Qring(const vl& cp) : vl(cp) {for(auto &i:*this) i%=mod;} + + ll& operator[](ll idx) { + if((unsigned)idx < size()) return vl::operator[](idx); + this->resize(idx+1); return vl::operator[](idx); + } + ll operator[](ll idx) const { + if((unsigned)idx < size()) return vl::operator[](idx); + return 0LL; + } + void adjust() { while(size() > 1 and back() == 0) pop_back(); } + void adjust(int n){resize(n, 0);} + ll operator()(ll x) { + x %= mod; ll ret = 0; + for(auto it=rbegin(); it!=rend(); it++) + ret = (ret*x+*it)%mod; + return ret; + } + friend poly operator%(const poly& A, int B){ // remainder by x^B + poly ret(A); ret.resize(B, 0); + return ret; + } + friend poly operator+(const poly& A, const poly& B) { + int n = max(A.size(), B.size()); poly ret(0, n); + fors(i, 0, n-1) ret[i] = A[i]+B[i]; + for(auto&i:ret) if(i >= mod) i -= mod; + return ret.adjust(), ret; + } + friend poly operator-(const poly& A) { + int n = A.size(); poly ret(0, n); + fors(i, 0, n-1) ret[i] = A[i]?mod-A[i]:0; + return ret; + } + friend poly operator-(const poly& A, const poly& B) { + int n = max(A.size(), B.size()); + poly ret(0, n); + fors(i, 0, n-1) ret[i] = (mod+A[i]-B[i])%mod; + return ret.adjust(), ret; + } + friend poly operator*(ll x, const poly& B) { + poly ret(B); x %= mod; + for(auto &i : ret) i = (i*x)%mod; + return ret.adjust(), ret; + } + friend poly operator*(const poly& A, const poly& B) { + poly ret = conv(A, B); + // ACL : poly ret = atcoder::convolution(A, B); + return ret.adjust(), ret; + } + friend poly inv(const poly& A, int t) { assert(A[0] != 0); + poly g = pow(A[0], mod-2); int st=1; + while(st < t){st*=2; g = (-A%st*g%st+2)*g%st;} + return g.adjust(t), g; + } + friend poly diff(const poly& A) { + int n = A.size(); poly ret(0, n-1); + fors(i, 0, n-2) ret[i] = (i+1)*A[i+1]%mod; + return ret; + } + friend poly inte(const poly& A) { + static vector inv(1, 1); + int n = A.size(); poly ret(0, n+1); + inv.resize(max((int)inv.size(), n+1)); + forr(i, n) if(inv[i] == 0) inv[i] = pow(i, mod-2); + forr(i, n) ret[i] = inv[i]*A[i-1]%mod; + return ret; + } + friend poly log(const poly& A, int t) { assert(A[0] == 1); + return inte(diff(A) * inv(A, t)%t)%t; + } + friend poly exp(const poly& A, int t) { assert(A[0] == 0); + poly g = 1; int st = 1; + while(st < t) {st*=2; g = (A%st-log(g, st)+1)*g%st;} + return g.adjust(), g; + } + friend poly pow(const poly& A, ll b, ll t) { + poly ret(A); ret.adjust(); + if(ret.size() == 1) { + ret[0] = pow(ret[0], b); + return ret.adjust(t), ret; + } + ll idx = 0; while(ret[idx] == 0) idx++; + if((__int128_t) idx * b >= t) return poly(0, t); + + ll c = ret[idx]; ll ic = pow(ret[idx], mod-2); poly g; + int n = ret.size(); + fors(i, idx, n-1) g[i-idx] = ret[i]*ic%mod; + g.resize(t-idx*b); + + g = exp(b * log(g, t-idx*b), t-idx*b); + c = pow(c, b); + + ret = poly(0, t); fors(i, idx*b, t-1) ret[i] = g[i-idx*b] * c % mod; + + return ret; + } + + //Only just Polynomial, not Qring + void rev() { reverse(begin(), end()); } + friend poly div_quot(poly F, poly G) { + F.adjust(); G.adjust(); + ll df = F.size(), dg = G.size(); + if(df < dg) return poly(0); + F.rev(); G.rev(); + F = F%(df-dg+1)*inv(G, df-dg+1)%(df-dg+1); F.rev(); + return F; + } + friend poly div_rem(poly F, poly G) {return F-G*div_quot(F, G);} + friend poly shift(const poly& F, ll c) { + ll n = F.size(); c %= mod; + poly A(0, n); ll fac = 1; + fors(i, 0, n-1) A[i] = F[i]*fac%mod, fac = fac*(i+1)%mod; + A.rev(); + + poly C(1, n); fors(i, 1, n-1) C[i] = C[i-1]*c%mod; + ll facc = fac = pow(fac, mod-2)*n%mod; + fore(i, n-1, 0) C[i] = C[i]*fac%mod, fac = fac*i%mod; + + poly B = C*A; B.resize(n); B.rev(); + fore(i, n-1, 0) B[i] = B[i]*facc%mod, facc = facc*i%mod; + return B; + } + friend void calcG(vector& G, int i, int l, int r, const vl& p) { + if(l == r){ll g = p[l]?mod-p[l]:0; G[i] = vl({g, 1}); return;} + int mid = (l+r)/2; + calcG(G, i*2, l, mid, p); calcG(G, i*2+1, mid+1, r, p); + G[i] = G[i*2]*G[i*2+1]; + } + friend void eval(const vector& G, int i, int l, int r, poly&& F, vl& ret) { + if(l == r){ret[l] = F[0];return;} + int mid=(l+r)/2; + eval(G, i*2, l, mid, div_rem(F, G[i*2]), ret); + eval(G, i*2+1, mid+1, r, div_rem(F, G[i*2+1]), ret); + } + friend vl multipoint_eval(const poly& A, const vl& B) { + int m = B.size(); + vector G(4*m); calcG(G, 1, 0, m-1, B); + vl ret(m, 0); eval(G, 1, 0, m-1, div_rem(A, G[1]), ret); + return ret; + } +}; +} // namespace GMS \ No newline at end of file diff --git a/source/Math/PrimitiveRoot.cpp b/source/Math/PrimitiveRoot.cpp new file mode 100644 index 0000000..09b1621 --- /dev/null +++ b/source/Math/PrimitiveRoot.cpp @@ -0,0 +1,23 @@ +ll primary_root(ll p) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution distrib(1, p-1); + + //distrib(gen); + vl g = po_rho(p-1); + + while(true) { + ll c = distrib(gen); + + bool ok = true; ll u = p-1; + ll b = 1; + for(auto i:g) { + if(i != b) u = p-1; + ll x = pow(c, u/i, p); + if(x == 1) ok = false; + u /= i; b = i; + } + + if(ok) return c; + } +} \ No newline at end of file diff --git a/source/Math/general_lucas.cpp b/source/Math/general_lucas.cpp new file mode 100644 index 0000000..daacd68 --- /dev/null +++ b/source/Math/general_lucas.cpp @@ -0,0 +1,56 @@ +vector euler(1000003, -1), primes; +//Generate primes and also calculate the euler number +void genprime() { + for(ll i = 2;i<=1000002;i++) { + if(euler[i]==-1) { + primes.push_back(i); + euler[i] = i-1; + for(ll j = 2*i; j<=1000002; j+=i) { + if(euler[j]==-1)euler[j] = j; + euler[j] = (euler[j]/i)*(i-1); + } + } + } +} +//Calculates x raised to the power of p % m +ll powll(ll x, ll p, ll m = 1ll<<62) +// Mod inverse +ll inverse(ll x, ll m) + +//finds (n!)_p +ll ff(ll n, ll p, ll q) +{ + ll x = 1, y = powll(p, q); + for(ll i = 2; i<=n;i++) if(i%p) + x = (x*i)%y; + return x%y; +} + +//Generalized Lucas Theorem calculates nCm mod p^q +ll lucas_pow_comb(ll n, ll m, ll p, ll q) { + ll r = n-m, x = powll(p, q); + ll e0 = 0, eq = 0; + ll mul = (p==2&&q>=3)? 1: -1; + ll cr = r, cm = m, carry = 0, cnt = 0; + while(cr||cm||carry) { + cnt++; + int rr = cr%p, rm = cm%p; + if(rr + rm + carry >= p) { + e0++; + if(cnt>=q)eq++; + } + carry = (carry+rr+rm)/p; + cr/=p; cm/=p; + } + mul = powll(p, e0)*powll(mul, eq); + ll ret = (mul % x + x) % x; + ll temp = 1; + for(ll i = 0;;i++)//This is THE line that calculates the formula { + ret = ((ret*ff((n/temp)%x, p, q)%x)%x*(inverse(ff((m/temp)%x, p, q), x)%x*inverse(ff((r/temp)%x, p, q), x)%x)%x)%x; + + if(temp>n/p && temp>m/p && temp>r/p) + break; + temp = temp*p; + } + return (ret%x+x)%x; +} \ No newline at end of file diff --git a/source/Math/math.tex b/source/Math/math.tex new file mode 100644 index 0000000..e222983 --- /dev/null +++ b/source/Math/math.tex @@ -0,0 +1,167 @@ +% Written by Anders Sjoqvist and Ulf Lundstrom, 2009 +% The main sources are: tinyKACTL, Beta and Wikipedia +\subsection{Equations} +\[ax^2+bx+c=0 \Rightarrow x = \frac{-b\pm\sqrt{b^2-4ac}}{2a}\] + +The extremum is given by $x = -b/2a$. + +\[\begin{aligned}ax+by=e\\cx+dy=f\end{aligned} +\Rightarrow +\begin{aligned}x=\dfrac{ed-bf}{ad-bc}\\y=\dfrac{af-ec}{ad-bc}\end{aligned}\] + +In general, given an equation $Ax = b$, the solution to a variable $x_i$ is given by +\[x_i = \frac{\det A_i'}{\det A} \] +where $A_i'$ is $A$ with the $i$'th column replaced by $b$. + +\subsection{Inequality} +For positive $a$, $b$, $c$, $d$ with $\frac{a}{b} < \frac{c}{d}$, $\frac{a}{b} < \frac{a+c}{b+d} < \frac{c}{d}$ hold. + +Also, for positive $a$, $b$, $c$, $d$, $\min(\frac{a}{b}, \frac{c}{d}) \leqslant \frac{a+c}{b+d} \leqslant max(\frac{a}{b}, \frac{c}{d})$. + +e.g., for two sets of disjoint vertices $A$, $B$ of $G$, + +\begin{align*} + \min \left( \frac{E(G[A])}{V(G[A])}, \frac{E(G[B])}{V(G[B])} \right) & \leqslant + \frac{E(G[A\cup B])}{V(G[A\cup B])} = \frac{E(G[A]) + E(G[B])}{V(G[A]) + V(G[B])} \\& + \leqslant \max \left( \frac{E(G[A])}{V(G[A])}, \frac{E(G[B])}{V(G[B])} \right) +\end{align*} + +(therefore, the average degree of the disjoint set is larger when we divide them.) + +\subsection{Recurrences} +If $a_n = c_1 a_{n-1} + \dots + c_k a_{n-k}$, and $r_1, \dots, r_k$ are distinct roots of $x^k - c_1 x^{k-1} - \dots - c_k$, there are $d_1, \dots, d_k$ s.t. +\[a_n = d_1r_1^n + \dots + d_kr_k^n. \] +Non-distinct roots $r$ become polynomial factors, e.g. $a_n = (d_1n + d_2)r^n$. + +% \subsection{Trigonometry} +% \begin{align*} +% \sin(v+w)&{}=\sin v\cos w+\cos v\sin w\\ +% \cos(v+w)&{}=\cos v\cos w-\sin v\sin w\\ +% \tan(v+w)&{}=\dfrac{\tan v+\tan w}{1-\tan v\tan w}\\ +% \sin v+\sin w&{}=2\sin\dfrac{v+w}{2}\cos\dfrac{v-w}{2}\\ +% \cos v+\cos w&{}=2\cos\dfrac{v+w}{2}\cos\dfrac{v-w}{2}\\ +% (V+W)\tan(v-w)/2&{}=(V-W)\tan(v+w)/2 +% \end{align*} +% where $V, W$ are lengths of sides opposite angles $v, w$. +% \begin{align*} +% a\cos x+b\sin x&=r\cos(x-\phi)\\ +% a\sin x+b\cos x&=r\sin(x+\phi) +% \end{align*} +% where $r=\sqrt{a^2+b^2}, \phi=\operatorname{atan2}(b,a)$. + +\subsection{Geometry} + +\subsubsection{Triangles} +Side lengths: $a,b,c$ + +Semiperimeter: $p=\dfrac{a+b+c}{2}$ + +Area: $A=\sqrt{p(p-a)(p-b)(p-c)}$ + +Circumradius: $R=\dfrac{abc}{4A}$ + +Inradius: $r=\dfrac{A}{p}$ + +Length of the median (divides the triangle into two equal area triangles): $m_a=\tfrac{1}{2}\sqrt{2b^2+2c^2-a^2}$ + +Length of the bisector (divides angles into two): $s_a=\sqrt{bc\left[1-\left(\dfrac{a}{b+c}\right)^2\right]}$ + +Law of sines: $\dfrac{\sin\alpha}{a}=\dfrac{\sin\beta}{b}=\dfrac{\sin\gamma}{c}=\dfrac{1}{2R}$ + +Law of cosines: $a^2=b^2+c^2-2bc\cos\alpha$ + +Law of tangents: $\dfrac{a+b}{a-b}=\dfrac{\tan\dfrac{\alpha+\beta}{2}}{\tan\dfrac{\alpha-\beta}{2}}$ + + +\subsubsection{Quadrilaterals} +With side lengths $a,b,c,d$, diagonals $e, f$, diagonals angle $\theta$, area $A$ and +magic flux $F=b^2+d^2-a^2-c^2$: + +\[ 4A = 2ef \cdot \sin\theta = F\tan\theta = \sqrt{4e^2f^2-F^2} \] + + For cyclic quadrilaterals the sum of opposite angles is $180^\circ$, +$ef = ac + bd$, and $A = \sqrt{(p-a)(p-b)(p-c)(p-d)}$. + +% \subsubsection{Spherical coordinates} +% \begin{center} +% \includegraphics[width=25mm]{source/Math/sphericalCoordinates.pdf} +% \end{center} +% \[\begin{array}{cc} +% x = r\sin\theta\cos\phi & r = \sqrt{x^2+y^2+z^2}\\ +% y = r\sin\theta\sin\phi & \theta = \textrm{acos}(z/\sqrt{x^2+y^2+z^2})\\ +% z = r\cos\theta & \phi = \textrm{atan2}(y,x) +% \end{array}\] + +\subsection{Derivatives/Integrals} +\begin{align*} + \dfrac{d}{dx}\arcsin x = \dfrac{1}{\sqrt{1-x^2}} &&& \dfrac{d}{dx}\arccos x = -\dfrac{1}{\sqrt{1-x^2}} \\ + \dfrac{d}{dx}\tan x = 1+\tan^2 x &&& \dfrac{d}{dx}\arctan x = \dfrac{1}{1+x^2} \\ + \int\tan ax = -\dfrac{\ln|\cos ax|}{a} &&& \int x\sin ax = \dfrac{\sin ax-ax \cos ax}{a^2} \\ + \int e^{-x^2} = \frac{\sqrt \pi}{2} \text{erf}(x) &&& \int xe^{ax}dx = \frac{e^{ax}}{a^2}(ax-1) +\end{align*} + +Integration by parts: +\[\int_a^bf(x)g(x)dx = [F(x)g(x)]_a^b-\int_a^bF(x)g'(x)dx\] + +\subsection{Sums} +\[ c^a + c^{a+1} + \dots + c^{b} = \frac{c^{b+1} - c^a}{c-1}, c \neq 1 \] +\begin{align*} + 1 + 2 + 3 + \dots + n &= \frac{n(n+1)}{2} \\ + 1^2 + 2^2 + 3^2 + \dots + n^2 &= \frac{n(2n+1)(n+1)}{6} \\ + 1^3 + 2^3 + 3^3 + \dots + n^3 &= \frac{n^2(n+1)^2}{4} \\ + 1^4 + 2^4 + 3^4 + \dots + n^4 &= \frac{n(n+1)(2n+1)(3n^2 + 3n - 1)}{30} \\ +\end{align*} + +\subsection{Series} +$$e^x = 1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\dots,\,(-\infty0$. +\[f(x) = \left\{ +\begin{array}{cl} +\lambda e^{-\lambda x} & x\geq0\\ +0 & x<0 +\end{array}\right.\] +\[\mu=\frac{1}{\lambda},\,\sigma^2=\frac{1}{\lambda^2}\] + +% \subsubsection{Normal distribution} +% Most real random values with mean $\mu$ and variance $\sigma^2$ are well described by $\mathcal{N}(\mu,\sigma^2),\,\sigma>0$. +% \[ f(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \] +% If $X_1 \sim \mathcal{N}(\mu_1,\sigma_1^2)$ and $X_2 \sim \mathcal{N}(\mu_2,\sigma_2^2)$ then +% \[ aX_1 + bX_2 + c \sim \mathcal{N}(\mu_1+\mu_2+c,a^2\sigma_1^2+b^2\sigma_2^2) \] \ No newline at end of file diff --git a/source/Math/sphericalCoordinates.pdf b/source/Math/sphericalCoordinates.pdf new file mode 100644 index 0000000..0c9a480 --- /dev/null +++ b/source/Math/sphericalCoordinates.pdf @@ -0,0 +1,1709 @@ +%PDF-1.4 % +1 0 obj << /Type /Catalog /Pages 2 0 R /Metadata 207 1 R >> endobj 2 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 3 0 obj << /ModDate (D:20090814202111+02'00') /CreationDate (D:20090814175526Z) /Producer (Adobe PDF library 5.00) /Creator (Adobe Illustrator 10.0) >> endobj 5 0 obj << /Type /Page /MediaBox [ 0 0 42.51953 42.51953 ] /Parent 2 0 R /PieceInfo << /Illustrator 387 1 R >> /LastModified (D:20090814202111+02'00') /ArtBox [ 0.60059 1.50391 41.80273 44.95215 ] /Group 199 1 R /TrimBox [ 0 0 42.51953 42.51953 ] /Thumb 200 1 R /Contents 202 1 R /Resources << /XObject << /Fm0 63 1 R /Fm1 69 1 R /Fm2 75 1 R /Fm3 81 1 R /Fm4 87 1 R /Fm5 93 1 R /Fm6 100 1 R /Fm7 107 1 R /Fm8 114 1 R /Fm9 121 1 R /Fm10 128 1 R /Fm11 136 1 R /Fm12 143 1 R /Fm13 150 1 R /Fm14 157 1 R /Fm15 167 1 R /Fm16 174 1 R /Fm17 181 1 R /Fm18 188 1 R /Fm19 195 1 R >> /ExtGState << /GS0 66 1 R /GS1 178 1 R >> /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /Font << /TT0 162 1 R >> /ProcSet [ /PDF /Text ] >> >> endobj 7 1 obj << /Length 1240 >> stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 10.0 +%%AI8_CreatorVersion: 10.0 +%%For: (Ulf Lundstr\766m) (BIOX) +%%Title: (C:\\Documents and Settings\\Ulf\\My Documents\\LEdProjects\\sphericalCoordinates.pdf) +%%CreationDate: 8/14/2009 8:21 PM +%%BoundingBox: 0 1 42 45 +%%HiResBoundingBox: 0.6006 1.5039 41.8027 44.9521 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 6.0 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKProcessColor: 1 1 1 1 ([Registration]) +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 21.5 21.0195 21.5 21.0195 +%AI3_TileBox: 12 12 264 528 +%AI3_DocumentPreview: None +%AI5_ArtSize: 42.5197 42.5197 +%AI5_RulerUnits: 1 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -66 56.5195 12 1658 860 26 1 1 11 83 0 0 1 1 1 0 +%AI5_OpenViewLayers: 7 +%%PageOrigin:12 12 +%%AI3_PaperRect:-12 528 267 -12 +%%AI3_Margin:12 -12 -12 12 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 0 +%%EndComments +endstream endobj 8 1 obj << /Length 10544 >> stream +%%BoundingBox: 0 1 42 45 +%%HiResBoundingBox: 0.6006 1.5039 41.8027 44.9521 +%AI7_Thumbnail: 124 128 8 +%%BeginData: 9902 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD23FF52FD06FF5227522752 +%7DFD6EFF27F827FD04FFA8277D527D27FD6EFF7DF8F8F852FFFFFFA8FFFF +%FF7DFD6EFFA8F8F8F827F87DFD05FF52FD6EFFA827F87DF8A82727A8FFFF +%FF52FD6FFF52F87D7DF87DA8F827FFFF52FFFFFFA8FD6CFF7D7DFFA8F8A8 +%FFA87DFF52A87DA87D7DFD6FFF7DF87DFFFFFF52FD05F8A8FD6FFFA8F8A8 +%FD73FF7DA8527D5227F8F8F827F852527D7DA8FD67FFA87D2727FD06F827 +%27F827FD09F85252A8FD5FFF7D27F8F8F827277D7D52F8F87DFF7DF87DFF +%A87D27F8F8275252FD04F8277DA8FD58FF7D27F8F827527DFFFFFF7D27F8 +%277DFFFFA8F8A8FD04FFA852F8277DFFA8A85227F8F8277DA8FD52FF7D52 +%F8F8F852A8FD05FF7DF8F87DFD04FF7DF87DFD06FFA8F8F852FD04FFA852 +%27F8F827A8FD4EFFA827F8F852A8FD09FF52FD06FFA8F8A8FD08FF27F852 +%FD06FFA85227F8277DFD4AFF7D27F82752FD13FF7DF87DFD09FF27F827FD +%07FFA87DF8F8F87DFD46FFA827F8F87DFD15FFA8F8A8FD0AFF52F852FD09 +%FF7D27F852A8FD42FFA852F8F852FD0BFFA8FD0BFF7DF87DFD0BFF27F87D +%FD0AFF7DF8F827FD40FFA827F852A8FD0BFF7DF87DFD0AFFA8F8A8FD0CFF +%2727A8FD0BFF27F8F8A8FD3DFF52F8F8A8FD0CFFA8F8F8FD0BFF7DF87DFD +%0CFFA8F827FD0CFF7D27F852A8FD3AFF27F827FD0EFF52F8A8FD0BFFA8F8 +%A8FD0DFF7DF87DFD0DFF52F827A8FD37FFA8F8F852FD0EFF7DF852FD0CFF +%7DF87DFD0EFF27F8FD0EFF7DF8277DFD35FFA8F827A8FD0FFFF827FD0DFF +%A8F8A8FD0EFFA8F827FD0FFF27F87DFD33FF7DF827A8FD10FFA87DFD0DFF +%7DF87DFD0FFF52F87DFD0FFF27F827FD31FF52F827A8FD20FFA8F8A8FD10 +%FFF827FD10FF27F852FD2FFF52F852A8FD21FF7DF87DFD10FF52F85252FD +%0FFF27F827FD2DFF7DF852FD23FFA8F8A8FD10FF52FD04F8FD0FFF52F852 +%FD2BFF7DF827FD24FF7DF87DFD0FFFA8FD05F852FD0FFF27F87DFD29FFA8 +%F827FD13FF2752FD10FFA8F8A8FD0FFF7DFD05F87DFD10FF27F87DFD27FF +%A8F8F8A8FD12FFA8F87DFD10FF7DF87DFD0FFF7DFD05F87DFD11FFF827A8 +%FD26FF2727A8FD13FF5227FD11FFA8F8A8FD10FFFD04F827FD13FFF827FD +%25FF27F87DFD13FFA8F827FD11FF7DF87DFD0FFF52F8F827F827FD13FFA8 +%F852FD23FF7DF852FD14FF7DF87DFD11FFA8F8A8FD0FFF27F852FF52F8FD +%14FF7DF87DFD21FFA827F8FD15FF52F8FD12FF7DF87DFD0EFF52F8F8A8FF +%A8F852FD14FF27F8A8FD20FF52F8A8FD29FFA8F8A8FD05FF7D277DFF5252 +%FFFFFFF8F852FFFFFFF827FD14FFA8F827FD1FFFA8F852FD2AFF7DF87DFD +%05FFA8F8A852F852FFFF27F8F8FD04FF52F8FD15FF52F87DFD1EFF2727A8 +%FD2AFFA8F8A8FD05FF7DF87DFFA8A8FFA8F8F87DFD04FF7DF87DFD15FF27 +%27A8FD1CFF52F87DFD2BFF7DF87DFD05FF27277DFD04FF27F827FD06FFF8 +%52FD15FF7DF87DFD1CFF2727FD2CFFA8F8A8FD05FF2752FD04FF7DF8F8A8 +%FD06FF52F8FD16FF52F8FD1BFF7DF8A8FD16FF5227FD14FF7DF87DFD04FF +%A8F8A8FD04FFF8F827FD07FF52F8A8FD15FF7DF852FD1AFFF827FD17FF52 +%F8FD14FFA8F8A8FD04FF5252FD04FF52F8F8FD08FFA8F87DFD16FF2727A8 +%FD18FF7DF87DFD17FFF827FD14FF7DF87DFD04FF2752FFFFFFA8F8F87DFD +%09FFF852FD16FFA8F87DFD18FF2727FD17FFA8F852FD14FFA8F8A8FD09FF +%52F827FD0AFF2727FD17FF27F8FD17FFA8F87DFD17FFA8F8A8FD14FF7DF8 +%7DFD08FF7DF8F87DFD0AFF52F8FD17FF7DF87DFD16FF52F8A8FD17FF52F8 +%FD15FFA8F8A8FD08FF27F827FD0BFF7DF8A8FD17FFF852FD16FF2727FD18 +%FFA87DFD15FF7DF87DFD07FF52F8F8A8FD0BFFA8F87DFD17FF52F8FD15FF +%A8F87DFD2FFFA8F8A8FD07FF27F852FD0DFFF852FD17FF7DF87DFD14FF27 +%F8FD29FFA87DA87DA8FFFF7DF87DA87DA87DA87D52F8F8A8FD0DFFF827FD +%18FFF852FD14FF2727FD1DFFA8A87D7D7DFD05FFFD06F852FFFFA8F8A827 +%FD07F852FFFFFFF8272752527DFD05FF27F8FD18FF52F8FD13FFA8F87DFD +%1BFF52FD05F827FD05FF7D527D7DA87DA8FFFF7DF8F8527DA87DA8F8F8F8 +%FFFFFFA8272727F8F8F8FD05FF52F87DFD17FF7DF87DFD12FF7DF8A8FD12 +%FFA85252F8FFFFFF7DFFA87D7DA8A8FD10FFA8F852F827FFFF7DF8F87DFF +%FFF8F8FD0BFF7DFD04F8277DFD14FFF87DFD04FF27277DFFFFA8F8FD07FF +%52F8FD10FFA8FD05F852FFFF52F8FD16FF7DF87D7DF827FF27F827FFFFF8 +%FFFFF8FD0AFF7DF8527D272752FD05FFA8FD0EFF2727FD05FF2752FFFFA8 +%277DFD06FFF852FD11FF2752A8FD05FF52F8FD16FFA8F8A8FF7DF852F8F8 +%7DFFF8FFFFFFF8FD0AFFA8F8A8FD09FFF8F852A8FD0BFF52F8FD05FF7D27 +%FFFFFF52FD06FFA8F852FD09FF522752FD0DFF2727FD16FF7DF87DFFFF27 +%F8F827FFFFF8FFFFFFF8FD0AFFA8F852FD09FF5227F8F8F852FD09FF7DF8 +%A8FD04FF52F8FFFFA87DFD06FFA8F8A8FD06FF7D52F8F8277DFD0DFF2727 +%FD16FFA8F8A8FFFF27F8F8FFFFF8FD04FFF8FD0BFFF87DFD0CFF7D5227FD +%09FFA8F87DFD04FFA8F8FFFF7DFD07FF52F8A8FD05FF52F8F852A8FD0FFF +%F852FD16FF7DF87DFFA8F8F87DFFFFF8FD04FFF8FD0BFFF852FD19FFF87D +%FD04FF7DF8A87DA8FD07FF7DF8FD07FF7DFD12FF2752FD16FFA8F8A8FF52 +%F827A8FFA8F8527D5227F8FD0BFFF852FD14FFF8A8FFFFFF2752FD04FFA8 +%F87D7DFD08FF2727FD32FF7DF87D7DF8F87DFFFFF8F8FFFFFFF8F8FD0BFF +%2727FD13FF7D27F827A8FF2727FD05FFF87DFD09FF5227FF7DFD30FFA8F8 +%A8F8F827FFFFFFF8A8FFFFFFF8FD0CFF2752FD15FF52F827A85227FD05FF +%52FD0AFFF852F8F8A8FD2FFF7DF852F8F8A8FFFFFFF8FD04FFF8FD0CFF27 +%27FD16FF7DF82752F8FD04FF52FF527DFD08FFF8F8F87DFD30FFA8F827F8 +%52FD04FFF8FFFFFFF8FD0DFF2727FD17FFA87D7DF8FF277D7DFFFF52F87D +%FD07FFF8F852FD31FF7DF8F8F8A8FD05FFF8FFF8FD0EFF2727FD19FF52F8 +%FF5252FFFFFFA827F852FD06FFF8F8FD19FFA852A8FD16FF7DF8F852FD17 +%A82727FD19A852F8FD08A852F852FD05FFF852FD19FFA8F8A8FD16FF27FD +%42F852FD04FFF852FD19FF7DF87DFD14FFA8F8F82727F8277DA87DA8A8A8 +%7DA8A8A87DA8A8A87DA8A8A87DA8A8A82727A8A87DA8A8A87DA8A8A87DA8 +%A8A87DA8A8A87DA8A8A87DA8A852F8A8A8A87DA8A8A87D27F852FD05FFF8 +%27FD19FFA8F8A8FD13FF7DF8F87DFFFF7DF8F827A8FD13FF2727FD19FF52 +%F8FD06FFA827F852FD06FFF8F8A8FD18FFA8F87DFD11FFA827F852FD06FF +%F8F8F87DFD12FF2727FD19FF27F8FD06FF52F8A8FD07FFF8F827FD18FFA8 +%F8A8FD10FF52F8F87DFD07FF52A827F8277DFD10FF2727FD18FF52F8F8FD +%06FF7D7DFD08FF2727F827FD17FFA827A8FD0FFF27FD06F8FD0427FD07F8 +%27A8FD0EFF2727FD17FF52F827F8FD10FF27277DF8F8A8FD25FFA8F8F827 +%A8527D5252FD0427527D527D7DFF52F8F852A8FD0CFF2727FD15FFA827F8 +%522727FD10FF52F8FF7D27F87DFD23FF52F827A8FD0AFFF8FD07FF52F827 +%52FD0BFF2752FD14FF5227F87DFF2727FD10FF52F8FFFFA827F8277DFD1F +%FF7D27F852A8FD08FFF8FFFFF8FFF8FD06FFA827F8F8A8FD09FFF852FD12 +%FFA827F8F8A8FFFFF87DFD10FFA8F8A8FFFFFFA8F8F8F87DA8FD1BFF52F8 +%F8A8FD09FFF8FD06FFF8FD07FF7D27F827A8FD07FFF87DFD10FF7D27F827 +%7DFFFFFFA8F87DFD10FFA8F87DFD05FF7D27F8F8277DFD17FFA8F8F827FD +%0BFFF8FD06FFF8FD08FFA87DF8F852FD06FFF852FD0DFFA852F8F8F87DA8 +%FD04FFA8F8A8FD11FFF87DFD07FFA852F8F82752A8FD0BFF7D52FD06FF7D +%F8277DFD0BFFF8FFFFFFF8FFFFFFF8FD0BFF27F8F87DFFFFFFA8F8A8FD0A +%FF7D5227F8F8527DFD07FF52F8FD12FF2727FD09FFA87D27F8F8F8277DA8 +%FD07FF2727FD04FFA827F827A8FD0CFFF8FFFFFFF8FFFFF8F8FD0CFF7D27 +%F8277DFF7DF87DFD06FFA85252F8F8F8277DA8FD09FF2727FD12FF52F8FD +%0DFF7D5227F8F8F827527DA8FFFF7DF8FFFFFF7D27F87DFD0EFFF8FD06FF +%F8FD0FFF7DF8F8527DF8FFFFFF7D7D2727F8F8F8527DFD0DFFF852FD12FF +%7DF8A8FD0FFFA87D52FD05F82727F87DA827F8F8A8FD10FFF8FFFFFFF87D +%FD12FF27F8F8F827FD04F827277DA8FD0FFF7DF87DFD13FFF852FD14FFA8 +%525227FD06F827527D52A8A8A8FD0DFFF8FD0CFFA8A87D7D52522727FD05 +%F827277DA8FD14FF7DF8FD14FF2727FD18FFA8F8F8F827522727FD09F8FD +%0827522752FD0827FD09F827277D52A82727FD18FFF827FD14FF7DF8A8FD +%16FFA827F827A8FD06FFA87DA8527D527DFD0827F8F8F8FD0727527D527D +%7DA8A8FD08FFF852FD17FFA8F87DFD14FFA8F852FD15FF52F8F87DFD2FFF +%A8F87DFD17FF52F8FD16FF2727FD14FF27F827FD31FF7DF8A8FD17FFF827 +%FD16FF7DF87DFD11FF7DF8F852FD32FF7DF8FD17FF7DF87DFD17FF2727FD +%0FFFA852F8277DFD33FF2727FD17FF52F8FD18FF52F8A8FD0DFF7D27F852 +%A8FD34FFF827FD16FFA8F852FD19FFF852FD0CFF52F8F8A8FD07FF2727FD +%2DFFF87DFD16FF52F8A8FD19FF52F8FD0AFFA8F8F827FD09FF52F8FD2CFF +%7DF8A8FD15FFA8F827FD1AFFA8F852FD08FF7DF8277DFD0AFF7DF8A8FD2B +%FF52F8FD16FF52F8FD1CFF27F87DFD05FFA827F827A8FD0BFFA8F852FD2B +%FFF852FD15FFA8F852FD1DFFF852FD04FF7D27F87DFD0EFF2727FD2AFFA8 +%F87DFD15FF27F8A8FD1DFF7DF87DFFFF27F8F8A8FD0FFF52F8FD2AFF7DF8 +%A8FD14FF7DF852FD1FFF27F8A8F8F852FD3DFF2727FD14FFA82727FD20FF +%7DF8F8F87DFD3DFFA8F852FD14FF52F8A8FD1FFFA827F8F87DFD3EFF7DF8 +%A8FD13FFA8F87DFD1FFF5227F87D2727A8FD3DFFF827FD14FFF827A8FD18 +%FFF87DFD04FF27F827A8FFA8F827FD3CFFA8F852FD13FF27F8A8FD18FFA8 +%F87DFFFF7DF8F852FD04FF7DF852FD13FFA8F8A8FD25FF52F8A8FD12FF27 +%F87DFD19FF7DF8FFFF52F827A8FD06FF7DF852FD12FFA8F852FD25FFF852 +%FD12FF52F852FD1AFF52F87D27F852A8FD08FF52F87DFD12FF27F8A8FD23 +%FF7DF87DFD11FF7DF827FD1BFF27F8F8F8A8FFFFFF7D2727A8FF5227A827 +%F87DFD11FFA8F87DFD23FF27F8FD11FF7DF827FD1CFFFD06F852FFFFA8F8 +%7D527D52FFA827F87DFD11FF27F8FD22FF7DF87DFD10FF7DF827FD1DFF7D +%527D527D52A8FFFFFF5227A8FD05FF27F8A8FD10FF7DF87DFD21FF2727FD +%10FF7DF827FD28FF7DF8FD06FFA827F852FD10FFA8FD21FF7DF87DFD0FFF +%52F827FD29FF7DF8A8FD07FF52F852FD31FF27F8FD0FFF52F827FD29FFA8 +%7D2752FD08FF52F827A8FD2EFF52F87DFD0EFF27F827FD28FFA8FF7DFF52 +%527DFD08FFA8F8277DFD2CFFA8F852FD0DFFA8F8F87DFD28FF52F827FFFF +%A8F87DFD09FFA827F827FD0EFFA87DFD1BFFF827A8FD0BFFA852F827A8FD +%2AFF7DFD04FFA8FD0CFF52F8F8A8FD0CFF27F87DFD19FF52F87DFD0BFF7D +%27F852A8FD3EFF7D27F827A8FD0BFFF8F87DFD17FF52F827FD0BFF27F8F8 +%A8FD42FF7DF8F852FD0AFFA8F827FD16FF7DF827FD09FFA852F8F852FD46 +%FF52F8F852A8FD08FF7DF827A8FD13FF7DF8F8FD09FF52F8F852A8FD48FF +%A852F8F827A8FD07FF7DF8FD13FF7DF827FD07FFA852F8F827A8FD4CFFA8 +%2727F82752A8FD18FF27F8F8FD05FFA87DF8F8F852A8FD51FF7D27F8F827 +%52A8FD13FFA827F852FFFFFFA87D27F8F8277DFD56FFA87D27F8F8F82752 +%7DA8FFFF52527DFD07FF7D27F8277D7D5227F8F8F8277DA8FD5CFFA85227 +%FD05F827F8F8F82727522727F8F8F827FD04F827527DFD64FF7D7D525227 +%27FD09F827277D7DA8FD39FFFF +%%EndData +endstream endobj 9 1 obj << /Filter [ /FlateDecode ] /Length 10 1 R >> stream +HVo  ambKdyP_״v{)g$y9?v/KJ=`̌MInNT<%>ĭ]&gU5t}cBSԙ|%mW6j^Pz"@19.~e_iWI6;}_=ߟycZ\Ϳ_nu^Me;O!+";uC"Wsp_W%W\^nwT ^H|z*]? 929 uMմ݊įyMgX']UUNVBn6y yUoZ +?deMapQgރq9|6l)p^O]k\&o6 `"IS>TݖI!&~O.錖0؏q{93&:& oJpf 2 [VX&5$~4;/0`)&|™F.hj=7SN`Jwu@ /?o +]_of*7.gGۼ}=|S )dNkc&[]6?wO \[ܜOpI$ %[@7YEh`2gpxٖe2I=\[^CͯN= VdP6mYeu_r xJYz,.fci5Fnqm(Ym+m~c} +Lκپ6IoʺA=`/靗Wj5  g-+`l&͡s/M7@ʦuV-_v61b kk]U%YzGR/Cނ>ՓcdvQ& ;WͧWxGNۗlp;Րjۍp_zp"ߚxM-qCru;[ +`M]@/>-"ZÈpdF?&+)6xTÃ,,,Tf2 2ϼe4s,M$(Ui4HES?RM$M$ND%ar$"቟x KhYIQ0q~,eQ%QEHFA$"Fp}L*QR*PBq+O1Efa&aF +PA(Bd*H*JQRH.}I&t,H$(PA D?HE"b %B! _x *G'<W<\p}q)wOďW~K?}|S2//"Oy>z'<1n;%,fS,dL0|1(siFSИFTѐJPA9G|tNq#±]k.w),!!jMzM~ǎIZXړ],ti E0%7;npK`.O`-X/ncA@€a@@aA` @ aB*!dfS,z( N!EPVEp^B  `lGt#?&&5CB-b˲\v Ɣ\4e[83X:NnѲL)MdXn9nISܰ!}vhwjG~v3[[;f]FK]hdKQGj]r={%u;3qc+o"(`))))6R±1suw@w OY8WN)I[u/2Bd1Sl+V,֬Z[[SB D}mN`}%Mޑ# Nwx_^0Xa\z$(oCm ؛(E$y1dA;绗JRUWwӃn->97iVRnME=ZFwa>~GS:5hJH7K!ǣv|$3ŎdT7 M:NG3(Fz̐c"OUgę ] մqMO[*s3 =b x+xU#yr5y)hɧ$%&L'6ʝ¦2jºа6H=-kea:=8(㭔lkV@()x4j:o2x@yQ||R! &PܡD )YGZ$R@W+_Z9{$TG=:j tOKŭ ʎmǻԦ;zVuO9ryγz\vviPemTY|֊<=*pj+aVT{."(ϽVkuV*[tՆڴQ1(eWCz~Kw^Y0w\D츅={l+us$L^ ܔQ-G0YWV^l0Z.'cRX_N%h<mi80v*~zu6/C3[R;+r7u/ }aɃn_YV7B7My*mPyJnIwAkMZNF~O)ĩ2T7UM:)1%?eOo4nt1e2\O%\fO3oqOTcUުg=O6aiI?&b%?mړ9韞xwj&𧺨|R";`fAoM1+,ʏ3C0>y;?p׍k{91O ;[]>}~c'Xuf 9>߈q ﬜sM.V9[G%bs}^>ۧ_}Oח]8a0 pƮPϒ8"TJ="TJ="TJ="T5@#;ű1V\YJ%)S!"^WJ$r酅t#حp>@qU< +DvP_ED*ᡎtPIDLbP6覆v觅KS QUV q5X+:롵I2М硿 va-F@tЦ>δP{528 +ڭn3< +P=JHWܳpGd# pȇGFr!+=mȎC~<2pj,t9$#eI됶\Y!) Hb44yx:D#QkOG,Av-aDRiHZ}/__}oO~=?m~EPw>P8[KRw>e/+8ḌygiPN-; xq1O..Þ]^/Ydeee +/ + V !()-xZ)Eff>QX:T^ {([@~߭㺦Я׽>^㏴_C׸3Wbx7VZ=Tu [ԕJm3;E ZlNox4:]yVȫ2}| ;G#2e!=t|yDo *u5@@-Tt),1ȭ_{/ +< Ο >lJd=dሪXq;hc[@%_Kao3r0+h!9#(CWKf'nBa3 &Y.'t턐d^3܄eP$GWNxeBF3a$ I]B#T}!,";4M[~uэi[9s\+\xd pB4 (!JH%*I@¨( +! *PBܣ .Cʰ[qj(e"\k,,dXvdځ32V޷' =VB QXw8T)ʪb3Нl +y! wZ +y +j!٤vlexs!R7BvHD.QvC]7 6BElz'RC޷'dpR'}rQŗQ'X^['=3K=瞼rKۊZj>>)ɰFϞ~|}=.}_wO_~;ǿ_O~=n7xcXbCL-]fGUǺƕuQR1V_Y/Ė1N̶kԵ(;>w<\HoʃΤ Et7Myd*q08TşKR0/تv]Ec7}@ŝ*MT Aśw: L?UqKLȮ׷(=00 =XA9jE+N#ItE#03H&aPюO٢b:0l~˵Z/צK|6]+tM[/צK|L*ensIsk9{ y<<x^,]k&TDq)6\T/VW4kAkȊ%]P8s/8>,E_O8G}0 >=἗}yoؒ[nyɱP1ArTlU-^@A8a2 q-utz--vzTዊW\yPYͷx{+yPqa"hŨ~lNTUecYx~6&D!Ajd=iHP8A#Aj[SL'24muwJÉC0IGf݇uԻE%Y0 -j]~jiuVn[С]gj.mk;?Hm[UjW͒B3:]P>/v/>v׏<>uoػY:vԎ|%h6QRujn&7r7[pӕ he* gy+a9\Vi5`9YX~aVK;L .- +ng |k]8Kf3Lm`l s{JٮW5v5S/? +^.\\\":X'.u8UTe|z(~7!$A΋e1` dsoHٲ==nMw{l$U~3/70USyidUw #a@$i2ܤ M!>wxbe h yp\4&yHPo3$'N*jl*,5KVh[*o_b@R=q֡ҍ'ZLݛ;u{[HکWn[Xݳ F:vwujLk&$џџџџ?d'\Nw 6`J;|No9bBO|ƌt4٘&禘(9^ݯ~UMkε?|zk~=RO???u[p<콋вsO)ھVj+]mڶlmŷf*l bK978tZ6yylg9"Z0DWqf2H=c3j Xv:mG-wI݄1: {/h#c[CD0!0) 6C "dLxnfNsLb *#n<1[57kv]24(VJ%OL՚%_Ivrvچ_%.J5k&\TfT)Ϊ '˙10=\|oO]ӾyMpRDECcڪqݮeVPm27||T##![¾)KV7C)=Vr+nǃewb7|Ĺւ&pk5np#g} LdKnjFV`iTfȍ'1Ӳ9n3r+iHB Z%7W"~=bǺ?uM׽Nk0Ϙvci/6sR R͏g'DvFڟ1 fhpSepOWlN7 e/RAj0ڄ<3J' rQJ@R3Lt hl4UƑ1aKx<0:ƌıC  +BD#$ JL' %A%a%¥a A3l&-VTV+XNJVtD۷`H?RpHꓜ{s!۔ݞ4|CҒ1%裋68c5GUQ~˲/nBMW Z">İ|p;5SAzρ ki ^f> ꛙ4$ì|&a@C̀L*_`#=2if:I + +ugMdZni$D7ݙ-Ц힐n ZS?ԉEWLf$U>E:MDyZnħQ={;߿Ͽv+7[Lr?;-B\hd016BJj"uUUիnK!λW"D|ym!+gܫ7E4:iS/WoѫCRչ&K5/ SBun "t$@!T!h!x!!Y@ tqCF4%sHap,B_$1xHl"1bfk&lө3I.6˰f MY:k*\#WOEokcr*jhJBD;n76RgBDqR͍ 7_BDwC~!bzDv_'Do#&O շUQ~!} _=>.y 7>LWN#F#:@ca_D^[DZDXDVSSSϬDd43"f C䢘Nzϔ139!Hܽ[Q "_uqF]}1`5ɛ>jwn- ( V\5:e!Rm5zg3nX݁zmA?RL!M&@- yD˶$SL1}tFuTQz LUB +1!.`(y0sz އJvD@ʈLasB DT%Jt(!l&pOO,XY3 `"䕨f&D*XiX ;2Y22 L5L] 6,':"+b7 +h<|ϲkv! *$[\{xc[:6/>G`=^15I\Iį]'v%݉G)Jg"悙 3oDӓ/g$*>jƂی@Ȉ 5#QpG,b1m۲[cTqB5o3>Re<u~7ܡ}\`.P 0QLsvLmdX&)Ȏ džDdrฝ<ߘ>#=9*,gMMv-O>G}<,![7eUPFw{4p35*c@_u LqNO=e07zeXK0D;/CM~ndcOei*ʺQƸ߯c_i ^7nfmqm?^8^Ql_ /??8=Y4C=80! hR~w7LV#OtR3932b1L\]adb !2*  9=)$$SL@2C[&{%;֝c9PxwjR\}U]YV- o<^__}e[/'¿wWGT_.󎊿Ucp1çA1?8u9o~ᇿ%)>zSUvQyȓ\Vi7&`*q4?UYuP} +5sj vO:[\3ɉ?FZHp SbwRla2kLۘk](30hi̚G/9`G8ϕFd[)W˘s'K%U51)Ԃ3i7Q]ʬU4)ˬڐe26XaרeLY^tE85y.<\-co+AʬU̫eMusbe<=5bM.oh8 +1sjl5^=Wr5u\cy&K(hw"C̚\5X龴TPogo޾ jƤ Z[UsJ/կ:%w?kCh?畗x5o֜A5bǍ:gyvn=xuaɚZWg7h?ZMSSDzF ԴՍQ#iytSV4=(f>b؂(bm]d{a +̴ӍՄMQnõJk  d*Go0*aئ1*,֝ř|vv/U()gHS8#q `uz$Of4j<-9KV'Wu7^D7DWvj,q0qZ5?jmdNvכ&xz[XƄNw1&,uj[b ` +TU^j, N +^Rk,\:W  LF6 h +6:d{Bd /޼xj*pL}%b,ª>"՘\r[AɝޖP5r]ZmGVKQ8BzuOKLz}.b,hPNY-~By7h ͮ#BpĢ03ьƒޏZsTL#p]ړVՔJ*mEZuQaH1L&ƵjhREt1ZP.4)tZ=CD]oA Be@w{0P&Ug,;=f9eY*JT`;e㋷o~$8+ḐzXKQItBIh6DnNgZIk, g*q1ArLO3u*˔mrFc.BPvzRP죉r)J;8dє}~"˷Wd6WW>:^_? ]N`z{CygWWy;/?7ȹ:G1uvpכ iǙ 'Ol ȖTZ`1"IC1E endstream endobj 10 1 obj 13988 endobj 11 1 obj << /Filter [ /FlateDecode ] /Length 12 1 R >> stream +HWێ}GydvYdYn0>UYS3,mYF]}*3"2%7psAQ{;1{L%+hq5:U1{6?<}wGo_mχ_ǧ۞C?7|sd|dÝ>}5z3OC~f8Gݰ+'PҮz1f=j؅ڍZ~`EfFT`ooܯJonL$gCƈm& 8'pO:Z7`H >y#d=87*Bgh3`,-5U<l &;N83j0fY1hwPĻn c}hR,Գ1SrǠ, +mףYw=(-u_3{ߠf{.dS]/ ޗѤ:^N: .%l3Ւ(ۺvėk|x-${ 9ԯdNo/2 +- ?9>nG O]fH[}R@mRȾ}$7(ex|Ep"*G黅C߭y0vD74W3v]&,_Tp7]*1\8O"b0O!;oϡ7'{~~sz<nnn,nTɿ$B5 ó5?@? nu?{|=rd`?ja=7IJKUI5w2xJOIȈȗ=pd9 IW[߿ѿ:vVoCB1z>AW,N}ԟBn67ʹu}"EL UsIJjqm +8q/DPV)ØȢM }yl2ׄ7U^@*W,ņjU&{PHsBϪE&P@:ŖfBn n[L6vO>ܕ2Uf2wD4ʙrL1Z/@MzKH/ݱqkBהV\1i"tbDl a`1Hՠ(o_FZi*[ :XH,Et [v*?ĵm [K9z3ŁCf_dBb)S2 v!z5UUy[2 ɪO~yuJ_Lxjűȗy>=uw{piThe#D%9v. 314z*WJx?zy#[^ln}δʳ[IΕ &p+)KㅵpXpM72RTƾhEs kEqh*/RvptKS9Lݻw^{|KQ4đCP/Sm.O9 3K][ Q@Lrn'7,!x.;%P!q-dJp +Sʊ bQf~9`uH+X}c03\vXym2N4ö~o*":72( bR"[iG IG^kzZ匰XdRbM١E#`>8/̿QCvɉNLcQ<*GI8Zj<C 2eeMC4t' +s`cRIexmRs)>Vٰè3sqiY05ʤ$YT\E +8ڒtHF :jҷޥ䴍&M^cPlf`;ɲX(G~/ZhTRxz3i(? K) +9j;TbLiQU؂)e1JxR\ yV椪th\B]D-n5h +' Iy&2ٲ62E"s:\i.ψ+>- 7MR]%\80.W0RNZ4-F `.Dqܥy$; % N,7G7aU R +31_nCn7&uA"$ DI9Mr1-7Eg;*h\8bg2vbR$iIT1 yPS5ElJEdhcA<ȤY(r\,Rq43_z SV`u;B6hzIbCkb*$GqWqLu9ry/q@Q$I4h?vrW8[lYc8T8srH^0ЇD  d3Kj{դ׵t qw+ ᓤvO` BS8> . {Kϸ|Lb v\"Izb4,M|c`F&we x_Mٰx PU| 8+6?j(GJpdMClmT,yd r+`령4r=KUٴF VwrX0 ePtK:Z+b*.@`XQ \ta>!]q'`}Vq^]-oF(זy 5Zwr_-64L +jXGF}y8I\mbj.^jIp:X]5XRҳ<@RpvSr("T0g `g"*L8FC[R,.^t>BjeE3[E)^DG}t#3kZ9a$odmϮYeq>CJK3N*AQ=]ATIheQU B`qt^&:[r˳YHk+t(D2-4L Eˤ%qWk~Sa(CnwdVj+vԓ@42s?sG78s!pY&/ݯSnˬ5i0fϣz<ܓ8r$>]B*?PF2\SQZn:G62~#z7q/rwJŜe< %N|5"(GXXg)qrд} -@,:58ABcN2nVV)6`ՠ˃qdvҗ}6rа?lBϘ%%@|.,KJ32@:*u7p+c'Rl;8^4#pFy a+`}B=-'l#=\^Gѹ&\^gBVSKt)K *<-Hw#G:9첂j;d}VKx> %d:$9 ͳ58U20y 5 Էf<ʀn>O8}YO\B\fNJʸ_'҈=x-"nl$\iT:p-1b\u Ɍ[N rP\5kOc9Hf6԰A6x1:޶DɇYIV ,'$(ה{qӘ?w?W.}χı;Jsf;;"䗋/X8\C: l,>;+?s?3qɧew]͍yq  +ϭuBEUǨ\^FM̰@4WyPs<#]X@$MM)u0OܱbEfqAigxͥBۃ^F~i3ⳕaCmr~D~7cu2Z\e;V@䠻nTlJsH8oWO\MtP}8&S+W0M|Aj9<mjk^?k;TaNAܙ7++]b.|zs/kjVjLn?ot 0[sbVswBKuruMjj⺥@窹 - )X\T?:9?QVdf@78o2@=DMn}g+5nuOP×:8KZ׸PY>UyC]9&%hKnaykxH~ΨE8SpJԜ9E-]IhP:3ql"nш"7t'KZ\[4=߱?E|HPKDKDPN]݉@V:XEPbkdU"#M!lj.1@a+gjl')I\ n}4cٟt:} W@+VzT3lY4KRCyrkVcnӵ9WK=L=.v&Q̂a $As5uq٢qVKm\=\CcKr,fLׂe|\TrN k(%az\: +d*k:RҞRՌ6߷=0[!e[п:B ֱXY1mLv.Ԇ`S\S h!sO97P!ms)8OO2)K:G-t>zss+>:' ;)=L>z&X!]ʶ w}eCgN:I$ U@ؚl"lqweO+xLa\CPTYiڪ}}I}aGI:l (Q8kbSIuS< &”3n1^7XyYx9xSHWl&+zV h$6QX74Lj`#D?>?/_럿y &7o~wvn+e 6w.*J &>'dA#\{E%Wc!'=}Rr$TW:X6< U=Yar+4PY^U45/w- z\g3݁_#ufa5ƴt;vKeFeڃZ%^[M';e׮G7bvb==|">\kΎ{&,uqmI| N%4PfiHތn5ԴG\ xxA5ǙbQv:3(˿xq8G2]l-;#w\6Yh +GX5#N3X:#աv + ]`=nt+ԝ= ޼AO}i`dңsp0Y*jy7 Yɚ{J^PZ3]LNClqL6wVwSM-w%.EةBɐ#<wad}q°:P;Hx5#'}s^F+;CFVBύ|[*UM ^5^%zGt/xyX&e DB"95t{h!Un NZ 4DkjIֹicY<jH9)Eu]z@U₳`CdN'H2ug*[;TYsf%5|Zb%&u`JS`L>8rSҝCjQiVwqb.F*Q؛ST +X4^3%:*27ޞT+2Apcv/պ8bbY}`.`W rjOb3 "jB%TD ȱ aOk:cH<NjU)%]!o ɖ%ҋ$,wOђ^}+NƆ|xc[(I(iRS-ǺbT@H>-\K"PN}LWc\R8tkds^uOj5ㅒ*f.,ؠId,А$hAmi1?taO^/# =zȬ݃ ~U]Вjj:J,jDw X0CsNqM; 2sF.Z"tKv͞T\v0[- +'+2#hTNU[cX;Ŧ|xhJAp-vT6Z*M5h='V2VRzE)|P$YIL]B+r+ln; `Wcm@#=)~ee) Cjըz3!=Y~UN }b^5j.C9YFYEPxS6_kle9Mü^$VQ +Rv\z5S|?/?w?~ן~zG<#wG7~!{+xCӓ7?o;zF>J/pd:n&|r?* ZO&xqAKXAB²ġHDަζx f"Gbos[R{L[+ l(Vi2$=])oP⢥Aj];n'c%h"#4 vPkkL]*yQę&vH9ZWf7z FN}iA5q)PYo b$e IK_ &{-Hr\qL#Lш[J0bTщnQ{|`tm*<8+kε +Ѿ-oh;뮏RX7uM +`a(M/c^X2fc Ij"bXP4 =l9KBN4h(Ѣ J5 aEvHXo0Nݸmgs;ŗ?cP-̶CۡU\yd9[ar4hp v-\⌐ZG:HrЏE~̲5x.Y :b<dyLjB "Å"G™}ZO$P. ƺd2ٖL'{ۗe6]eiš#ui4^桖rMf]ܮ xxK {XMv$WUlX7ʌYP\̣AXX.oMPXNZ#-DHʦ}ʺ9׮/}n-_qˎua3ʰEOwtmjε}˜[b\w5x-uV_:a%3q#'4IQJf +hƸ̞ P~|ccKt=Ha=>7vM<$wLj[셒La-ջB}۞k/7=^Ж﷛aEnq@M"Q'fȗ Ha\$uF!ց4-VcLF[W?S,(\bT)f)˧<6EUwj챫s@ڗ,MF/ɇw|FΚ_2/k_z.>< ŕƒK87|9j! N\>9=mm +SgvҨ^)f e)ZL94kqsn[캬^Zk*w ocnjZ]%20Q" ]%ō+guj u oBPj*':i+H"Cb9Cٮ%w=ZzUSET!Z8g3f{Z79ɸX4_撪c-1\<-1 +:JM dD"t;a*]e{ICR!Fk#j6QaV,OGXM,bY٤Ln\i9 +i7[#&?/w$ty90MHH<}%!*p HBې:eK_$K%dʶ]/u3F2m"xPO:qku0M|P +&Z4P񌨜xf +$UJN)£z%guyӕlZ  \e +]D ͌cl0@l-݂VA58ɾYIUGsgQ=\1xx (w?ÂljSΜ]UIoNC4/X(E3$r.d?5l߳XqX+Uբ9wH58^o:ŠCUlL71^jԖS K/9xE N*>T;{9r5mѤm;zJzU.DUTj\H#Nέ!Rm#[w~o_~ooz۟W흹~|{f{oQ{ßGh?;/#QgKeS!S5'|cKp?߈襆vM_oMOF 쯬|?0\j|2)&;x#wx+^=_1J)T&@ 0c%4qA4ӓbY)ͫ)j 5$yBgGڲ^D+ǡ@+ݜ_z{4/}bG vnlǎZ+7G=Au"u*ɋXT MKc&K%,XmY+"idnڹG8{m$ޒH=L;\&>ȇMJ,ڑRD7Td!ZSv`Re"U!_ @ [ר 5*˹T2j#Kgӧ R[&rZJ *oT] +wzarÇX+:(19Xɕ\\lی5_\9xr >'gHuqšYlƐU7Wg& " ڿJ\eZEzuei @zvN^phPLxLx,Ĭz. -ؽZxbMrCCGFlY?͍8C6wilܩ,*7(YmUjyZn5fo5 J7j*{ &V5Mc2v'opr.@Ax-wPOuh b,C3ަ}CϏjcE#<:qF~;T>O~~!֧vF{JwɲxfSpݍa\!XKW`3,!6B`kt޲6]I9r^Qkg%rC6=AIb_+O?_Vhk/85UZ%g1t5)Ms4_%pnCCŔ޻p_/ +GF=IWC# -^Y#rͶf3&Y6\Rrm0L +~RyKxA8 O*elJ$`.ģm- 6/2v]='fT nYk{b#:",5Ƶjoìn*wpq7ɣK(3aa%u=PT[:M¿byCNPt5pKmTWVMI>bot6PR9ƪۮ]6!lTf^ǶDX"Ԍqez+7z8(]Aj_0xEEjLCJlf}3؃{Cr,Pq=ʜFŦ[}=Lnac͖)hq,~2)X{8" fR梕L<1|;@]i1DV1:c(r +>V؇JDDZp-IkrKѺrl>og+4Xob}*= wO|B_&hJ+*uƼ93n}ܸ#&n<)HܵU8S(N3*sOYv*:ik"?5s)ejtҜuFj_b.aj/wž92A΢Y3z$ +J1]nF@qu&=ejIjt5A0H]68$%#b:xf4r I% Y " :əV_#ր~GX()?_4zuwy /w` ]Qaom"U9\Sźj+.[:v|qK;02C1PVG~3-#o@1(f(Ph]9oUqqX,!ʸjnxc fp;P]絷-D@Kƣ4u BZA#߄kd0 +B1(bk 7\<L`.^dηhi`>Zp/`/NQEsI3NP%sv˃Y|T#Bۅoӷ{8R[t?V|] ܂s|k尿5/8j1Պ,[m)8Rmc]jnkBVɳ}tRljk[0#ڳ92xyuq3RmN٢Ӛ+XrIv?1g8,[7k5Ŵ-\|ҡp"N'݊sm#y):}/Adoę2X;쨏MqXsbsÒvox0 +e|q*x|qs!If$ +CU\Y#\Pm .LlEWebH"NҎߒGt@=sԼC2+iņhii |6am84Y8\ 62gɝh Ō)5ioˑ;w(!γ౓.|o,a@r .N愥 5i24\;oa:g{ɲb@ +`8g 7_Ѫ{vݶLfK޻GKFý:~I "Yg%0[&vh떱mϕ)P{jC}B+0vl-6Z r0ulJb⒆ MGkzVD֐ݴRMf*)5^h^EEUQ x;J"V9??PV|kÉYe]<D3{X0|_A:"h(Kƨ8]eͧ ΋cRQ\#zzHHѽٸ1 ·z^Zw$5Z鴊|_&R+zzԔBP]PhPZ2`Xic,S!z㹣gccx4$0ŋ)ԺK,r@tmVԶ_qӛ??7ÏoOͻ}>o~zN7^}1~ϧr釿ӏ8OF${1])EP({+>!;GCX)AI?,60zL5狜d`#&S'2oy25U} $2kGSlE# ugX;e0S* +=$Y@>V0.ja6 94\sƠ +40TB@b:}z4V*$~v 9 RB@<(q-)XXb` ibFWQf+=AmcVFI;;Յ +.gM@ PDf!1 z/>9ADI#d C첹VbwtM#Q,@ۊ3@(06~`G8K6NCf5Jnb7l$ZmgWVfi9"ў\_)G15sP7OoP消EWv)0+Շ5FeG%rxg.OXsFŲi*(1C$vB LhR$`Z @F0K t轫ga*4+HD)'z$!9qL) I{Ji'H|hY4vz8@ endstream endobj 12 1 obj 17185 endobj 13 1 obj << /Filter [ /FlateDecode ] /Length 14 1 R >> stream +HtWK^ ?M`fKT*3M C !vt&sT`uU*=No~i4tp GXRA9C?Ya:m;6lW`_qTh^is?E;fB\2θTqS _ܼs6rp!i8#Gؘntl3}yvMmst LLA[vvz_}"0^60$^{U9a=nF;6v^Af-lW#;Ř֚ykd͌ u&RգЂMMh碥y_AtNifGOz*x; 4V:@UgBJi<А>^EQV5fa[l^V$A-*\;mk8"2*q;L0. St [D?a:0u7:s '#']WsP1 >nnAv: kx#ATwEՖxReroմ`(1F$ IW@{(=+"=%!s Xy|:pQ3ӎo܉kHɮ c65jĥi&nX;0qK|:NPƉ24"'T KS~ sh=yF;1aT85J^㤩ӹsl۸; ?Iw|9 d2{jTNd'}w92iK?dQ(m's<(O=㫯|xӫ'&D~;ZӀvK_^O??ᇗ7)w//?x7>fKmO`??=,9!}K|mt6:?}jӧ~~!?׶vfC]>C1uq9`ڏ~&<0'0lxB6im+e {Sk{ Hx6`a4 +t`n1Ő4e2Sxß{6jSy<%u 3Y&(22@*8s}BNqXz9ƙ5|uAM85U4FN1z:=`Veo +U 6 S96Z P=3TACq)M.܈eAf) Z8"-:-l:{l{b>O#6Js#/}D=l-t$58s,ViVG !l]dcPv^ˆ .\vИx+ lyN;&W`ga&gT3nLnC4B,&^+z1A$z3 +A٭@G`I[jA}i.#NUWgF0!4`نMmkI\.ySWXU/d~5xkƢ8յPk(UHaƛm7U+{(f) + ˁhN1o3ƈh-xS&cC!p_Fht[:X86v7᧠nUc9lی984e*d<gq^pe(9xWqmt|RyҨtz/J'Kr,eH˸%XrW:~`"K2F LZ^4yް;^A_dZGaCLd~Ԃ?ZC-p$OTܕ RKpx6PHjNyJmof%m̹v'%IäUdfIje %?c%k| rvz pÚx}oL˰颗>YÅsK̩aiOWln$Pׁ; UzJ&|+5u ޏ m5!G \WOA:iiSX.][ WKYJ{*+a*=-ݵu+uz"%ӢI&k7jw]O0ՒLhs^ +F-u{|[\e[wN"qzo^Qp;$\A뵑kUNQn)QЇO% CnۻucPrQ/5vBU v]X*l+7q{F·:tz8ph1}<%u.K˱uUٿl#ij8Ѻ`kb~_x950"_mVĄ>K)'qVJی p9# l%.=0 +noйxdoeXgcݶDXl{!i#kǵx^=?RX86/AwPnֽ;;U^E:cj\sg6QyxeF~w]!]f56?v\ @.eio.ۃ0?j!cOKMywső[Y/ +2SN\ggyzO}zem^hRn[#?ɷ2d3KŤN} ,RtA2 o]L$#kt+J +9Jлfw7'BfL ԕkT؝ +A_ + M.^rȣ#ާ5|r,v(|_tz%mNW7~%"az-59<#?CH/=dMKF_Ρ4Cy`CW<ˆVX!h%l QiLWǕgW/G:7xpYɽ*w{O_ !bϸ,/Urg Ϸ18M`y)A<[^䁙0 +ac\Oe/!}7UqMW{}$x \dywnA*vC-zrUM^6" \=H/{}b~=|>vV +V PbJ2LB2KTy>3ͱΌISiXTYH@-9{|g^>A^UWa2s wh1JڔFbuT6x}51$}jƚwJ"p@dw1g[S;?7떰oTPn02qv~xIt{W ˙qe`T:eƘ Gn9{[]O,cG[OZQoT2xJ.}$^]]x'_\@RLkE2o^U5 IFazx6Xk+?2PjTKO"ZƠvPJix08i]s)^Gylƫ3UFˋ_4bδ1Xe"X*U"}ڑ^RW#$0l,K>FXGi*B1cRi@娹=2Yx|h`|Tϵ){Ⱥc%5>vgϹڑ?ws{yvN>.(7Y {s'Ή*\%x#=: H+, :GTEXdPkpoK-LPV܊O%7AP\RmK ̳VB$92fNyemj)l 0uu'S8(owƆRr%dsF +jH=t+${;D]6hJ]^pXS7@!:6d`&(g=M k o+8a]WٗncȆݗWoA({1cggߊyj{9Q ~K *w 0}gf +YUMC<MU,9*SFWyٍ0Rݙ1@+y.3vPXZJs  ?hl+4p͙G5znOߣؗ%/cylGp dUlQkuL ++biG&?גK^: H{bWýkS7m |rNsd61ӗ> +sB;i[Bo1 +=Nb*/)YzňmvS@+PT\qLc.p&pja湡:x |K 3qe$Ȅ6VcJ?\v)gsp-)Vm +weKG}em'3a -J#8Ymݤ~B!D[t!@C/-u?͵&wXe=<.]x 2f՜ܑZ3dPbb*I\L w2sD*f/p⛳fv9Y0yxZ'i阺{~`ސbNdex{Re3e;ֳ`뙚Wi*/4h4|=W<YG^fΐʛvZi +w@v.Kc /k7 [^˻Ѿ8kIj!:SKP>h-_3*V|srzre)uS쭯! 绞WqJ!E#!#PaP@yq +A~->p'W9G9uNpG.X'ga{>4kd㫑/sy,0&KПv;ٖjmz7ÖJ1ҌDVxi{]WXXH׶7vih鯯 EP]bbxS[+Г_ o1ju=#4š콈E zmEcm]/֋6 >ڱqŻGY f~>ionU8cC<}l)3"{ܲY9@i-/BZNQsrD;n)F|쭵aJnyK{gK˴!8Le4 +ݴWڴVZgV/Hatv8V#99Tʩ)+/ {EdBtB:v5u-WZ C` 4ÕxN;aYp7Xd-=V!XE?`+z1*TK_FvV~P#>[pl3YR;X&TXVkᦈ0, +g_pJ `kҲhv-Ck _Xlp1et3Fs[LX`W'Δ'B[nLOeK-Tjg %v8وxf~l[\9ν0mҮ$ЗW8</~ir"Xn}Mx:l#eKѕn)p.cimb.NeXTskX'y|OV_;|Dn-|E +kk޾N&\ +UF$rwenOu)k⢪z4 V)5T `+&&=<{<~B!wGn$"L4w0wฏ?a!<)d>'ZD}X:g`.K `2 +k8z@Tߒq\Z"qy + .x>̈́%ϵ|Hr 5|)X{ZZS.O<۪K;?Y/G2$إ)2qrX/zj֬YEq-R ~[I&3ZVgeˎ~V''to1v5k?WI1ϖ,ᵏ?\aM1M)'|E{褖x̿e2 +awŚDC +'7&A"(Kary9Z?*[C6G!X> V|Ygi Kp_/sKttf26DYN>?3%>Ļ?T5 pYTྚSKo +{Y];Ȼ@b"e`e)IEp$39xVU=s@='](@#@,wWn +v!YyDHuV| k͒L4S %t6a ʮl$8nj)M!t=N9é5:SV bRALbŠڵיm9;kVb=Le)DH*tK +\3`q7tƓ"hvN":=f m=RB /@|jFn]S`ik'š[r@E|XK' +؏"6؁6S!=NYCW#_?~nTz5 q~~2 \zQ^loϑ'3||s!k.|n +9ہS'g1-HT:y2G8 +e3Npƪ 9+>QYt7o2|v0qoZC]v;7gN!S7|p" dCWJZh:Oyyuѽ`÷ ؛ߏ=d`$EI`fؘz{?A@[]uT55Ozln!$]'BW *>%0Hmp`|^M%Q46צZaxJU#<<9 /a&^R<-ځ_vNڜ 5iKØVV +6*`VFfMtۺ0l!GM$4vOʢf¦f|N +ё=srp:2i>{ig:™4HٔHQ}]L drrˑC)لb}r~*>RtY&MN/ S'hX8(17PLK-. +860 &օi*>대ZܣLv3`mI T=uc5hZUom"bQUtEV#ؔěKJ #3l!H1XGWy l'BRnsJhԽ>ȓ%9cMg DVeXc!s:Nb>$֏+j{}ϳ!t/9ױrCv d~%qІR95b eU5#t(oeR%}+3Y!U.Y1 c:Ê piM& < SNF f]B ښxrlr^^bq>D͇ ΰ$BƊV *rggYuU x6 +pmXgzr ǝ4?:zo|{w yz~zzW#|߾}_?ϟz{zϟn>|K>\O? دt퇿'goPKo40q3ih#y$zwyo ;HH'o7Ц[ +jUQ0"f?ڕ90G r^ P8Hh(}#A3ɦ!x(X@Z<(8xx>S1b̅TAÆS>^Yȧ̮ */1rm~$!xW +`&&+,8{ 0HlB +YmSJ3bfx]|[JZISb"8)W1- Y8*'އ2H$(6jRp^b ͦۃ1\)lnFvdMD˞X̓6xҫWXxlQ(X!T% @Ҟm'+ALn'Fhp>la E-XJoҀȊʂX*Z6{P5oJ4gO ҽỌ,B/%Rt2.zl8Qr]%^xű6^A(8C&_CzoFC(ѷŃTar7X3IZ }5])SP}~MV9='{3c/P pe+XԚ%LG]83Qb6ȇQ-l*c[Bz&MP+![,HDt`ٓj}D6#zDvxN870t~T>%Cɹ(Xl\MgX0M'/;})6m<_n,У Q0`s,Ձ ]iԣx +\^npАcJq0sP\Q׫G?=}Ӗ óHK}c#p'V91hթiUEw{ A $ď躂 K,O[V)dQi? yW +,}Kgۜoce+n^8[.gUXJ.x5oG麠6FB x5Ve C%X(ŋ 4QŪWL}Dfg[x@LNcT?dnݖZE{>1pXXM=Bx)GH!>Z|;g>xUmP +جaKNL+8% q|:hP.{ݢHk17Bty 0Ҫ4NtvcdY;isbz >y0O^Ih"˂}\ |!A/ (.>GѸWsE֧gH@mQQw1.%eN@W:3;5+#>[LSJ1'v0$QG30ߗѷ[K7=Oަ]KS,eip2ڐee6Jf%o Bx3ߤS W} cӗ}%q#BKt &׋]> RZj;Ckx{"}8tV,a;[ܭ\M>'X'XHk(|z'hJEp[Ư.x#6P.C 7) +Rɤtx[3S>h״IpF:tH0,:ZL Bwxۜ,g%IVvǖLj^cs<=r]lr//šmפ D/}fNOu) w3iӒ6jOxSfciӖ* Ͱ8(O#OU*Jᅴ !3E$8l_?Ŵ#hX60InɤY\iŞQe`kuڳŲsxZyS}<(;i?xE3~}GX^*׶ҺX7}bnT05N["iB#Qu[~I<8&?úd|beȓNr|πS- +:p'~s7lv^R{LX$E}p OLM1]]w#DS#7Xv qfk#R d|  {o%ib|؍'zLeg8Yd?Ufv|ܑ$?l'tKc`*/$ K+Έ@gns[Sj 6V&HV5hm6?,.֋E8x c1P.#/!5 ('yP)ޞ ~DrAJb-o n_dd2RX24jHAl;r<??Ƿv?Яyk6j5uW~{7K_`~;vW Rϣ~q_1|cv[AӮӫߛ&>x;ܥi7 +W5ćCw|'v)XxG߬g [l[NeL a>TR,/Y}|9_ٹ&ye<2`iu|]jxm鄦v7p3xbh0;[W(tIM-AJohd&T':cM'.6PX&J9}ս}wKnd+}hqiI15b$nL3sf^KOShq挧 ѽznTgpN& ;/=lK?ǟywrl](V\`xZX+wuL'H+^T +L-GSݷu,,6eHnd_=Зgsek ]WFߥrbQPԂֶWnQzV,]AAt+b?i{Oc{m3' ܉Dl*nCI 2Ȥr5 X +EISo8,4|h`L.Kfִ1':053 JFgUF'>BS5jң +6K: +ؖGnX96${'ug+g0ޕGI=jx4%{9 `Ra(lg1̙9|W;|Q}B +ɃAczy(8$TnTgx8aaA(J! h=",qO!`>AT-T$c!qؔũrJiHG+q&}f-UABƂ.hKXQn LN c҃{804R:pp7 +Q&(边ǯh +2x`k9?p 1>e5ޑ5XGT=XEiw"agXG%`y9 䥂omz=x'NfFh xhQ5W5oI1J0,V'2eԙRWʯ~Wwyw[o~ +tj~vowo~:<}է~{~G_}O5Sl-L +]( Dj!6^5@UTH8r 2@$#1 'oI28u8i}ţw"fI~ +ݽ/db$gGqG=l:A`hWNUh kke`XKX D}ڤwM+v9a`Bo[u/Ji! +*{0] gjq5b^ܱzt27TCdQrk5&&xԀ4CM妳ªR8 +R8[s屿njk 5*ͨƅL1tG5V)K` R5_N'mfY +]- +˨ŕ"&=+9 -KB#Vh5I5-%B$CnvPuX 0 bJ\'[vXPC 䚠._@W2)yDG9bI3NjxpEͶ*1vavW b1n!vaFVWf?8uZ{g +YV=s?L۲e{9E-- "w10:{nJ`9Y#3Et5'ΑBZ`%r4-d 2 g)k D#{s8Y< f@00уerBb3+&[aп ÚNl9-'k +_3ja2wи9HfIis|+`^ 9#L);+*bM1JbzB@rpA2!}Ѝ} MahH#Tk|- ̑Jm9i%_Y׷w.zKϻ}~/?Ӈo?O{z7cy7~¹٩[=l/7xaphmT<8qi͈e|y|;=,.ӌDz3P[tP%> +XAA9`ZkxvdKǸwOEqw cFV)Rnb1256n/F{} j":<(Fɴ^|9(KĄ́lcK9-\+ed;]/F)5b#*{Ecd6b;}okit_*H-kޗc+c>7r dC|tmtY*FW n516#Sc^K)Kl ~~3H3{?:# 3PlLlbt3(gF&x|! R Æ}45g +c 7"l;g p2Qx=8dls>J1x\2̘=ce0N.uRMϾrYG S>"!{-G_-,VcnpF㲁8hȧPSMMW`A-|Rܥe]Ap].uDt%ᦱh0`k +g:F )KMS8wirYN%p5Cm1@霠^aL`>/$hɌltj,؄cքR%6h\<n5Vp<鵑4!6f.p7hIZP8#ϋLkZ¹tAJݽŘ5G_TG{:ч}0` +z(4sK#\`)w=aReb34":6K^K!g@\]{8?|C-hZ97)(fOD}#ĆYbo6JC6|da|0?ZBM#rb=mPRD2 0C/s#0qJZψ| O{Ҁk,Sb=vp:khFiP>#u5fx% keZʄ0W8&{ܗ[ 4x>y%3m NQe_+m3s]!#Kè_B\YL+xmAPoCYN6.#'K8J'!RHSUy<d놹p+{U+l-@ȻUאk/M"zX +B_LlaԙP&AH\ҫέ?'A.1 MAs1+K Zx SJ&ecu+P J4}@4(&HdWlV IШ ~uF^@q4c !`JrZz>&' I1;+?}4A7/mu^j.z]!d*:yD\kK2sےk{aIoP&ZԺ_8!*/!1/6a6}~G-к=^7%kH`sIը`I h Q5C)ľzƼF~rVNh$m?zz$>e~"! +&e~Lt8fqH#Q&Le{8YJOɖnkpcL*eq6JZ+1?]Z^d*,rs6P\H!&ϔ +Ad1:GoXmWNj^(m@GI2B{V2 &ރ?'.n)>4w]W|| +ډAlfwZ4=@BW5P4%phIC<< v:E(Q5?/i?_|6Rk׺HfƗk݃nD>Ga'H qXq?[˴.WKGObq4udHpOEyEw.}m/-^uAHM%5㰝*@bM#nJ 4gwG qbGgG/KkV(5fR~0=/vZb$؏lY %5qoor9U{ujG{`m`7^5ޝ?G8Obv4sY`I{vV}K/4u9Szy'k".,/7yjQcءԶ)D7P퐬 (t0ߣ8ҙU -bJ]"sAOEd \c\дMJSYImkVZ{R!0-)z0\oΰ]wDt8c}A +7JC]ٞ`(|~+?7]5b#X[j<-AHRʝ6;x +pd6$vsK,rY% 붋fIa`x'XDF̵OJG/Կ*k{f]쉨v`58K7? +Ҩ endstream endobj 14 1 obj 20821 endobj 15 1 obj << /Filter [ /FlateDecode ] /Length 16 1 R >> stream +HWK- ;l'OBO =V! $N4H^k?Hkͷ螯Qޅ p,*YWanZm .ֱ>~$,oUkƬ]Ua}x-Q[]h27Y&fG`۲%~9ߏ=914(/vy{Wr1ܐ+ KY: S}5)\*I~5;Bl =;wc,Lƪm܀ ~>2vvFṽK^Zg..Y%C| +wV" mGA-x|?R_F]"6hVIF۾-X'S47C\3tgQ>,^(jJDmsJ^1 W0 ;`W̽`8+Vջ+͓4~RÙ6°hQS۸)`7\V#oq]҇mW9y ,;:锩e4n]`#_1 _?A7Ӻ?Y2;A<$ܠ dJ /20/spLc8.r4<+0*1϶:KvWY60rr!k|v\ `]a/G 07U'ca`n|s`˹>P{MgG~sYeE0W5¦٣ +wt:Iejc.ДU{:Dⴌ䊻D#N 7{+YAg{4M}ptRU̫8 +;<~H_f`zO໵K:P/?VʚRM9Lvǚg!܊@Nit,d{eP[Y +o63䘷G 8U ?Z MGvˏRj֜#_Z a+Z"h\G僷| +q#/ET&>->}݉-W-=%Y$LJ P_4R\qV=aE 5{ߤs,ZH~PuUΨ~ )&}X2 AÜM|\jgN4įkvSZXr}9Z*kRx14t[ll}`!vA g{T3}.ഏ@yesUo-iu>7 +wK7f̭,4XN]W +49(04R,GpH Gzǚ𐨹/I5Yr<ˏF9 ^=i~,0:CyTA~MþhĚ5F=0Z0I}S[mJK! ; M,씤ƼF +嶀^OXp?'v΂#QT +ȍ*݇Y|.q lL0Վ&jn渪é^y-yUyTXJGO pw}_JHi=N~?wG uo3LEGh w5~mR6Q F27)ɣa-IձiQ wJ)x]qg8w9r{9k~a2 i\r´jLC iP +l~(%6)+| ibUxP(u?`JxU&ǩu`A?}J7w3*SL$;nɩW=j/"gr}YAq|cc1,X?+{GVFtKbhI0ŕ`) S񏲀MKq0n̿{2Or]tmCQl#PbHW9d;0cWyd3zѼXKUgSj@R-O fS :%2jhGWGq i˔'uW -IڎR _~ESΰ>3&[:'r0vH`ϺpҹJ5u +Ԭ]q1 F#5Nrvuq@@P˭&_nA+*5XU,Flr7*F,aji n,zidNxЎYg{$>^{x5GaK +E9z8S>ɟk3xR{aki'[+?o娷Ticfgg!fB񽪔|d wM@v2[O ;WYZz |nzʱQYZf + g<\SōWQl(BںJ#B8KTQ7қ{IE?Q ǮȺ!KIqW:Ԏok#_>7H-}2 j:;2ϫf}о5|%+ AiQxI޿5L 5WS=}~,lr> #/K CB"4:xQ[ajma)zG= ɵ---'Ym=ꭶVL2wSJ~C)qmhvّӗ ,PwrGMfzpCG`sic G|7v*i[j4%ylg0r m@}́ZOrxPv`*4rQK-$p,ťLcSpHE5`Pi9Ɣ`γWbӪ| wou6P] d"{gZ6 YSxc/Ջow hAJaV 4w4[>Q8粉MZ!C@Z*RU#QZL42dH٥>!e74 %,./w7Q1IK^3[=٥ɳY _8RMFxHY ;e _SX,\Ak_bpl_35'V6.@ +ܭ sbb'V#"{4>@%6"X䒗;kFzm56s(kj[*3E=}] آ &vBaPsԺc`'LYkmۯB3JpyّaKĐ'R +oy:[m:[6T;-f;crJ` +"rN#e4" tr=vs#Ɨ쇽s8/&,Q}$@;d7NT|VI uĚX[d:дՍ }he[dR;(|"fX7{w5i;+!EV5'|)O/|VIM G}4V<#8}xM<%p Xy Z*V +_~Xb3KԵuh9;Qb +  ,ϑHG$D37c*,d59d¹ju0,'Ew-X]Sk,SFlh,G};cN~cλX \FHMoK,Z +gyuQm![bdKiNeXS GL> +ux2<} crׅ9[NYvPyG֑`:Ƨ=%߈:=,ٓjn]qrTS5}6Lp20%ȼ{aNݷ.<XIĺǴ .^X'7:g m4)QCIW=x8i7o‹Gyn1?pJuo\P=X?I8h49{mRܺFUNU%Fb]Jsg,$U@,dQD}"ЦAr$9kpƒ;l.2LTFP=޷=Ȏ`M*ɓpk:s.N5,1"4C|LD)8_j, vmRtž[p7j7˦$'-Pn膂nue04ŨXK4 +AbC@GuaU2N.<LܺTR~ؖmJvmw-;<˷]ooO?ˇ^-??Lk~oէO{|7_/.q_b|$(ށ?]i.msGs?~ h@pޫeGۆJm@EJY*EEۀ1Ysн=Bo<3,^"vzD3p𐆁w t--`G-f04=1@' 1'9{͍])9dXX[?m Iʁ7M8hЉd-`#&L}Ccj +d +2rk>ݭͰ9755u/^ݫ*1 ؄gd45? +PkbT A8%`˰xlѶƚ270#@Sa9~(o,@8XǏ!3 +jv3`%ٖnSGXNz];Ȍ DImz(O<G_fA0nF?%}?uС9mqe Tfȧyf.ke#6W@ϳ[qXv1|h[ L{/Ϗr}f} b]|~ywjۚx8=CتaKSQs撥V22PQh%*z2RP.)1Eo{S7Ou5ٯh7Kb=yP}}yx[d)h3aSi_s{G~|,k[Fo U!9)>drp |ٹC͍ٯK/}X&^I5ǵ϶ꜰG'M}oϕ AćkxM>_ˎ]-Y Ai[G21u +W(N8FlcZ$&ڈt2B4PktYQq|.C :#^gQDT:Ʌid!,Rbqn+Sڒ=Sb r}Jx`zxV͇UuX K64h୬ӷ\si/S hv模MM\篺)>_rT2Vߌ f3/E֕-F).!|yGN^MHju6/RL? X5-?y%:l%f?tDmct@zЦEp9[ii vJ:nhx4 e4.T}XI+ꮆh X4fVҡzZx[ɐ#L87#fyoXɛǢBui~8fwxVJ"<:Hi}ɝw$%ޕ5 RٵP#?P?ޏhh <JcKl+J \jU΅[]'?zw] +ho ~E뮄b&QbV<&'XUK.ipp&ܷ} k`03>w6%J +Y`HX&+&q*I(nN/[Mwbf&3jurRS\CU(X)*Ze4X)fuQ=OV*c%Fq1r`sQjt?Ȟ'a{okѭkʴi([cR/wَxa1րk +|9d#DM Ue.iUK7wI͢csd69CM2E3pd(vt>dVK_Zm{ߎqHe'<>EI8ĹL1MS^駧K) sݖiI@&1!9X7q$jߍ%$!Ns;R?FJѼ/}a,R=vzڼjKLW,1{)cfی\\xw4댑JybPrgM%ܤ&jv@zvtcg@ `d~9 _qBH}O{#m*s}o̹e3.Vo><]WGPE".Biu)hŎ]u1yX +u_D:!b-io#/-cXr!(؄kwŭގz#ãBEvF0kK@jBz*Up a1w \ S + `ff׊2n9K3+#6VB>dg= 2#+ [$MWIHvDC)QHz E.ʯڰ"R w6"40PBJɗ[ۼ;`U +ksy[i'"uGCIg딞Z϶@r)sµyWmuxi 6Ķ |t%k +-9EjwQ 4U9mǂgoESMݲj8(xkьtE4)(D1jYz1{ŋD2 ,hئ{z>^̲sX-[{T1|UJ/|gmYsO|nC\=ZX <]cBA@D2gߧ-ǔjJY׹|8bOׁ{XV c`0fd) +b=@5`;EoSVÜ`i}3t四s2_ւ3Z[_kP}P} sfJq2YUW5 YT~ uWLޙ[ܥVõϩ~q\r|;7'h04M|(-s!+ߞ?DEϓ[ձ5`u48΁v|{~|=VW!O1roG{e++xE}Wbj\ +oBm}_p?|=N|dOñ6wCqs +L-?LPB5 S8\Or5ykv=G(=|4u0A |I.ԑD +f  gP}e)*>N>i\$n/ +h y`Kl`Y`+u,r8#t (=. !u\C5beU"|˕W,{@\Gm,&6(4?HV +A^p]} +U-yb*P}JO% U ;? yʎ7p7 6 I}JYL :!؞~ǦɿS%왅 AWoM6lE?֒,~o;YOϾC:Wlߝ~_=w{hc~q{}IW|=vX߀}^/a{#y[ +Z!y'FKV~XG +DPdpO(F9@aNc8uN]]CUac|Wr7&UT WIT +^ bJx) +⥪eK敏!p&ReE!(`g™k2EYA²^/Aj1Ң`FaP-cX0dL&c^P{E&Z3(44rwr,#ZlqV+Mآ 5 FD~5]8T Նd0uq؛+j&fƢXkxjZ;K|l=#*MĚ5Xb>(,%XHll )k5V>@9wZw( ,.,Js*LxgS'X +`H}FsH٪)h`jp HYx-lwszCK>Rn97Wj1RlMp`.9+X{‚^} T]JקSΣEŝU1hQ%Z2 s7k0wZ5$d֥Kjbj2L2ez3ER,Yوv5hjiT͘ݛ0 |EPw6m-6Em +*nBm +̦J}^LgZqscpQJq97qbpcu<:lB {m ꥶԘ` Բ``b +rg٪$o{v Q1{&J(TLڪ@tpVaŠo +D*V h:̡.]8ym'5`!6 W!V"a ].8XWdӂM J wI")*HEAؿ<wAg;Dٛ Һu&/lM|A6+iOJB0  <'$zU`!3Dq4$%:6km9CxЦhѲݢ45)S1x+J6LW+Ɵ+UBхC{ #)-va>BKwM2,ss|0ð^,tT:؅_p"p o3^' ?/ʃRC1l8։29Yq s>u%DOű, nӐ?^i܄1Ühu '#'P3q,5)79RFm f|!\R 놃"& llX+HH.W|ٺ9eY1UCp@CCzIh וbQ==@GR2?=zЩ:k/K-GbVhsb.&,ޟ4v}) +:;'W3h+ +9h$ /al#Z +G9f/C)IӞYhZ\'lڤ8Զaz=ݛ;-᭲wKe p-hQq_T,4 1}4[,{7ͬdtׁ-SGbz&ALyXhL Dw]ڼZk=[,{j10FŔ0]ԨAdT#Y4lFY-V<#'T r-BOs]\FJref }Ljz%CnK댋^x lg#^ +8,*ܒ;67%kciL1 QY9ל= _2mb!Q5caڱqj @H~@0k@Φh~m9Ji4rX#Al[,Ar_,%3<Dg𘮁 yuU jT0Kj,MKwGhJԏw_60AA5S:Zr,Pyl;Aέ1-I@y6,諂!Q2BAuu@xN$Ly Մ%. ~.F_iV3*-g_X礪2/od)[2?a@?__~pO^}ӻo}wyzw^ȟ9"GQ6ZȜRZb/P2[1#`d76-,>ll'ϨjH$`HAV$$JtH5vp CE`% :u3,c#FRL<)3˒y[asZj}иYs.,(Ö`s1b|(.P hDN(ռ%&u6HuIsiySrԴrt׫0I(aKo6J19&cg;~@لp~ Nj5)aS'e] G}j*Ƥ'Hp1uє-C% q^J`Dq˟c!Ņ<5 J0&xˡ3jŒtvB:^4QdS'pA΍cS:NL"-Q9Imz1ki]dzcuP%)/(8tm=CCRť9nrʾ aVgGUH`f'~1/$Pv 줶/_щc^>տ2p{ǰQr^YƥR. wCii$ _n1ݏ{vj\8rRrnpOꭃ(k@ df3w%A[ZJJo#ϱI F |G^_Ny|k\EʉՙӱkdfMbӊĔ~~pO=G +.3*&Lwln@=5h*_O޴!oZHaDqxųIϴL}w:,+}յu_p_2$I0/,QlEZYEsνwټl鮪RL&U)/a:SG! +5ƮPu/mrh=掃#]{K5ӥ)o/Yg)^`gBo`g v5a$0z$.KEl4}A?@1xy B>ٿ~uq'r_kZA7PE@Ʒ8ķݯv]0s^A0i_Q%g㇫as80U=<vU +m|ݱ5|O{r{Wp8~c#y̨g{U+%|rQlXO?)PaC8R@bw#'Q vW$XO=@9$Sb橪Gw[գUg`i7r)G>s։7{qÏqԡKMo{E]W11lC8 J|& "` VK ~[#H{&Y uId +6|{\WDXg"VXx p+{ezHi:ZJhaƬ$qy]j +*G zTzOy*(ZdĹƵRmҨ.˯@\EZ U#6&t[GvnBV ;رzL6=Pp^}jQq^9jω*o/^rq"ZZqۑ3y|""эIgr2tM#@V^EԳ-] X}K~jssXY?zcD"|x.hpzG^^@1 aB&IE +%! jx#1hq'Ԣ%czf06e%G7V(c-:

M?O_?}=˳?! u^}ïg/^'8b@VnPfPg@Ѩv4;gM]눩LF1d36b +0I$%%J|\JsFϦ^FN{%ԻER)|`OMgؘF-8PHXN?:Нnmm Dptes8*'1#uaN"Ǩk{6zg8 tM``#= x]uu:Fd-Fﳩ`6^9Lf+nca{s7Jry)xCnn*tTvDx"*.OQ5 ȳj?؋%[;[V|FW@Asbڋ=-K3U͚XбVWurzB-NzOӊ@>, 66K ģkli5F awuI,&m)0Q)ki)O^3 T FVv +*2Me 1d.F'ݫlf s9m,uiAtYW#08f^zEw ;Rk*nJٰ᫷}7ȫJ,6/VX3ZY_|ڬqzHOF|詙$<4_6n#f_~2`*T"2Eh8ؕh5쫊Țm`$+F` ZI,llvs~x/,7 endstream endobj 16 1 obj 19552 endobj 17 1 obj << /Filter [ /FlateDecode ] /Length 18 1 R >> stream +HWk.a$N>IlH#8 "}{;W/{ FqMu=N44HeXœkbw 5c58J d~8eCTs:Gz!G_yy'W|鏻72 ӗ^>vu'O^] ߞ`?a*O{̬YsU 39L.KcIK6ED1$v%೟QH^8EؕKNva&.R,9tbG[hǒQta2Fמgd0:2 x cR}L29G%Y56ـP6,ρ YEW'75C8rCjC (ۛWb$ϩ/ǯ5ܯvxqN8|M`hF!s:wVfjs a9r?E&I3tDc_K4 K5Ԝ9c3Wr/NO\CnZ.i24J+`5CEpL"rPE +:RkF& R5q($7+ԥk%BBiUX+&,0ACiYQ +ܪCA9PDŽQG 0)M"/VnVi 5aa3 >-ky?q+<}G΃6X"twLnO柃ho9XKS!VɃc0!i#Im͉ ZAjH}(Z8D"@%pS+f.b&%en)N:l/εqm {O,6?^ʵ昼\4#DžVvy* YrNl> +fsa1GOd6 Q~2KLf~xdZSZvtR bAw4ҸvvX0AОdWOg&er>6u6n P5yVWNwH ޭ3>B>AT|o2'p.82K1ARE#irXV ҅ Ĭ8EKMؘX}0AV!Ibs%G{r!lO2ӻ/_=zzٷ/[./_<{:5xn[؟16_{=o={Bb]Q4Oޞ _̰-LbZ{c\NUxTLA8J"=UpH_}Ð) uyS@? >=r7%%8iQb)%8{" f0*ZpJ|k;aLO8Ƕ[%. P)7D?,% lS C +qý:>`Y{ڨ87|-M>=&ԑVh_ҷGq(JA(nr=Wl!A\ x؃c;.kkWKl }QPk<.l7_cِTy/Z*GJhy HQ޶څ[@o_r-__t`⩢9vTt:F6G6.B :9=J u tJX=On@eU(9O±pU 6WIy׶ b#c:Se WxW~M!\ =eCa 'R||E(+=aŧ5H  \NaQ0nu0UF2߼ūG7ijmsPI;HAtp 5\cg"uQnURMXKNfaOfAB-πe)VSVOGz hIh+d~hwPKXho$4Q t #ik,+UÅbC0sg{x9m^^EJ~75_ks/66j8g,AO/x-B&G6 cŅAڏuakۀ%MXU5frY}?YK^<.Dw4"~p]$k]Q[T@)cJ2`Y[Ԕ[8Ú\kA4\},$i.0z GupT7[Tƈ01p$a^X8W0A;fM tΉ8Gl"c=j +nz/ƌUkr} +/T*cWeq[5Bp`Q3lnn[~>{6FLK{Ly,|!! !i9(`$lX=$;N`+4&`lw!^xEs= +!KE3ȕ<zP1(_`*^4h TyCmRjqG  7$EJSw ۓEnؒז|bؓdrLu=uwY@ 76 4^LJ D^ yb`KC `$Np=]D2j8Ȱzhf̮N$0jp-JcOT.BTud@{%i5V t3Bg~$9ۃ̮1|Tif.K!x6.u}s(ZxD9,1UB ~o3׉#IgjMX܅ 2x6]@M$HAyX~q +Z )HY]ܴ58#p7Nt¹ąHqiTErddfN;E\*uL&ܳW$ k)"Gŋs4pzn@/-L4TTBhn8&1RwfʈY S8.ͤA8F68?( 7-fI,ϓ ^V\QD/_$\YdNrCy&DFU/] ")`_@wP J:GQ!C0=8 ͍VԤ3rB/݀kIREVm9\n!gL=n~]ȉ}cAoNR0bc qgf}"Q=)b";s(F; +%.ԪCe2P>N0vhۛ{ڄ&saLBPess +s3BA5}?~dsCv0a4Tl!:^|@qشa$Z"Z3E7)*c!eʁ<#ʰy 6iU8ltBm-HŸӒ=f׼ifqH8; ռ +BI=K_teqSN} +dܳΛѽgݓzz\_m[.щE˫u1/c  W?~Gac9~1x +ge;9A0@'́J`[G_!l,c.{ɸ@,g9laH)P̫%P=3ڧ,nwf<ח#7;XA@M B%CT`q EefD3z!5 CaJ֢˽{ /Mr/ ] Q43]f >W(Yyg^612j167f=?̽%=shQQXly\Rc3#Z%::߳[5 ~Qlé^-j]ft8H%h-0H$mɤ0I l Nzq 30K=.ݯLI3; V{oǙXAs^Qxllpz_o\8lp tK+o> ]KBgpq^Ry5'Әtd"D4%|-_Hk89x]^=v VEHKD +F*NoT*,"_DV0thHc*yH7r2{B V>c5Ψ2pd?B_me») +'و}ӘI+GA8u8< M5id?pxaRgK /~cA]F`uE-H^ǴhddQc (Z ApírJҳ=)}q4\7D L٦$@+`0KE3#4 k,Dh!Q3G%")jh̖pฐ8MPFf"'`&M";V4dmx60'!J9œI%?uTyTfB MԍXލmMD(Bm  )X + jD+/)yٹ5v(ìx0MlcpxJ \`}C +@i#蜏y2y`\pҸ ];V[WތI=*{ԯUV)UUǿN^.o/jWNҿ?޾x/-`𢅋?g5xjy`dmf~|x\7_YYOO亚MeN<&mŲo\g>ˎCLM͌A,\ك7 ws8܊KءŪyYw FOo:W&m|31$b7}ZU;T\Cc?e/Uzob.rR>]j2TuzWs ͛4rYq;K0{|I@-D鎹j"grt溬y1t+gޝ;>$!jW7u_I{ެ):ov٭8qd5>|\^:rU9h\ g/j .'q;r]w.uchq%$ժ*{Y?U6T+t́9njUa[N?\{8Z}E46aAutTL~;,>}A_,zV,~Π~Tuq{|OAy36T ̋-{CKqsejܠઽ{!NYu薄zyYLʋIqjPu,#ɧESb|ԫ8!ӢQ3_4]6q^b;z9)fbH.Y7ih]!8(oŗ`_\=]j2|̪uQJwk_GŲje;ADZ^%=vI-i߇\^}i=Uֻٞ6Ua/~K'7{z*ؽ!E˯7q#_Jd6I[)O!4>H!hxa;O_6@ZZ+ $9?Ͻ[vAo2p!=y@rEPIHh4+٥ QnLa + Mz᷇{ɝ`le&_8, dE0{s彗$rq!3wlD(ڐ8V,&9Cb;9_i#: +'h76hcXuuy8>i<Y5WV:Zjzb" gu + b)~I(QBsKc <q2z42n#X,@~+t2}Jb&x;x"U(mHl;PxT8RnfaLK$oԾmcW"S\H#oH%`>Zx6Kfy2MTmkm[z +3ʊH1ŵ־';fx[@5Zyi$&LYOXFo@|*8\i<Y5UC?}Gq1 X tMW-T|LCǾ B K""=#՗F)gtPN.sg^7?q +'+$V +h٩2tNeɄѿZ}ߺH+%q,SU'57OW(}/f-A@knr>}P3>$FI;O~ U'(Pq 0/3bF +9 +#R;cT +0s,O-_It^3^n}1nݤ~{ HB̄teL蚹DRSIbhŃeQ(9S*vxL$,s,v sPaQgxsn| ~E*_;נ5$_yM"`Ҥ՚ָՠJ]%q,RpL.苙dߓrT"~zFM!oH%FPۈi9eΗ|'}6+feh&͗N{in-$Os}cDྗԂV@(iw;PD"gwđ6Ky2MTckk-ImaZk/RY;f [@5Zyi$&{Xk.N$Wp;1Zz3ZynJmhŭBt8 .N#"N %i[l42V 0# endstream endobj 18 1 obj 7349 endobj 19 1 obj << /Filter [ /FlateDecode ] /Length 20 1 R >> stream +H]o+͖rfHTЦ]4دL6tHI;kz:(Iu2.&?>qZ? $?7+2W_QGQLu( ~;''SaFbY%n-#*ީV G1$D)+#PDT6-Q~i"t`,IST*>O$BD @mY F_zp8s6d.<t01o~f@$U~ +eL!$[`0 s+-0<.K]e_zgT󰺠- T)wZ-edqE(S r"+~G nj(2 nPT[-l^?}m|~h`Ni@Pך0xHĽ`ŁOT~&!϶^yrXmGBi"J%9œ +aQ\ FzaGU0.8*ؖ^r]۶-0dŵ֞)"@uHSUHa;!5v8ܡ-O.c>dv|er"t`B`ڜ4Լ'uyA*;SbC)렑rGpOI +ߘhʟ#y:teM/[,1ПIޏ0 D +/ I 6: `w=GkeMk+jZ[ښִ/WibCS)Nocښ-I| Z}v +ZʲZPe_Dn8dp& {tv +6]?9\ 9_"vkGwHR*=#BDU0p²}N$OL[0n 5^g.<MH˘A;+-0tYCἄ~q1trx<ýs1" vq1v9:;^v@^b,q/lgOɾW^n-#;QE(S r"+~G nj(2 nPR[-l^?}m|~h^1QD 2R +~sN XLGU;{JXPyoV΍E`Gېq^DIp +‘-0BVySnjZy; OcIB:)ث'xz;d~VP15 ݐ5 ǎ CК4}鍖طݽA̋U +d:9E(;C]+'xb"J\2+*_yਡ܍W V?~2\1'!}rpF8 œaa{E]ʊp:nk$K tZr"µaBZjΓ(QoLBVo;nzjn8\ {a9a1!³^pсf< ⶥ\*jm1}p$DH{%,P"RD*8.x4\6kK%o`z#fuP5GхK9: '4B5n#UIzhSN|&ފ{wN׶%&ҁ } [!HDĄe#7%k >MQ^Vuȯqصۻ~G nj(2 }?ϟ|_+q/d9T8c`6A[,dlsAJLX2b&mJ`bz%6o +XE*Mo0:m\ +y̷g>l4 FXm9&5mis{9O8kAWaBz: +sMk\S:9susQDG%|K)Mf +ƒ>u0MKYʩXP]AUP+x62;{JgVu*rݏH#d . _pwKʉko';%:t5V&PY'K=``E:M>Nq~[_8T->BuVTO>E"EDM=p %BDgkfZX6w'x@wmD=OG|cDDp` 頣ZXy޷1l#4ʷu{ֲ7%i|`z#{weh( iJ낖q` +*s^d7Lh'ڦ"SU9Uـ=^W \^$G3"8qӄ4iIsG梕hT'Д^kz܆P%2|a&&ȅBPd#qxʻVҁ } )!H*Xq8ka>V'XXЧ Uo߃3zP]T(\1 /݄a0 +^@t(RA)Ʀ^P-8N +/3HPA=`(a=`֬c1t.Tm?ۖE)l9#HM1heq8:1rjA:Fu|2Pax8R$I {4%%}7I >lRF|()gr,ұfA85۞(CޫsUD +⩴ +O+7HdĀbݤ{E>bѮP:|sp=$}奇hE:=>Va~eA+}hB-œ E 7M `{dRX;C +sob&>杚ﲔ %T-Ee+4h+Z(o[PbNS'psMSFFx8:C)oc2_D4P@KmJ`C endstream endobj 20 1 obj 3442 endobj 21 1 obj << /Filter [ /FlateDecode ] /Length 22 1 R >> stream +HW]o[}p_ ؀u߳?Iv"jSEa-3Hb%%٥54;;gΙ/oF{Ϻǟ./拳xZ^tO_V7W?jb 7_w{LSzu/]}\:y?8[Nrl-㇤|nѶeknMu';Փ3ۙPkZ=od[͞z9p}ښxܩZ_M'luf!<gڗr2ݵ6vOnkVhlKIf.ǫrkZ_7eWSnέ`x ^\RQ07[koͣ]}K$>V&bn%QMtv~Z6-{T_bqvrTtv.6?oNVGN-4k$[l!ȃwݳޣ×ּbBzj?j~On...P#Ԡx~dgChz$Lg6ɿGoO? ݫ29am!tؓqSz*%wrc}āMuq`)@MĶO9k{J=KF>8ӗTbc ihފ-wՈbHl} +&uϫpX?[XO$M|C4z4P_luƘQ&S_Pj\WS).|TcVس NƕNrH& +۸1/h%dkB=lOXODDAR IŧNhz,2J 7e#B}0k?hL<;>m)6I`%{ +>@J91& +lJe;6p!Df -)ה71*$͗A +ľĊr g͈I撛\h|UVoc_2~2!2q|YIix)1YJb&bi*K˪l (d**dw45d̃❛±8Ԁa*B! t͋kNe>gV5}@T{ZS(!BZ,^ nC o03dBtꈢׄ~f$p16)ݓMvs[BtVf>ElJLTeI@_m(kM|瀒Ѥ`UrM"I rҢ@:k<.2U!/1{[A)@p> ZQјT\ rse*ka)-(.0, H<+zM2E]ƈh}Ik$\ +oXbma\PUP8h-oL2_>5# #zOE5`x,?\u4PH48Ѕ:a52354~X:Aٶ84Z]rU4㱤 Hp(㇛nbߕco)1fQo8jPGoj7wGoca¢dϻGG՘?gGPmk9Fu SQt'eJ_5MV  `DkZӜ=@]1Fy|x@FSrΆ~:!3<S.,qI y7!V-ˬ so<{/@A:=W΢s@2TD80ޠت+s>D(bCA4-E .rUV\ ^j۴$Ihz8ŁRJDm` c %SU,rFҎMWK]JAtua1N@>Qt](zkh4tBϻÐbvfAqY,SKa烀ƒ:-f<\DAAea~-qDmx~`,T-1 + (޲P;%j/. aBq:L "2(0YKIq1 V6Ma!Q_N. rY,(cVR0j;F@gt}%сQՠ}?[=}sg ϥg@rAz! +G!]laYSuN/%.kkA%dˑSuJߝ\>,M"F6Xf0.~@զ` z cq IC'8?߽}z糯\=)'W~|ˋ?JgD'B_\T#Tُj+Ȯ[2 \kva#} g*V]ZJmsꊌ]= +!s8Q5ǮCURKլ|vL.EYSZHŧFe' [\yy8JY ̬}la)W֜^7p笊|21M\|>ٻ701˛*ógonQ:^З'PCW<.O|d_N3Ÿ@G ۝ B4h_ˇҼ<b0] /J7VShv~X\Z8CgrɌǯ|s޿I?S}s?~˛n6wa*;1d0V@̄Y }JVxńt^@lol@bEz=9#^?.ĕu UpKu}?S_P_X_P_X5.YSBQaևS +Nr8ʖ xRu4$[_@{R$OcZ oj8^!VN#KΧf9;[Y:&TDlkI"j _p}1R^|O= }wYy\MNLo0} +L%BBy、F;rܡŔ9=vR$OpNekGy(w85F_A/^ς FQ-VCD7 =;Z9P8qXBaɟY:,I- `k. _a= S+[@C;Z%V`.8gd `v&vh2;+[ 1`†eט>=y.;BM'u@㏽]ϸG\ Ϊ;G?\km34eA"3Ŵ v<ְܰjz *PKl,4&vU0p28]ϸGA1K=0"T{kAEB` +iX΃Ct #փ-b؛-(J$>y\oǞgHcJ -y'N0ӄ\ `3MmTagᯞ +Yw mNP}0G&Q/Ipx=C;e6$9<ŠٖTqm`g6'Lmu1Fb{-fHg1KDőmB.Jb}%&@ +$BNp彲k'h1Pqd7ڀhm 5cD +{=G$4.P;a%]l&\[a!@i[YuWN"X-GɥNR&&Lku1FOha垈Dz}rD E]:4"= ߛV<kykȇZv(6hљּ/ {~CJ2hz<>! ٻCs; Vl1 Ϩx+SYjoC0p2XlzB/;qR 3R"\ zΆWbCq4< mh+p0SnÅsa{ +Ql.'>x@%p:<s{Xxͻ_zww_bC?o;;u7'}~gxy>`rV;ȫSE]oVby9xQ||'I7t' l(f3 +{^ 19cT]@{{C&Z-7[֟Qۓ{$c/Hf˯{w?;puw=WS}:tjD/W]薿_B˷?[|[7ߏ˳Em,(qrcP 1Ւf~G T5Vߢז+{~jiĵ9afmA굹Qb#$_׆ +YF2>jRg# fb d>OM$xʛs+vORo<[?Z㌝j}mw-${tt5󉄢@ccɩ&t~̪($SF9{Z.k+sQU!ǢZj^k>{F LAnHE $:/X+4XG7u6Ull;+{xʖl}"ѱ?@ȕ dʽ&It4vB#tvd Ѫ$?aIlxiLFZ0?T$vц)ZSbo|+d0gb0NkA- VFfclxȽ$ќWwx'z\R*.:83`@H>O1sMV/źPmlj Ʀv'X`93;n;|N8pw!xu24jw:[ߩǜHM< pvs[@-yÜJMbē E]yEP@#24 ,*,Z4W3.ɜK"KpoNc& [|pO†a=C:-ڨ- 1kO8AjƃU hP`Üi(YΥl0mE}Wr'+SA|Mz'mȟnsA-7Ĩ*jŎ*8uf$^x.6AVn_AJe- +S|]1l9%]'bP'\4/'3aeI׃~ +#rx9Pd"fӣkKS,$M^ѕzIGqzA4KqVSI0p肋2/IBI ;|6*8F!1+nA\;VEaQv0J?Q1a s;HjxB61&S4&/3mݔG2Ǵm=]|VFUԜ=73@bY )aM([?(ߊ=i3g >z?Q’?3҄Aئh5k^Nۿ'˻w?R㏿fq- Z*mM$~jgߏ1~|uy|]ۥцYR!_ FpCG", ӣ.@Fd#:E*$.[1p^eW1jtt-#pN(nŁTcD)K@=8i1Sn tdeaM#ε::D΃m'tM:ad puwf |w][;uyda"9#cuz%A'X+DՓ>4edd: `̝:emLARm+贠_]rq== Ov9T fYGN;s4ek3&~Zg~բ.h ]DG"GZ>14U9H Tat紞h)2Gc*4O,{b\3L 'S]E]>-]fw7 +t3o0pc}}ۋLzZ!w64z}\;2g^PʨcbG0JiLG$L;YXˌ[`˃ے׿xZ#-֖{,` W{=q[5o?qJ1hÆ1HucuLÎ1&#S3(0|Ie~cmc rP՘>4=F^(]H53 :ݎ L#Nou3;9r\5vF)uC5Vn>5wMr] 1 avmb<):JC-نw NÀ4 y_O׸vYӭ)ky=hDU{zA,NԸHt&B eCVvosjser N.{QyXAWjmLׁ2ilIjѝbj-da'V2̔&ҊznseQw:OG>efysZ, ,i|b!9X84M |-"/ +B(/NkG ؘ 4`| +苬`2N]-j:͙1U#u *-#olkW[SW $6snkKlؤ68 9%1ł hs9>"IH/e3cmǰvc  o?5*Śn3Yڧ b,ȸ91B,f߈tȏE qmPrLSZ_)So2໕B&ԛP2^3?=4_':%ڈ@'| +m;LoN6U7+X[4x0d |LC-[] <)1BG]hP(:MnWmh6~rblo`^spծ9y+gE:/2-` zh'xe)L +-f .1saq;4uþ8D0h=rҺxF"c91n/nyA^ }<"^T`I^3[9/`̄R޹ED>Op_4Rf1+HR }:+|PYVer +w0}zg;)0nI<yj9 sX;@w ,y`+Eo=LU ^>j,sUI2B`&$=o@;z}ŵ/;6 G xz6g Ϻ_в'37΋^hnyzOԾیybb֥€ɽFOcVZV:ޠw7sIV EvF8J,FhwT̑!4_t%vw;-f3tG蔂wAsmubT->3m@}lk&kw Ul +e4-쀏-?.f-v&cpx`^Z5NNlVp;gE +-bcVyUBcd%1çxVۭZħL7 3.~P_%DAc}sXW @[Zy +Ywwc- !F45`MtgkRX~49ȁbA51s0> |{_ʘ_@6-)ѫ. j_9x$ʼn+y[<ըd>u0S尛b%@ *LD&@UZ~o[J6~5 TyZw5/|W_|W>~x/__~߷7 {_V 'xo^q?>?U}-!/pqW;&҈nvˇD8o'cդ@یɢ,ahQKsJQ_,eu(?gTZcx81W*<\|Oդ~.S \:.ybGWXNaotn6=B5bA#zxTZP$Z|զq =~͢bD (Rm4tyN9M'}hS|H4=#y/»,˶{ +D(ta4Ic{pNZN`Q`0ZXͤ(]r۸弍{OKx|^~LzmkֻM T+΋1]<,h_^`N"oA󔻯}`~z>:~7 +D3:Vk ) 3Z9,lF8GH31ͰciI`c XK@(ʥh.:פ"qoS ,5eK{l9XzD;mA=$ƣ--N _R=)d 3ppPwJMs1`hf/<φ|E,^:u-NӪEKWgű~8Nէr;zAنzX <& ]q~ԣ݇!p-:uAq02ev+9|t/M3᪚9NRA~(UqIG; )*Hxi)o6.|jj!,%0іrw?VΏd%ʼn2no7jĐ +0"\RUrn|F͠ +H0x@'#)QRVe&I'!RAQ!0],N )3qrkLc G;Vk!5r20qڒd2g*bg +īeHF˗mxG*+޶m]0O 3{׶ \}DێI<{`5eY?2w{*g2vjn2yԜ%w=~ǒtH/6t蠊f?G)54 ])v%QϤVsE.ϟ'8~3ӭ`6UcJF0w;m6ܫݑs_:p3~K),"!pR'|˜lp2ǺOlbswi-xy 0I aksrEMǝiǕ63y8GߗC>~<,;ؓ%ㅹz"l0`]Z!uۜMhh$-Nl>"4f R%S;6HGشqt<|OӤFk_\PC6s}ky[G{[U0 +Ņo?f&>aX]Y_` +R+Sum]G<ӵsPYlp(@GQ]u90=S(PxM>/{Oictqǵ +v*.ju%@=c92fs{D9Cx|"`{R+Z\){R![%nq?uZHu  ! +9#oBFSo3@yD%A 6"U)VyfMJkx+f6D 7 BJ`'k|tYmI=O=`i#OgnFÇg2[e:koK,:R E:×FVB-t'Eۈ &g͢ +( 5"ekCصK@1ӎ`Dߞ CgxVvȨ6h#; uq(PCm#b03" m;ƶ6j/5>gP@vto ⎄9#7*#gRbu#f`筟 A`cZf7;d0/O H,w8 hjQ6o}WȍQ +=R~_~8+j4Kptrr;gc_<$(Wh{[YlR^ LkGBQUNF~G3 _r p +nO wB^oq\vȬI2[Kש)b#t\°蹮a)W%I2c=,6=jV}D{<5Q]\8հxH0+X9EYZ+c{Il`X_Juڱ)yMFKE"|* m8?ey~2-[oWa`ɲ@5nSr[]?Mp=%7Gq>c[/\ vn_i#Ch&m3-Y} _*:8HNf :x;wuҳ&6#@KWjYkG|Np=|zaWQY  Θ?Gh܊퀯rGf ] =#yuz.̪j<٠=]0*vvrتaOK!;i4wKC歨Zʀ@8-sFut0{͛ޢx1?:ymZPǦ;w`.E5*,O\ci(;"WE }bBmɜԼtܡ2ô"y\;39bV.q ΕBDlc8 ˈЀ#t48~j b 0^}@c/KRgjP,@;m d#wůO#9}FXBW/B?~B9Rq.Ț8G.=o3.PT5&EϬ 3 VSBXzLn +{j[yqϱM!G[mHk"P y;nI rwXrVK +i d92N: Nx<q_[@gmkt2B 5<!)y`4_z%h3P"%x5^7ɺZmlǑ☾vD?G8rGN {>uɝ?Ւkٍ d@۲Md^@&A/wߔI'AbPjVZu))"O!i9 z^;B {zF>#K72Ylhy"`+b7Q֘NH]cF"ڕ +TxKF1p/tB%(Uzgu.\PpUSqzqD*ldr{pb5=r\Aǐqa. I\:=X&pKZ[ r.l;9 nuh \o|[`(FZ]xy}*жh)1FĤ ,k0_. -t3cs̯9x|7 +.H`{@("tM辞'"3aZvقo[Q%Qo /:g Rqz.~OGf{LgQ`^>u<% |Y @"%N +Ls0J5%p]UB;'”&^"z%Wc  [z/&8א&fO˓W|>l3bgމQz ,؍h~~%pi)  iUҟPK.0r*]%q)xy_Y'$qXS"ly n+toK^a:YuOaGOP +)/rwdJC:OdEDXڟ[GSli%>CHbz%6]/eEPFYFö=7&yP)~_ ؐϽ&f51 \pL/{dT)vr= E޴K{`[>6#27]P$@s[g@Յ;* mxTtK,^+fkE3668Wy*\N'\ub ύp Gnrp<SB o: 6W`>;li}?-vQ\;@uPc!Sj.Fw3CQs2&)S6D]{ΌZ%{uYb9 ^>>H|˾g6m¾۵˸~zؙ6{Vwk4uغk9wU% +^{ɑyDPӲ٫lСGn#Bk^fw9H ,@?`g + :*L${#`nF8;HV{rl +w>ni醵l)"˓C4kFHsak7R3{^(j` |q1ZcRmS8} ڳm%X? ]oV}xfܒ֢s$ΫV_I{V|.b,~_[6ulN`ySWP;LY)CV?7H m]cw{d`=uJ@H'sv]x3@5.3ΎBqp+Df'HJZ@}y^ALl^9XufܚA&pY)L$a2Oht<LWocE +b4٠*rl{['Xc_:Wmu腺fuyւB+I%k 5|y=.|M#&W5 ++TUNb5݉]8[=[ iBZ|gt q#ԅ;)Ֆj-{Oy.R)yf ؂fkTXLؖM?[_ժ mJ`԰z( 7A1IF@q)7H5w38npB{CU5oS:Ć6WW(ublQv….T]64eÑ}ڠw=3Ji{xnNxB|i5nTqjT?c bvpj6փ0k9 ۸\uAk]s#6Iע== NKJr(TC +r +gx 588ȈP]ȮKy0lSW EJD|YE6Ͳa q('kV!fF* (Z\UqFNyr)VkzۿfsXcJNGw%xf-n 5Y*@n`5?*`pkx&'3{|-xG8f-LdUX䊫n:6NѪMFn 9oa/,iT% +'ׁ?hB"tc ]K+%O߅] "4+~8E +$]N=ӑ5dþ;ZpVs4*=}wX󎊺3^=@ö \]'bxbXl8o_ӋϷo?zݾ~ޞ|z_}zg|O^sշכtX$w?Wl;+IJ^yXERMTh5!ĭ{)xCu 43QE_GzZq RH2ڸ kUH=߷%#C̵A/T{ Ud1I^x >x }emܜꏌ$mxQ)%N!ys]ĔXN[SXʾEвu]F'H-qh=l&qϓ4BbbCզ-hinЕ I y+pڴUSw ܾE8z*ws*X4-O !fpǸvQ9a*Ih8.cad- LK8E;@k0F+Zљ,6g),Wcڙg#8pǬ5hDL Mou߯{H6_aڌRP! wfеyE&L \3r.Ѝw$Aj0o0iin;DHΚb̃g>9Ys3@o_T =t%ĊwiG*--*C'"BTY +0' f^RdqTg7T1hFMy,|/^7?rV\#n͑#f xy\Ő`>uLN= zK)-Rt&kzGgq{ 乡 endstream endobj 22 1 obj 21646 endobj 23 1 obj << /Filter [ /FlateDecode ] /Length 24 1 R >> stream +HtW] ;MhOCJbJMMt_p7yšml] c/)?l4] xyz N|tۋe\,2 ־Zs.Kǟp5(AmU f۟:bb`Sa]ek/*2ӱqRMlxQ\Ÿ a:qqR5mW|^uwЫJX5ƅ5kh}gMvUu)QzfMkޠ^6Rhz^æE .1r*I_(I׮Vm +KQA޵^k *.G {5]׬.'v Ypvb6 Ak{ڬX2YJ}ħħJ\W?Z,Uk58{opNP ~z BФJ|j`TzwpVTjxi.}Sx\XK9|6_,kmq1bvT$*/'>O.kn5~ u[;߷Ⱥ5I,Z'?.rAlB;ÿLJ4ܛ88mU&\QG[N[ hr"<6'PVM6rt6Z`KО{'zɫyrPQ6^c +gU+ rjJ]$Pa-(94x.v+[qq:y,V+RqBlu_ p8-:j!37(Z BsNATC[czO=g;NBhhzsѸ/f >Y:->NwUe'$F!<3vTIO+8aE:moKw:ilN 4FR +k8A69vXvWOEiFꤖЮYi3]PC9 SEöhw,gVn-b 0"9V-^w'CyU͇v1Nt*HÁGd; xT'K1bρ(gz7Vo#Qmmxv6FI#8H,F]X9Me7Vy,xuFћrW@A!َ<ݗh8O[0 n +axmAX2\fLsbRГ+w:9v~cd-3ԓb1UWs \-ܓ;xZQlk2A ++=:tQ:h<)]=hVGl2k:^4 v]EȦ}1T&ՂH) KKmNL}M}j5ơ)B#5ଳX?i7(Bs>Ֆ0M7r>&OG Nll2"Z8jxUҖͧ߾~ׯoz|O?/z~{~w?~WUZW&JT7Y|tV:3 \$^@2!~fl@J; 0pY1SN=mA|8!D!wa@q\:Cn;5G zҜ6&gFڵ75ml5[_5VXs[[Ppdg"Udo-&8Inc+94slq'zN +4--fC +GpS#9vw#vk1xA`kn1׌3z|-Y\iHd\#Su2JWk.ډ9VJpФtGaN'1c/FO|FݗNJc"lx1)ې2Zx;qt3F@dJ +n&I F|Xx*&jiWho`eMv g(3^Z8~eNa%-%9RG(~$QU?!ÓbN4XtG3I,I՝vDG 9(\[~Қ%a [/@CUH.E9vwq\/mU4z`(8mܣ!JR-`l{iSRn.'o#Vl{˴ ʹq&;Y8t ^ny*4,M.+'[\F2p.j= Y;|kiWN&htK#ok&K&ɦJuqgsfNOSX_EpXF\uiVk~鉡rK%A˜s`;C+ΜBnk?;T_礃̡4Q'h{r*--4!\Y١؂L֞HS>lɇ\>̥"lpW9&6[4vhkRXBZvPX΋ ګ㊾ fIRJp9DP-E"lR/sN㒔RY3̞eK-@EY.3,oE1g6{۶ȫ5?qRvҙM-HSu92u<9C20b:(G1Thj.Z5{jG:Muw0r52kUY)W)5gEo7//$q_8s}wzҶg\nxǷ/߽xWO qɇD{yȟq+_;)`T)-93 s{VZydk]}8EN0 *Sƛ 4*XsG) +x)khX[ +XE8f' H-֏\7 ߴ8 %,;P_yxwBTCU݋+' X"kCŜ&{uYJȔl4fSpX\I=/87F{L-;]LJ A,E1i`. JƵ1Ae!+ၮMunayqO t`BѼLɰ@T`P 4U`=\U3+ɈݎƜ(VNJ[%n`7@oKw'?Y]5XM1,ak1G]u1zz=z$dn 0Es[5.u88zlxvZ؋kTSz/C?::i6vjV,Ca,HOw4wRikR(ӉCrH|qӿƌߢ}ǻ'=f+9WF$FoêCՁXHV+  i72g*%+ќ6meV\8TT̷1m~1cn++Lu.Y2砻⯱Zc9Gx$. +ӭܜzXFv9T0yӇ<٢@[7'v0))W8RK +Z8s e"(,Bf`f +c]yi]qo 1[$N:D;,; m;)-% UZ@gknbWq"u%x4 1_^V>vvEyXrJajiQb CGsz +?@m)F#.lGHtq5݆ Q ,Qp@7DrT\X;K%:O*hv0PDQڐw% PmQT QQ[[ A 5y{F"r @mA 1)6_ ρVv^#:)tNVq_d =jډle}]i l 4(4%Dh&u6XNStw]PrZ ڠ +䀹9<(F@34T'tCu¤y&g_̾kX5Tvj>9rs=envS;@%s*qv,›VJ_zK(h `e$]P5t!M7I$464KxW×0 $=s/\U>.μ>Ĝ {Ux B x\Ey +>KNfֿ%tvdTAZ|=Br/NtzAᡧQ4"\lp5!u0H%%/(6K70a[B ;HgL#9ԁpqW2_XfPkl_lY`(>L .D ^%l`TX 1v:-~xVD:M0tkU4myzwz4.'FUA*ЕV5D` u +_ٵ6"l՘LF5OWz@*D{F1)Lƞ`'C7$Ţ!W &7/5 .;cN]A@400&! Z˰[>F7fbn~o9||+ ` YJ#};(>8~y&I3ڡ"Mh!x.%pZK Mȁ&>GNDtBZG4*!n7g7_\<=>}pzw/o.W=~'I.?tMKMR_޺i#Zܤ(KGR '"oS  bae"n뜻uhg0~fC*> 2EYa#9Z%tt{ma;0QFѣ=Ffİ +b'>vpzRɭХsT+3L=L'sY% U]@~)Lد } %|82"41.xr)]K߾?77o}_vvu+~xVI@' SyɧOI[O A=67R4:<,Q@Crw7UՑD#?$IwWflgM2QVQ,EÂ>;c'}LOǩs$, 61pnS=Uf -?0Y2.LY R{`ka:hg1 +kjP'Ae%mK"7wr(4d|H`AL{I,k| <TV4j>,g17~ӗ*<[O={ܤN =& i@O +P`I35#a/QQ+5/ŢR%$-c6h';&l^ FcT@i߽?o<&VU% ~C\Hev#ɘF㖒L0.9H2<7n+*%M @-n04>qrݪ,^ $g^~nnT?? +f}Ko*js3'9{&!AzJq*¶݂;(7VaFCOny(fC*EĽ7 ޒ1kQ'z2oΦ?YU..ZIDgkJV[Z#WbCPiMUsqX,QF#/L +rD"+rFP !q* RB5t-& FQkw%I8Ȟ頴#DrոEV>Tˣz:}iJ Fi),xrXwn eom-l%\i9K@gy0S(! AA2+:)>BoT oJAiwCYfvoFF>ȓe_}t?۟ǣ6ݽ79ƻG|'o^aEN=4_|>=z=cqG㷃)O +, +'0_;=ЦGL:X8: _\=y?w~yӝFMev9;( ѝ(عYѽcðk V1`pVZ Z9\SoͤX{0>kVך㡋ӗ!npi:vήPސ;srسBDZcoA_`>\]vI<2|#Z3<`r~UT];##;RvĝC[7 լ``i+`%6ԒLKxk0݀>mF}<'1PIjړ%o g{,fo9RÈCCF_ |S ǁSK xľƚ[ lu}ԛ}W/8zz\M1x[a<ݍ|$,Z::k< |Ă8ِ~ApTzY\OC۔vvNx& +T)l/Dh޻,)0-3Gn\L*PKiB +SOƶVtkx!rr6RjD'yxf^m>.>,kzlYmVv !֡O-I y,b 5l-x[-՞Ea eWZ˙qV &9+D2>JeQLKCc^޺ZAyï<]H}(UkY*qD@T^!u\G}_ KV(/;0}/ +ʔX2BM/NoX';#;n;$@ͻNda(^?6PpZ(ZiS&{7Fm0Ћ-UXܒh|rw5z4m|"- (_:SBeTP$ C:l@zԹM$I)-A۝%_|b[BsizG2H7 Acb}0 l~ĉlє7>p9/PNFGuױ +U:Ja W4wbޜk,58R8M؂r³ z5kO;Mrd.؀blڰ>Ph{QfpwxgV}/]}}q~uW=7}>;y_{?n\ߏo_GuE-t@y[ @ +G^QIJ!ܵ(:|x>Wf+uguS +Nu|yvL6I%qV@nކQ\%Za40l\/Fe !عG%%: Nns4ε)*:˫Gզx*e;gx4TIW2S>_0_2Lyt4a:C7MgMs9d>yn;NCgy٦M]z*4yWV-4)ͺS(dpkV%)uՏʣD R\ܴ\KV2r'u CCe7#Fi`E 8F3 ,I F#OXz]ka IM[*ǼQ<%GLr^$(Ȧ"XmrR^9Z]b8b^&G]FӬR xIem.'`:=C2'm汧 J,m8Z28ARhp!F{qVQ#%ljRAuwVC1YII^a`mZ.L̾ a3N퍐1;U Ly Iy6IƁG Y )a昴QTr]&ٚ J8K8Fo5$G>[gbAqfwxN 47 v!-Y'^a4\:yĉ6B&U䜺zsC6)h>]R۸#hƂMO Qp3gdwHu8ZhcNqsvfo9u_]vy=gqK ճ!Z'< .E.dQ*)ˢkp#d&q\S D09kUtVسPص.r/J.BQ0?kaFBd#[ lK̳5t%8s<۠7.>eϻuF>E@W=leP~zK8E뽩tUõ'{<O,GSHZ?` #F5rs >RQ.UR\EU;^gnhcZU{t@uw_YO$xf݆J㮘>+ð5);2դq3x!}͘O P_qQ,#JSa74ӈ+h"[Fi+ :>~j+\\KMD38 Q ~;>W#F4:Uċ 0H('𻅯z((qei qH;/xtub(Pt꼍ZhCxGy'k(%ŗW<KCEcA\Iij3X[Fudn 5;fs>uz} MB1fEƢ"M춸8W<Yg*@y]Iu$4VVD<q90#K<5Qdl-ǥrvlf%3aI +K.fրh.zˏҜJ2(Y򢼲ݚnY8ە1YSs扺o(b1(+:nܴT5'Ð5H6ȝ%;ws?,:lЎߟk{4Pt)8 a{+Y@ r>BhFjFb*0/2Ö$oxzcc;61Hnu$!(+d(t"R4&.؍]bS NDL9aǷgozM\G}6)Nݽr( 1YIl$Q- 0[FV[ _9K +! TɌ gWڴC+; !I"4DRy[~qpA`$:(q[L./!*Ma+`f|14Io|v/lVD: ™^& f:}5"AtLKaQ6{] )C`?e:}YЙ|S3@\0%N(yfg_VWh%iH2Ipi*[#ٝ|DIG6 + ]>N1ZJK@岨xT'ic|Ld{(N*ܛ(i~a:cь5 +E=ں l#*rƾԞ vhbAy$!a]ijqVѨ[ +#br8|@3>8 ;(񆖧R83ԁ'Q(W,#d~˲q%v왢a7к?kB $)!Y.XQStk0?Ưk$Ī34 HEAaTu2]m4:Qd¨"142 oR[}ֿu  G +?Z~)&rHe}[Q N`C}LcPړ)۝#/'19K1$1~)Zp{CS\9">dDž")ƫYfdQb|{9\D:[]l鈼NgFl"n54M3aNJwS~H$=YuᏧQ"@ڞ`k|6EH/Hf8w(YQ+C,A\E>55S,qe wVncqaL+ f/ ; ^B3$k`4Ά +`Lcjbwr8Ҍlwhül ىNNVxvkZxOKKzqF0Pn/C]h=7>#Y"R^GBHx:hVI %uVʍ{sVtH-ī5˕<>|R-Ių&m,04@'Z0䰒8 {}] |QhSQxVv]q[{Y]đ }ډtź8"-L@g, +. ¥H*B,O,iqOXqُ(.AxSwbqc]8;[ǧ^B6H|]5jU\p|* +]QO 2K1+Q=bҊ@}w)@ flNqn0fg (6%R̘sh{ 9 p+ + +o~|AIc:{Ez`PٺօPIX`:ywwB~:{' rn!d7oВr 7)cL_.6(T3ls+.tUhlJ[X+6s~ tA!-P7tR4)_ IiA YcխIFSę XC`}z).84Y]3c oj% BCHP;'pD@0S!/ZZ GѩyWO(eޜ:t9$;_vJ+M2c/,y5ȁ7X'[ cOmuؼ]NN!De.DϸLv)m ȣfae|("hf\e%_mf4y@M\~]ߙ$XDQcOD捍{+%:I%@^.Ep~zl֪8{LlpcW:ak]T#EfgNȽ̥Zv(}lG8[>|8ؓeۅ;3(Y ~4Q >gv$g`m+Kʝ]S񕄙E` zfgp $,Z"]3BQYCسL[<-Řw2sC|dQ+25\E{sRCKOʑDVs vAIç~rk\6+$Hy3mJi$zC$[7ũ)\DOSv~C,.~Jޙƪ4ºzOh$X4Iit{HL,K+ +A;/r>d~$j5p̂NU*Ge6%|{KY= GtKy(v6/уDI9#^V.@d(sA3Oq=ڨ]c j=Vׇ"1+t3ES5c-bYKˮE8RtgM,:&8^mK$kp;#0\.IFՉgݥQo,#gS'eH"o! QWI8k}ir>,w1Wb̹  C"Qת6LC>L◛IZh̭E#o$ "u 5.'EK|$Ҫ=I_;Egs7ĶTt;o欒G"(W}5>j}ֺ>vOؘ+bn<Vűۗ|w|Έ5,FnS* ExhՌ{p^! V,I4D&$90˟ o`˩Qoٱ.dVX)tX?/A4(4SbL^3?U+{E uNv ]b-'O]!ŜC݊оGh}/s3ZQ\ˡŘti읉 +wYt׾ABli,)|I0C%dtTi3^gy@$+b{'sbSc,.<.jz3&OQעFY{ڶ”D?q{t lzRM{iAmz{[uª~meJZ_=7ڟc^'`ȀVLvAt){}+9 b`FboGɡ*V;ZÞNt:( A:['3P[=!+q|1z:{%G>>(1{s[`arbnв*٪^wH%g}ԏ~*}e[,r %E;ET̹5}lQN~{(NLh=JСY{@[N@}v\ rbG +3[=`yŗ;/F[UGp^ +qW;yLȊel)F6,}VugV\޻ꫵB.#:oȡT*D Ď$F )J,,+`⒓/BxM*W@9.e`e(MM %BnWH,[KT)fq bz"89߄>ofG!΍03ϵE.V(0[l>vyT&`ZmNp0jdU+ŝ w0K<["7bD l4|cK6%$HeDuN*"e#Ye5=~h8p$ʩGV)ZEc {=_YtB nDȈ'Rg6ݴ{e+ URVu_R<~m1$4) 鴙ۡҙXZnW] +X9ezZ1(c̉(r úbJTq@P ߪ!1 t(A憒(.Bh[Nl`n]w,V+&#E) 2ƦP v]ÁPޏKbV϶9fApƨbYle846n=j&r䃩XP'R<`8̄PQa;ZK/ lʙ!@.QB<If~EC bw9m˔"%^r~1ITszkF hv^!RօJq#nգÉ:gP x5A~B̛Cn'F+I Ej6*GuJ~ fzeӠ]6s/ +nE#V`Eiߨm7EHIv3Z(Н+GSMdl2c%Mti +"Lč٘5/жhקeFd`0iF$f&qC\().ﶊ9w[dq($Of184]Wd 6&7~sl͉gf5ž&2ZgĐ]^(F0e/Tfw0U=4(VkuzQ\=MjchӜ>EF;$I!5]kk}grğõ_]Wo߼xˋ{_=8}Wo~>ˋw7^߼y݋|5?|zwë./~ '- 'T|yyQO˷?ݜӧ̋QVϾ1KzV}×"//kx/xz= T9XaeOVBj-Nu3=,h`IIu$~m^hnr!:ݕN=ZA,{LBTC3\*4ꚇDMCN/5pqfJsoC@r(G?~ eVPk|Nhэxm1[:" ,ˬlH`zXcW|7:OY"7vr8WZJ}P?^o_]}#_߼|qK}ᓛ[x0O=rz GL؍1Ж7hӿN/Agr۱8yuc dCrC.lc2vBEo6 2OkY߮U/XA|"p.T3[C$9z8Dd!`y`k8}P'^lwWom޲~v˺H_U)?rPjaƑe"&C-L^ TCșChƶ]wVx|1Y ͡\\jLЯB8,0tcףUC^.ƺ*xPA] n{d 5`A:>s6 FyPޗs]3R(.*WcCurUQU N07٘bVXltb7-е5sS01 + a=ڛ vZKlڜ77 rp%&vh<+Y$*PfcT!{mhx2 MN\sf]eOj  +?p˜!jHZ#z=v2gc*̚3zU<A t8jSnU?#5ؾ`d\wpC&Z?jv6K3leI1ؘո„G*a C] :K9W +vu Yl4FJ6c K(n1Ճ=wdQeh] uo jRmroFJpΘ  ocZՓ?_={_ ޥܣߞ}͙B˿s>h=~G>_{T3<&ЁX`Rs &jdel#Il)d]㮍əGmemOIau>wj068_CjY%ŕL1SI9hly,8;MgDمY,S<'S1eJ*&mTܵ#8ïCe%Fuw6`ea/ăp_<,̵Aik(S0:\EՊb8!tBq$Z!vu&n 1t3X`~k`m\^8e49ȼWp% zRSYLG,pL3'a$q=/e`Y@ ek +0W \ø߅C[3)v(m~cbwf\?rPWm ˋ6,nTݜ:(9p/$+Ǫ:@9Fwσ+ye YSn-^`]9Gˋ14)pM1%eƬzY ).A0{p+`RrE.0W>sFz*h[=yU0cE)W*3?K5x[P!C8j #PL/Zʴ +^q.ݱk[Bx1F +ǥo+ hG?`vuƫ\5';FB ۦݙ9W +N.o= /VAI[2> x!7MaH[ `"`&Yw~n!\O̭$gD2S3ѦT&e5b -YtCvfzy|g:n{oyt۝G?qy˧7?|b6_{u)V><釯_~wZD?rp mu:I#/_PTm#٨R'xEPb +kmN9$< qmVohTqSρ:m٣x>{JznOZS娧5W1Q:_,!z>dΉT鐐7DƯby5m$!P]*鰼r|8hT^A(el _8Z3{mpYBzqg(/# [&rЃr&v:#@E}")5RK(rѻ s !TM^飰45ZA.#lF͜az1|P aG+Y#w]=K39])7)墷&Wy\m 8ngXGޖ;x"w艰 aG+Y#wToOh[+9 :`S{&ؒ\>k6Q0]g,pK}V +^cv >rgQ\IK2tuƅhԂ4 =qCet7El0alhV8x Tn9,i:r]]?^ayN ZqcIԉ9b#^e QZ + +o8<r=eSKԅ] +zm~hDž7Y>aqrZvyjg&06\n[*r\a{L%bf߿@8aDvsAw_#ꑁ;HHgZbk'徜/R?pSe.\ +ztrI6|#NO,aNDhz= ) 6~dže=PpZUDD6;aTܕ2#[L}kֈ9DXecDY tXD r 6~$ž=pǝ)k.ŌaQ'Yhö IL{.Y^uđ팪"3:sm\\.. Ge$L޲9Fgĕ=0xι`7gE= N:e7 sC/5Wk1mv;꼄@>%ﰏ<||o}jznj_χp7_>櫯?맛~my3ÏAD +ONg$J/ߦt/?+*G]jV_ۿ6ϷЧkYޘKΞ 17xˊ* KkbOb`;yU}BP +j!K>.T0-_(!'bNm8|7_ɵ5~Q8n1:ՖIsDN慣śJ bV$*PSa=x N$Q:FM5Ay2fBНR;nFG endstream endobj 24 1 obj 21481 endobj 25 1 obj << /Filter [ /FlateDecode ] /Length 26 1 R >> stream +HlW۪\}?pa^v G@ NEv >n{IyfVM1ۻI_P|؎6puhH Q9D /6t<ُ-Lea{ЎcpkS9Aj=ctG_\FiK݋ӵ)UAc7I h$-0gX–~{e Z\82yrXYM~t6k8}VyGQC}8~*`T.}Jn隚?֏JSM CZu=(~gqZ8Lfw6Aږ8DS*z]b6r +tlK[W/k6ǎV,Alc`ќ} s2f}⢝ HXiSTlI=,%wC1,qvX/VJ.:[ w ܋T! 8G5IH#a-w%95|EŪ +qhdl +VMUtwtĩ 6]6p{d9i㱲>׌B -62lIkC!lD1a\8ƻYV~] .P zyrW)ژVa6OO-SKq)~XAeMvS7m̩Ը#`}»b!C[c -O&gcbd++еÙ.qXAZ ,[H-\#|^'ر|.s/ +<;9;{0Ho8 z_g v_|~*賯߇/O?l}XOn{}#>}t_9!g5xYnQ:9rskn1Q c_4ƚ-xd'9Uw%D {|^*xaW\"fF*~+2.7W_s3zOPRma5"_b+-h*9 I[ծx! +&dL y]utrm奄xPIAb|$t\gCt.ADgLU]CMGBA$:P Ėo}Ƙn:ASfG +u.'W(JpԹ/?*ADryjo .Xj%MK)8;LeJ G&3tx0pBsW(lfeXa>D!F2#38EH/MFJzH<A\`j_*M:gr37 +]W/ c@S=1{G;-{U 6!r. MlRbl&lIKj-1[=B6č +3DUZ۷PCX CDhAqBoǣ-Ԭ.ʹkVS(+',h1pK@P[E$ i G&@jqKg<j=ăӲRvHeZ3n $L>96ԸT>t_$Տot2j({`yȀn}J&*b0"pMa]U sN>{WWU#hLzPK"b.:*-cF3RI͐XYff0䯉1gfs3^=d7UV>" +3g05;~. KF0ehcñls^W ٰж\+q%EYet^&ߨj3Č`/3Ńx SՐдJs ;5py*lw&A'A]pq%߿tm^8Mų篿_;<՝LhUR7?t*?1u4@ZꨛoAHCyhP|tdK97v.EpѰ=.qB1x]{L C_,Do7x4 i39 pրͳS9MkS{c9#UT!hvʪ񢣊ذҒ@3"fRHP_PAQ*r%`+WBMfGK>RA694͋}*&l cP2c:0϶sq5"-ekk>~ӯo߼3ɋG}Wo~?޼ꗟ?oU? LPztݶ/u52 R5Nvმٵ"ݻSh2D]PR貮V fRjvLk&}fuxN'fW$Ya,HYrVi+ce[r$3e!&.U6ٶzzSپۨVz>hNT&b5hl`q4I[ ~ڜ"!v^:fNA #^U48ׂs=RA\$ig|ZpzyPv YE|2Ժ; ҌX=&)̲G5M}2@F5 yq-#f΄d;wObs#>?X)dN 暞=P]SJ-o;ރd=fo;ٶKDKQy_[E{OU 4M5JQJ/vP-(jXTf Yy =Kz 6cViPI^E[HIj⶚06IF7F/ 8b0(9DcNtv/ B01-(hr,, M^;;_N;34ih7h==E`Ϫ<=cRkX^sڟ[16-^\YԑEE!Xu*mE:1DU8c?ػGs6ܰ4 A@q3 TfjR6 >]vY?.)AJ&So|z+d\AVCr ś&,΋arWfS ϳV3\tF1Rk&Hؔ(ڬ3_;ub +s~Wu֧( +Kv 6ٯFmlWvo6qv 6[&?h&u6IDF08m!r>GS0tU* +䑉ONod .ODј/w{,mm#~IAz +gD_U"q{HW`d{8Lҳow"naX'}bQ߮ϋE׭`wcV9/\ƣv4A0zؑAVGe%pGͪyD3@2#AF YF4:V2ݴ M 3T:!1LJ4yvoM +KxEy6b<d0e譐%(h:# u>Nh%&х.Y9tcnJ Y.9Xũ:/+Qݥ7Y^pe<(gkhAeż sgy{RQ,l9{m`tWbv0սcbƬQ4]7< ݴT . cli/:T9xQBoO ^abGwrЉgr Κr/I$V vr;G}ɴt*D`K" +2+ SJc063!zp()zH >b)u\hѡ*7^"f0N +C&x`+/(r{s K)&3|T,oN[203frKE]78I|CM(JfcPh1D* +'Bh %B*?'QJlqEm}w"{ӹJJ^`m*K fl {ofp7N{+`@#eIz:CN`GÁX00m>,5hq|%LnOnX{w=Nl,dvJ0ۥOJ~,h)fKl@L: $ͧPк{2NͪL;+C^z`TZo Aù=#Wi}P2kdd=Kg7M/f6bB 3G&H?׺rWOx0ES>GlćZperwoE 6np=($||nYV\wBOlsJ '8AO | zBEnHYaŰN^$B:xSTB[h9^ qbhj (B_lb N5)MMkgu:8lG ވ_y +K:HfB_Ȉ0||f 6e鳁KAR9 xI9C T͊ yO{-}3NQxsI +7Y×Iw]R3aAgA )yE6NdQcx@=\D\? +@Zk;,s+zEx-R $؊{T1BKS + vfe'eXhC95uj(1. Lc_yi*]6R~/P4vçI)qP?y}L#k{-e{=qD;SҦhlJ5AX *rKrM4<׮E #ȁO>wc'NwhFunԉcvF~|枣3>5{-g%|3eWGvKѿڭLkFdCc:nr7|8@N+i&xS-<]uueV}OՎk\={v_~;.d BP'[dpkIv +*E{72ZKViL2hi^$\&T^FT#mI&5Te%Q, gCX gXCcB`W/!kSL?\]dU0x`qU9D pDU ynӋQˆ MZ?.}*|AȐ-f]3M xF8}\'Y,$>KKn4gQ #43<5ޡÓbHl*= !72n&'mIXRmd^Iwl)VOȡ-W@_-b`h+fE:hM"F_bDdjL}?`VsHP!E(1c5x^픮K6p[DԌ=3\2&5ɋTCҢ( ^\ȮerCE+WQFƽܪl{{L +qk|t85xJڃI:1RZhm,Fp7)zA64:}AV472~QP%nr|e2zRn c2#)1PYX``yX9B i #[Q`$X2z|V !Y5(Ԍ#4҅j4NLԚњH,r6Rрh bzt~E7aD^.&6 AO]rE.P [tObvXK7&{A67tNx<-=6 ac$c+bD M~!T2ȡFi=xv3ܵg!)lbk^1ڽ>c,&.)=;[>nQ]лi~9?cwΔ='O͜@Ѷo[S幵B<s=>^:$ipe#|Swt0vkֆ寷]k>ε{1k Rźژ/ja*ֺVZ +xVN J0_ŻqUk맽~q5^.z9Wr0/zܻ Xx+yrJ^~b])o/jcqoJb].~Jp.Õs9YηʭƼk=a'~u%1kZ37b-qP=4CGR<4o}ى/.`hFqӝϾG}3:0;??xwnZdݯs}+;oXIJ>>$ Zm[z|oa57{w'%1"ovIȶ떲w㦻y㙻W{ݶïs5Ltv+7nuæk$.қO=[3ۯًX/Re;:?;RqóѺcb'9wO}~xZRf;?BcY=<ǃ19ox,Z&yzF|٭ڂy7gj{ɟ8\߭aP| O΍eHkcsst_vqD roQEfbM7+ 4Z̩λ$BLٍM_3#~#g3/7h?yp?;B1@@" (UYYU&8mRа!_j˼ +D?J$`rt^WbLZ="(kEeUMQE։-Bt5U% DD $VMdK,f*^*xutfCiCɱiCw9ET]1&Zuf +bOK(uY}o+2\(B3`TQYQUE'Z79_4%(N +(<[8RTŁJ8P.?H&Azqn/W +@KUd-q yM,K>x)08ƪYDQ sK8g\gb9,>}\0ϔ OY{ ~sK7͂ēcEwD㕵 +perYIb"ʝ0lZ^u];DTP{0E4y,P)PD[d. sÃHQ]881oLFp 78&ڪ)ӌHMhl3N ͕ V,*n99$;k:.3˨\Z*1 %8+İ;e\ɹBŵml Q%ۄ:Jzɉ*7FuΫ%QjYtϷ$j&/}ԾAv,R88:AV$B >H k[/t n 7H“M? +ʣƌ<4֓¤7l:I<85/|v+dPm$]y;0v3a]mT#/!=2R7Y8R"BCvs+<l]5;.KdfМ2FĐ~e0T"ۦ{. ߾|ƣSt9o6LFwQ9Gj2.݈"̷ӭu6bOI=]ԑo6{q4ਊIiiflϘ0i&3|vN+7Y~r;DQ>iy&gf ~i\w:˗I`B, NFR[sH}9M(B,bDW,a+ +Ei,+rFeֺOc&]^F*QMbVer%rV1۞4*B endstream endobj 26 1 obj 14664 endobj 27 1 obj << /Filter [ /FlateDecode ] /Length 28 1 R >> stream +HWo)J]?0VR civhpcf5}OlD" +uj-~&c apobGB)!|+?Qlcw Ph4KUK +ֺtw2N-Xpl}q˱y8d!C>x',=2N..R߉\^fQ#0N{%qZ_g'qY*6U[HF@GFq%omwheGskd\)F\\ϷL.iwQ]V"U;QY6TaߡCN"V`I52vVNFp|RnyAWAj.Vp:i4l0ak\U-CMѺ8{=&2'a(ɺ"aHu7w$kynqvN;;zD}r +k-Np'kwćaH+/emLeShk;,n)0Hl+IsϡR%O_;קUMkp3ėikҚ哳 VnfsfLD&7t Vymt]q *ԇCu ' Ҍt8eQVzڤv(|obs kuXN)dfrGdݫj,Z\{V4@s0L:zʁ\G`^ܑ<8 c(Ikn!W߆ _m5f]ۓj3MsYH5?BRvYYgY#)r4`^m`_Wݦwnm5MC)LA|[CpП9g;F)ŁO<!xF=KDe"I=aaY"LsKS\'䉮ٮur 5^z: bAu U57wpO灌/{}"Vm G!'F6\G5{g|Ǐ-0뛏?&7-6_Z/a}QԾwqFyt%/VْO7ݮݏ8eGM韲!'X +ҝ=~O)${|K,ŏ]$~~Z{31'd P' ++=aM۰?Izd^b/K,FddAzjً ނMe//g*Q'o +idy26'@КV\Os,VoK2^/w]K>|i4dmdz(sZ쾶!{h4'ňg!4(䪘ܩIyyv6oh_x\nO"VS}=0^IIOgd}֔\g?K%,TqDy`U3g&v$tG>Ͼiꠦ2F\T bŚ}e ;aɧ_jrR߉\^fѣ=)0;z3CX e7%a\Q4zzQb4ө`vi3" Nn \ mCfiӶo@Ǒǿgެ fnYP ҃s>?}CI{ ի!="k/ʷ>C/ |q +s=;gYωI,;']mIFK{0X̬Kf}1ӐLc҇T:~k:iQ\kZ/P, +b)A+/,MYVkPxt[o[yڼnJehs)zNye8-cD@Bx8&]g6grBDof5U1uLDҤ{R5f@Սj.,ʍ' cb Yr*- 1TXF1nTX( mv}q)r@;uklcίm#[C=T^ J8xT 9Y檒ݿҌJ320fN|F:.ğo((;(!{ O]gE<ڦj3?]̟@qIaX%w@BtF#jYy̖tm%}ewS,7֛?` ɭ_If:bg )^|d'׃ / 65z$!ً=5S*$#Mq_mJ~@` hzo?9uN]lba2kW鯿CJdII7ƨk9g3$7뎋4Liл(\kߨywu|r"t|Hpc% |&/Ƃ>Le-Ywt˯C:Pb8E=1] \%ɡx# 4GD{)&9Oan;Β_(S6|&]䋌t1_nMW+6D5n4g~dPxA9Psq&>(XF.xAB󬦹9xIPqR71:CsVaf !M)ȧR߸|蹼\.#bi^cޑ~G+ssn{ +5p9l2>.wK^أP,MƓpCΟВ fFT +e!K]~Nh?3o-560pOh]'o +\%a6|Th"ȵ>e2K5MR{߅&fIgE%uKZ!C$0K"/=^Ҕ4*qMxIg 4*+Y UnP,BdfԧAʚ(K}/d(e U4{K}7Ƚ; pݒe3ݳx ++Zޜ#{?YJW+٘tȥ>Y&Bڰ=χ+ o]AL(y_2JWzƇQBcx) |/X;= â< iJADcfKaLO >wÿ-pމaѬwH=D`)jYχ.מ+vTۖfVb$F_!bYh{! 40o3Xʦ!Vw+-nEAo \5Íj[.bC`вM"Nٴ5?W"J~={ź:C㱞T*k,;"CEu,n'=|c6c3uo1nfV+ +|켛AmGԑt< Fq.З?1i{PX4nA(E065 4Ql_ME˩FF+iDc; /ь.N,YIɛ+&6t )qvjQNqG/ukr=p+( !KfEPw>&?>)~v^ؒDR<.iJ]6us3Z#$X@%Px⫖al"w0ICFBT~O'^Kp4܋ 2sՠ*Mn`M I*d ?Fx P* =kh!ZQB[m ZĤ{P& }TafjlL&7Q?R}y|RO?X#JV;glu{V;g/e+|ދc˱jt+ԥa=:1Kٵ-ogUYxǟoS8k~ϿC )ClZ9ʝ/;˿eg<ןwuW<(;cSeSj(m(}ee_=^Jbvb~Ny2d#]Z)7[6Tevu}-3dfvOt#)GpS MOj, ɫgy~vh <'J]x.F,BnL">p'L՚T#9[bIfQg{gL <S9Ṣ驔b +y0S"F +N(pB.4HHB Wgbj y0< +G5Zm[)8G 4ȣ驔 y0Xw)瑑by0Xj0,addC73914z)8G 4#1!UֳL#D_GS"14 z=ro$z*Ѐ<\ȥFqyЛsHUy[j0,c@*(FMȣkG|_ endstream endobj 28 1 obj 6161 endobj 29 1 obj << /Filter [ /FlateDecode ] /Length 30 1 R >> stream +HױJhu #0b1a#SQHaB mkI^ zoDʑY +DׯOJ/z,Dѣ"G ]o.7 +Tz|WWe*.|dpD(zd262RY"= =UG7g';&#C/UE&#C/C׷#Sg(Zp{l28BTWe*ݜ =>WB=:o => ]ߊG&c#E"Qdp RWe*ݜ =D֫f!7LG"C׷؈#xWY"?=^ =wuUif28bޭWB=MGnV=mo=gE%h#xVWe*_f&#Gz,Dѣj949zφoEѣ#xUY"?=^ v*SQ43=WUE|d^ ]ߊG-#xTY"?=^ v*SQdWB=:?Zr<Evg&{GȳD-x} =7uUՁ`GY(zt~2=7C׷d'yE/w{GT=z:0 ='UEΏ[&GdV=۝"QbG^UG]ݣ1L[Q(y=)[#xn= +7&BAa"kt#.4etB0!z؅kt #@= +Äbr';Gkto-zG׷ endstream endobj 30 1 obj 936 endobj 31 1 obj << /Filter [ /FlateDecode ] /Length 32 1 R >> stream +H1KHq)YBH5 v.1`E06B __?wy<3T_/6*#lwrlz8#*Mb}YH?GUYrhͩ`#L9hE!XkCfÑ^#)Mb}YH/GQYrhͩ`|G2Уr>BF9h6=IB&[#,H9Td0~GM[Wrj9 Y]z4$!IX_-'ދBRuEzu)^MDzQ=Z]!i˺E{b=B("Qn`|B2Уۋ`|Bu5ʡG|+# Mb}YHx/XMBPuEc#zu)^MDc#zQ=Z]،wi˺E{bzߕEb"€#L9|GyXȼ0 >KX_-|GyXȼ00>k*S=2a`|f9=2* =$֗u1b`|e8-2o* =ںʔCw z_wu̻ +D4e"}̷ z7ư +Eࣶ2Уc +=;ǺG}=o$֗u9:LƖ|SyZ,2[GM[Wrձ`l7kC.'{=zI/st0 >)i*S=z: +>Y]zt8ٗ ;HX_-`#0|QyZ,2|Uztws*2|F9h%=$֗uMG'Suݸ endstream endobj 32 1 obj 989 endobj 33 1 obj << /Filter [ /FlateDecode ] /Length 34 1 R >> stream +H=Kk[ǘDd Anb@0]$ ,L#SF$_p~o}99[Ir?f^`gf +f؋1 O럿P99Jd#CQV-Ǜt,&or>˒׏ۇE3:ٰQ$g,~)"5a}c4|drx؋sЗd 8{Qؗ,rK +Qf`Ϙ_|dlA;_%GO0i%S?5.,棰Al4?JNpQx /1HA혏  /-~fϘ jan6^f E2Ygv3b2?%$G: "]RCYx~B`~q?-%_O(^2z!)ȕ}֎ڏn;~,_|G~w%wKCwٯkĞo?n⌵^2yev)+Y {ց>e~o'\4TQ=|jyDm{ﴦ<\=ASEY.xGeugaM/ELG:!i6Dy@pO,xw]<Ùd衤*Ai\zp^.3pߊqddܑ~g Z]B˼npJr!CQ/~xzG7tE +Z{u;|*fAD-=Xwo&B /Avŵw!$k}~3xHL ^}IЗJpzd>ʟa/Kt` +:GrKBpWDWV(;ҵ.>eX-SrtzZ{YLMu| ggءN{[5%TMCOI#7?-$!Ua/FBCe9H7-N2}X'}S`$sP)J/|S6z"E$!2#@mXo Y(0'vCKOԏۇ%lTحNg"]ϋShN2mog1! {167" .I'I7fЋXOTKõWu& Oniʸk̳E!|ZΧ!gix*B;%(>Tq}),p ,>OWE)4!ztf1wwǛ"zܯo(xϱ+cr%\^{qZ,Fy3Rsj9I>C .2{ϔ{*c <;<*H5ɸCʿ3Tq?Ul2ϜEpь|) @u#s_prOe9ܟ9᳏\ɸCg̿ endstream endobj 34 1 obj 1796 endobj 35 1 obj << /Filter [ /FlateDecode ] /Length 36 1 R >> stream +HNjIe4r0,1lDv# Xl5{>ppֳ)o˟u +K*9ZWƀ5JgEowXgcnsTx{7ZR_׀;#s_7BskQE qd9HǦGZU$x_8,I @ 2tLzI~4ϼ??]YwmbffՉcңd1 +z !|ɝ͆q,z4FQ,sA&;==ҢEڝCS Hl6R\;. +֡w2 +~v&ݔYz5#Zdz +q>wz@vfThգf-)pLd0ϞYLF#8CV4MEZBvHϝϞLbs4iԦGx{7 +Li:A'Fx̒6=]\K +CtzAAҤG/QC t +;]-zm5N: = O<2FxlȾ\O;li\zMH둝}i }gW\5.N|Gۉiq謀f/[jdr>QRzV(!C=/q{A +A|5RzdszA^x0zA߁?5z"GoF`pߛ}dc1uyУ(!vf<9'Dw Oܓ}^dGu[m# 4d}@|H#g:f-)f_[ʼnQ0vzmO[gcyѢGzC^n_u OD B둦m\/L +D=u5 +xxp{Oo6=VJkԣMYC0dУxh#H7ah9%+y#x|:ozGF0k" !H7j֒B@zq6H7D{ǗX"S4z#"zk"*|Foؽ>x}bZ)Iki5gI2hg|ymzVc:]ྷsHVWT+%C|NWÇ5kIÀ%Vh6@D+T#⵬cܥM8ȓjm~MCu,&a38p#t6VМFGo +jqqbVJ)mKGtX Ad9%!>: m"]fLz܁_._>x endstream endobj 36 1 obj 1723 endobj 37 1 obj << /Filter [ /FlateDecode ] /Length 38 1 R >> stream +Hj"[O DB.! fEp[:EWg}ކ{9ڞꮮ0 U]2&p.գ~&n#_6fӡvIݵ'rUJ%D_m=?ܞ'׏Bb9OU0kVD!}M}U;\i +[&Es n5mpc0?7:G!ji1QXr@{^b9wźx +vlVjH#Cwzڢxю?)Zn ^t/58H#i'Y5zMz݆J]3Im'~O=~[r}@b97zk\Sֶ]rռ86̚aՁ^grG!z+(sèj6j u gmdYy׋vlKeh9GSؓ@VG4㷵[X5U"KOMt}9`g?GĺW|8?HݿV4B.54{x#GsE +fwVP#޲61-Ξ,sQJIP ĄCķc|Cr~V83dj{(&oG I7@HGQ`p{nZͦCx }jk6Gonn}B!.#n>K aՊf5(z5V!t?D*FȥQE xQ Q Л}U%B[?meݍbBv$k )pS^,&((&t?s~({V^} +?7xQ ɻQ l _(?y7IQmG@FtaB܍&n#~DSX5"/„Q7tsyׇn< Lch5s +|Ż>c@v#$b} nwŪy@wvfd~oik CªČ_ m7}E?޻> stream +HJkIL@A$#fwEnDu1qk\,t1O+~%bstw9]Fs{t}qݟKOd8[wsO[Gus2{;@zc\`UpV:Moj=Lƣv?cMya )Ğs}WC83:q^SϏ׀sw<#)A7|R!-^)] zDj{[ǫ#' !4U6dts~/bNBso™^|T:So;W:^!Ǻg6Нjz{~;=fTowZE/ýV蘋RG)lnOSegTD/jZG)l孮02יxv xߒE|ngT{p.B+w6{~`D%iΧ `Dg]~;*#pF3) "HE'RcTw޺ ' Ip<М;/BynjJPGǃS-w$-gTQWG)v6eFA/,p_ 1F&;W|]1UC#9#1H=fHG3Tkp{QsQu>3Rۑ|r)#P6Ck]M +.o8،\T\t +m\| *u>zt^1~y"G@z{;COr=X)o HS#:[NM:EO9&5.>}ݩtkgL-UчǷvq2lv(XEZwygAao{yuo6}- + #Ѻ[ #øEy㞗}s\ K8췜Bgw!J:Eh>/#@GAR3{ .gn=`|,=nvU>82KLsRXkE9:>9*tpl?[Ml3'1JsXݎ>o_G[_4|5/7IoLƣ6#衷Ϫh€{9(2tRv'Gz7!ʣ#ø4}|4p-}dhh`>kʽ`6La7h9u~ۊd@sAwW{sS!%xvvJ c?P/!e̿Q|=ݺ8b]RQQC>؟GՃ96HwWKp-&/|/*w /ƈ*RwQ'@ endstream endobj 40 1 obj 1784 endobj 41 1 obj << /Filter [ /FlateDecode ] /Length 42 1 R >> stream +H1k2KGB Q!!H mIamL,/o}{yv 7!9+=Ϝq.#o|_7wF y+quY‡hmZ%[&fZ8g^!]x}ytJ#^nPҵ"n΀Px% `>5iK#W f!y]!ȃ3T{%i#F^]|.\t!X|a> -$QZ%8K_vY:_NP}me_O'=|;4A C6GR2c߾0=GK=?\+fA.Z_?+}q >,wSrl;.n2~U0浬N|i*W tw'vS}Q]?!QNfrG0?a^A%  |LȆ~^O'=JS[dODc'/m;)"¶o-lx' S^ +X;, SPgX,W ̈x$DNGOwkgX?+%ux$`NG͙nyΩc>L]\O'=gO],nӁ>z9> wV>/x3a_B{zC>z wm ';Aj5}>B8j[oH=m9Q#}0Ogk>^r rGao8wIn!֡B:/aKHp e{)D&$Q8t;͂H#/!ia6WEG>F^BBe Z"( f \Y* @lد:QC%0!0x}yt vQ#/!#\]Ez9)D&D}dnYpmJ`BG U'|Mܬ96B%0!;@6rǣJ`Bv>z:9qR:/#PrSLNGvi*y'pfZ&dG#pǣJ`Bv>õh* 4]JZBv>IV;6B%0!@$slد&$#ǣiTM{Wj]]T=(.z}yKHVGh6WU=Q,&$##{$>,i%$3#[$NIa }dΕG?mB endstream endobj 42 1 obj 1414 endobj 43 1 obj << /Filter [ /FlateDecode ] /Length 44 1 R >> stream +Hױ*Ir(-ҠA#҉ +t &"hj,xނxϮ@V}@Sm MF?i~'.HozunƢGJ =ʎsn_ +oG#a>mJoFc5ƢG] ތem5jaN2x3z A|Rq{Q6cѣ|ڔ G0*vI2pei5jaN2peF=.׳f*=kEƢG) 8Bf_ecѣq.I#z5=jœd0=ʄ-z\gTzՊ>?EiS2pi;ƢG] GZk,zԨ9`!z$E~)Y +8Ft8&d0=Y {Q$mU+d/=?'Nݏ`.=H(o,zHc5ƢGN\ > stream +H_O"g_j .&\)dF@5FRͦ5EKM~׽qu=9nu[rˣ8+n>n_3^zBo}7b{ů_]4q[*mv>^my{kV-VmVwqoj*q|uǭ<րD+x?-a-wk0ZEB!D.S\ +cskMk7W??$.GlE^NƢJ"$0l'Mh :/<ڭ N>~%A9&4E1QF=`5i䑵StM9kT5ڭ  Z*>,Q 9oSQxk5<5KTBGO͸2(:͕zY{*kU:Z¼WO7;XToܚCk6 +!!@|8k&͊dy!Fv xAUm {<@v;H1s7JĒzH0sr]_d@sJ.@i1h2 +! m2 Y;QU>c/+,, 2w®UHˬDV{c/ thidĂ=6Ъ731{lpѡ۳ӽjhP1 @Xy0)@<~ZUKM}_gM^.V7-5~%!wH++HAVVFMjEyXt;&mDai]ZEp/0Y,n 4haF endstream endobj 46 1 obj 1494 endobj 47 1 obj << /Filter [ /FlateDecode ] /Length 48 1 R >> stream +HOk"[+I & ` BPptaĭY$|B̫rf{Ү{ܪKdTuq@ 3,*yꍴ>A+  FZ)^j"wsA޳ʒ{xƑBV_-/Efol˙ie{x~z 4M8 -]Go{Si,*)e{~WĶ٦U;,6ݜRVY؃G3#"-?C߬,DhoXwhMia:=yŻ rfp;A3O߬Ű_u_mм YMFuR*Z)- ڻutBm)gw;*=癅=wr{Cq"[*}`4Jd r֢W8+{0Kz 8B^o3+{0$?X+ yA/~{ aDd/SD*?z9sY3y3VE}+-*8dC Hg:A^K=0+菭IdSXљFZE{3m8dGZEkQw%!;zUZ>v:۪m0H%2p޻*g$]Io2 c罫J9tZ;8={$"⹳VQi(,Mjyʾ"PWw$K`/g׉b9Vg+R]Nz*y<[zy::#mƁn@*y<[mIDeWy̫ٺ.kj-?. endstream endobj 48 1 obj 1413 endobj 49 1 obj << /Filter [ /FlateDecode ] /Length 50 1 R >> stream +H1ZgU\",b`:EX\XbVBީk7x[杜900ijO /_/z~gf~zn$|t#Gp.;4^r&~K 嚏4n2^ȋrGW739Йk>ʼJ?[ +ܥGWgk$Xf~t暏0|$||#gp&{sGWF. ɻy~F.ĩ}^?_@@q3?Ĺ|'^ [A,#w}&ٰ_%||R[Þa@8݉SFwB ]X y +/Iۅqm ;qjW.$ ̞] 4 + ;IT~聀3J ;Ijz͋~sKva'Im{&{nI. {W.3ų=$q2[tO?Sh{(nΧM 2VPIv(Ҵ]X'a +~%/xng:Y`OZU*tJr5t 䇆]%rv*d!dNޟ4qsm 4q0П45k + 4b(Dl&*M-w hyrY}+&arJr<B0H`x%lEС4 _*Q`2 Ci׋Y9g{N.zeWw(|$ D=4d ~ɞS^(gZvg*MB;hr yfIqVzs}|\xGGo3;'VP$rQg>{>zQ5xdC}Bjv=va|߆Riٰ_V.ȞJt6l|l\wm(^*lORv9nF[~nDqVz]N.m\5_/z G.]*nٰ_ +¸KJi葫^va|߆R&az䪴iڅQC1 R7m0kC1·n$&¸KJ׼臽GJ;4}"_'(;0J GΆ*QѶ KMhpFD| |}.bUܥ x^{2*rgII:#;_GEff~d*Qbݿ@=BRvmy%Wܿpd#KaQ~7ȢW3n4 + Gv>me(f6WA@\9> stream +H?k*mG`XH%mT!Zhk%ER2y30;<oq +b6=bmWdj8}u>5RD=w:2%@YV}bݪLh[Ę%y;c[{bMGJzgв?S0= ,{C2eqZJ6,- _NB^_pBX,nWBvЏ]!#nWBvЏVnz1 z@hYC-B&zЦv@ -<'f0#N+J̭25x{zps\/,H{:`W+9p9f~:Wq5oە``bT}1&L P +q&nރ+nWзJ}b=Tz1 zpOFM$ݮƾ=bݪPPoWAN( otՃ\iwvnΫ7?n˝Ph{ބ\k5#RkҨĈۻݮ{M@y&\q:d6>WoosV"hTo!pgyJq~ t?nWz i7?nWK0݂M&.햠}8ۼYڅsVϏ` Gk:q.[o爫3hozi Wk0ޅ +t/2R}8Z܅ {}IW|2jm8Zx6Zۅs>6o@ڏ爣]8^ >LcN2K,ކ#WSh7R#IJI dJ`6sđnDsn5q5@Ow]>-' +x+KhToT_J5x.^_:mꍊzOv00GoM1o"qh?R"q^:nUW3đC˨7b +B &i?ꍊny\obꝊܽ܉Ex&NY](U>Bπ yp%Q3hU$WCh7R"WϏmW*C-)]p%<~'@/;`׿w +p3Tt"\lܿ+$9``e' ۂv* Hgz/!ɨgN+k @ۉ endstream endobj 52 1 obj 1316 endobj 53 1 obj << /Filter [ /FlateDecode ] /Length 54 1 R >> stream +Hj*M;* "q1K$B .nյЅO+җo'72:}Z)KYM$żmgҊxX*_굓yB>=9 `ҽV ρq_pavm.@GJpWvaײ o.᠁u;tpavŽ_]CDž]XGM,^%8 pMr:wC, +.tX pTvr~.sڬ6mh {"0K.3B.ɾFcI\,\p+)}m +p!?3%Of$8cU%SvRB,'!Ҧf5,Z8/Yɣ{I\T 2%fO``94lՐ{j jB.D:; 36y#rOmK`yI#> r_mjjB.lgb<r_m^Z%lՐ{!90sbUCb-Yȃf5U b٪!td&g_SoϏUܒAVLy>[5~t@v=6ҽ-Yp>91lՐl % YM +`j}6%8 +djȽ6NAFL2[5^[$0V:Q@UC{i0굓`u;tS 9mVS # үgFS!V ~]GM䒅/-'Zż[5?FVljj Y TүPM~ET<$υ)_{\?-A-rNlU"Ea$үB +2 \p\s'g_I6[&H +n %; B~>J nu=5q+v.*fy!dC~N٤_`mtq+v}) 4[y^^~ nz[pc_]/>=(נ4[O4*+V\/(^p(O$Z`t?ZGMz=K4\fy5 M"v d˲?G^;'L$f5Ug,{p~P*{p~~eo{ endstream endobj 54 1 obj 1384 endobj 55 1 obj << /Filter [ /FlateDecode ] /Length 56 1 R >> stream +HAk"[K#ҠE#A.&0 7fY 毾 +yC^&V>3 {TyC~~퟿e8BR ߳݊7bU ֽ'[!ٰ)|RlƱlEׄz-֞ qm~k4*⁗ՕP-v, 1z[mQ +jU/G,=_bUUYՠ^ G:w=E_ R%nET컺̳aS ޙ;4*P^' ߺpdir&ZjZ [%Xj%-ޝng4*wV[UW&c엋B78T_NH6w0nO2φM1*$&S}a|j N>Jʾ&ڞ >=5\QXn;uvm>6᳙cQAҭ+V8h^'$IN½Zm݌; EjR+oc2Ji {3puIޠ} w0W+ἨVsf$ݺV^!nE}/} /P;T/7JiΊoO? NEI^'iGjnQ*Bz ߻Z~o Sۄ1>wYx}~苒NqQʡJNf1q&Q*6Ii"Y!h9/wUɷf-Ye3yʕT ߚE@;3B"0mB4,~<6}t>ϯ!Yq5y{n >?}L%@Coa.bFA_tw::{JB{a&B !a~BBb2J;m;. Ѡ݊*ѣSRdٰYYyzs}2 nau%h/,M!BEKl=/!UP[ >M@=Sx )< +Ʈ{d6u 9^'aB{c?69? %:og$!BHx-Y_ endstream endobj 56 1 obj 1396 endobj 57 1 obj << /Filter [ /FlateDecode ] /Length 58 1 R >> stream +HSAO0ܤ][QAF4F)ۢ% ߲{{v:QtY/Lc(ɯ(r昉2g?P2{5%用6%`uꟗ͖eJ|V$J1T1›2Z*BljJᑒ0ingV.TzwtJ3/l#f#i_Hy x!\of1& 8Kb/δ3F`9x|{fm^ѭY<͇SectGlݔ\y6P), endstream endobj 58 1 obj 336 endobj 59 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 60 1 obj /DeviceCMYK endobj 61 1 obj /DeviceGray endobj 62 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 63 1 obj << /Subtype /Form /BBox [ 1.27783 1.50391 37.95996 38.39111 ] /Length 64 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 59 1 R /GS1 62 1 R >> >> /Group 65 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +37.71484 19.94922 m +37.71484 9.89844 29.61328 1.75 19.61963 1.75 c +9.625 1.75 1.52295 9.89844 1.52295 19.94922 c +1.52295 29.99902 9.625 38.146 19.61963 38.146 c +29.61328 38.146 37.71484 29.99902 37.71484 19.94922 c +h +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +37.71484 19.94922 m +37.71484 9.89844 29.61328 1.75 19.61963 1.75 c +9.625 1.75 1.52295 9.89844 1.52295 19.94922 c +1.52295 29.99902 9.625 38.146 19.61963 38.146 c +29.61328 38.146 37.71484 29.99902 37.71484 19.94922 c +h +S +endstream endobj 64 1 obj 530 endobj 65 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 66 1 obj << /Type /ExtGState /ca 1 /CA 1 /BM /Darken /AIS false >> endobj 67 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 68 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 69 1 obj << /Subtype /Form /BBox [ 1.33691 14.10742 37.94336 19.88477 ] /Length 70 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 67 1 R /GS1 68 1 R >> >> /Group 71 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +37.73633 19.74414 m +37.73633 16.76953 29.63477 14.35742 19.64063 14.35742 c +9.646 14.35742 1.54395 16.76953 1.54395 19.74414 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +37.73633 19.74414 m +37.73633 16.76953 29.63477 14.35742 19.64063 14.35742 c +9.646 14.35742 1.54395 16.76953 1.54395 19.74414 c +S +endstream endobj 70 1 obj 350 endobj 71 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 73 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 74 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 75 1 obj << /Subtype /Form /BBox [ 1.33691 19.60352 37.94336 25.37891 ] /Length 76 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 73 1 R /GS1 74 1 R >> >> /Group 77 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +1.54395 19.74414 m +1.54395 22.71826 9.646 25.12939 19.64063 25.12939 c +29.63477 25.12939 37.73633 22.71826 37.73633 19.74414 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J [2]0 d +/GS1 gs +1.54395 19.74414 m +1.54395 22.71826 9.646 25.12939 19.64063 25.12939 c +29.63477 25.12939 37.73633 22.71826 37.73633 19.74414 c +S +endstream endobj 76 1 obj 351 endobj 77 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 79 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 80 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 81 1 obj << /Subtype /Form /BBox [ 10.71191 1.57227 19.81689 38.22656 ] /Length 82 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 79 1 R /GS1 80 1 R >> >> /Group 83 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.7207 1.80273 m +14.88281 1.80273 10.96094 9.9043 10.96094 19.90039 c +10.96094 29.89404 14.88281 37.99561 19.7207 37.99561 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J [2]0 d +/GS1 gs +19.7207 1.80273 m +14.88281 1.80273 10.96094 9.9043 10.96094 19.90039 c +10.96094 29.89404 14.88281 37.99561 19.7207 37.99561 c +S +endstream endobj 82 1 obj 349 endobj 83 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 85 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 86 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 87 1 obj << /Subtype /Form /BBox [ 19.62402 1.57227 28.72363 38.32813 ] /Length 88 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 85 1 R /GS1 86 1 R >> >> /Group 89 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.7207 38.09766 m +24.55566 38.09766 28.47461 29.97314 28.47461 19.95117 c +28.47461 9.92578 24.55566 1.80273 19.7207 1.80273 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +19.7207 38.09766 m +24.55566 38.09766 28.47461 29.97314 28.47461 19.95117 c +28.47461 9.92578 24.55566 1.80273 19.7207 1.80273 c +S +endstream endobj 88 1 obj 350 endobj 89 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 91 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 92 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 93 1 obj << /Subtype /Form /BBox [ 19.43799 14.78223 28.26563 20.21582 ] /Length 94 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 91 1 R /GS1 92 1 R >> >> /Group 95 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.56396 20 m +28.13965 14.99805 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +19.56396 20 m +28.13965 14.99805 l +S +endstream endobj 94 1 obj 164 endobj 95 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 97 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 98 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 100 1 obj << /Subtype /Form /BBox [ 0.92529 6.88477 19.66553 20.21777 ] /Length 101 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 97 1 R /GS1 98 1 R >> >> /Group 102 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.51318 20 m +1.07764 7.10352 l +f* +0 0 0 1 K +0.53076 w 4 M 0 j 0 J []0 d +/GS1 gs +19.51318 20 m +1.07764 7.10352 l +S +endstream endobj 101 1 obj 164 endobj 102 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 104 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 106 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 107 1 obj << /Subtype /Form /BBox [ 19.51318 19.75 41.55273 20.25 ] /Length 108 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 104 1 R /GS1 106 1 R >> >> /Group 109 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.51318 20 m +41.55273 20 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +19.51318 20 m +41.55273 20 l +S +endstream endobj 108 1 obj 152 endobj 109 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 112 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 113 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 114 1 obj << /Subtype /Form /BBox [ 19.21191 20.05078 19.71191 41.104 ] /Length 115 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 112 1 R /GS1 113 1 R >> >> /Group 116 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.46191 20.05078 m +19.46191 41.104 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +19.46191 20.05078 m +19.46191 41.104 l +S +endstream endobj 115 1 obj 172 endobj 116 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 119 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 120 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 121 1 obj << /Subtype /Form /BBox [ 17.98682 39.25049 19.71191 41.354 ] /Length 122 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 119 1 R /GS1 120 1 R >> >> /Group 124 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.46191 41.104 m +18.23682 39.50049 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 1 J []0 d +/GS1 gs +19.46191 41.104 m +18.23682 39.50049 l +S +endstream endobj 122 1 obj 172 endobj 124 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 126 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 127 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 128 1 obj << /Subtype /Form /BBox [ 19.21191 39.30127 20.93701 41.354 ] /Length 130 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 126 1 R /GS1 127 1 R >> >> /Group 131 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.46191 41.104 m +20.68701 39.55127 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 1 J []0 d +/GS1 gs +19.46191 41.104 m +20.68701 39.55127 l +S +endstream endobj 130 1 obj 172 endobj 131 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 133 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 134 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 136 1 obj << /Subtype /Form /BBox [ 40.03906 18.62793 41.80273 20.30078 ] /Length 137 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 133 1 R /GS1 134 1 R >> >> /Group 138 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +41.55273 20.05078 m +40.28906 18.87793 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 1 J []0 d +/GS1 gs +41.55273 20.05078 m +40.28906 18.87793 l +S +endstream endobj 137 1 obj 176 endobj 138 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 140 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 142 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 143 1 obj << /Subtype /Form /BBox [ 39.98828 19.75 41.80273 21.42432 ] /Length 144 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 140 1 R /GS1 142 1 R >> >> /Group 145 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +41.55273 20 m +40.23828 21.17432 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 1 J []0 d +/GS1 gs +41.55273 20 m +40.23828 21.17432 l +S +endstream endobj 144 1 obj 164 endobj 145 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 148 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 149 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 150 1 obj << /Subtype /Form /BBox [ 0.60059 6.79883 1.46924 9.06055 ] /Length 151 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 148 1 R /GS1 149 1 R >> >> /Group 152 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +0.85059 7.04883 m +1.21924 8.81055 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 1 J []0 d +/GS1 gs +0.85059 7.04883 m +1.21924 8.81055 l +S +endstream endobj 151 1 obj 168 endobj 152 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 155 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 156 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 157 1 obj << /Subtype /Form /BBox [ 0.63623 6.77539 2.87646 7.27734 ] /Length 158 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 155 1 R /GS1 156 1 R >> >> /Group 160 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +2.62646 7.02539 m +0.88623 7.02734 l +f* +0 0 0 1 K +0.5 w 4 M 0 j 1 J []0 d +/GS1 gs +2.62646 7.02539 m +0.88623 7.02734 l +S +endstream endobj 158 1 obj 168 endobj 160 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 162 1 obj << /Type /Font /BaseFont /FUKWFN+TimesNewRomanPS-ItalicMT /Subtype /TrueType /Encoding /WinAnsiEncoding /FontDescriptor 163 1 R /Widths [ 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 250 333 420 500 500 833 778 214 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 350 500 350 333 500 556 889 500 500 333 1000 500 333 944 350 556 350 350 333 333 556 556 350 500 889 333 980 389 333 667 350 389 556 250 389 500 500 500 500 275 500 333 760 276 500 675 333 760 500 400 549 300 300 333 576 523 250 333 300 310 500 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 549 500 500 500 500 500 444 500 444 ] /FirstChar 0 /LastChar 255 >> endobj 163 1 obj << /Type /FontDescriptor /Ascent 1023 /CapHeight 663 /Descent -307 /Flags 98 /FontBBox [ -498 -307 1120 1023 ] /FontName /FUKWFN+TimesNewRomanPS-ItalicMT /ItalicAngle -17 /StemV 72 /XHeight 442 /FontFile2 205 1 R >> endobj 164 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 166 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 167 1 obj << /Subtype /Form /BBox [ 19.17676 22.74854 21.47168 24.979 ] /Length 168 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 164 1 R /GS1 166 1 R >> >> /Group 169 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.28076 24.75146 m +20.0708 24.75146 20.77979 24.02783 21.26172 22.8833 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +19.28076 24.75146 m +20.0708 24.75146 20.77979 24.02783 21.26172 22.8833 c +S +endstream endobj 168 1 obj 244 endobj 169 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 172 1 obj 18279 endobj 173 1 obj << /Type /XObject /Subtype /Image /Name /X /Width 292 /Height 494 /BitsPerComponent 8 /Intent /Perceptual /ColorSpace /DeviceCMYK /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 292 /Colors 4 /BitsPerComponent 8 >> /Length 172 1 R >> stream +HOH~d!s."7Nh EWٶ0EP0jyP 4-@ŽFC gLǯw^:>>l~WjxaOڮoK  60HDfDo+o^; jR~VK$&:mPx_*{  I#Q*JAh%c:Ju^V#حWlG'9 4a(\cCΆasx@9o8ȫa%Bɰc#v̫a]{vթ  + ͢Lfr5jάuNC&2 3Ȟ^0Hψ~o8d''7xu+  ZT,W.sn+NrAxfQ&3Z .I0HO]h' +ԜY8*/+ X C~ -V#3;>ڿ}ȣh0H62ը DAsx@͙)anA7`V#3;>ڿ}ȣ0HfQ&35728нp0H2F5g:J +A`bEZ0H {/DAa.c4(Ps6^ɗ$: +PSu* J ZT,WNAA9le2QsW]hڿ}ȣ< qN i$驱-jάuN<:0H K=jUyb ,٭&E:fG6yta@<޵ 5728нp<<=56E͙iG'x dGj;;6Z[xA$դHgh!N Ȏ9ܻ:Fw.xt`@vfVV9^qT: UmgF+YUB^J@AY[Mt6MON -o xýkjû?~R AYYYYݢl&"/} AQΫVNTՕalZX h0H /&<:U)w*(y(1ЍCIpؒ!bE9r+a$en'݉T~w`uRBLyy|蛇?f+;G& $`P]Vj*Ъ~{L;@H@!I>dVH \G!k,r8lN>xL{@Hl4,6\QNY>2!kRSyM\V;݋|dBG!I>dVH \G!ԓ2]gjUU]!@ Ѡ$47G& @=PӱCjjV@5 +LCR4u$ @Hՠàd;ZU!jUWx Ѡ$47G&@5PӱCjjV |d!Ԣ$^?D8+E\GP j9 j9AsUVuH@j1 *!KBs|dP j:&tlPڀ!T$^?D8+E\G8P j9 j9AsUVuH*1 *a;w2?/mL@*AMDŽ\n.8G& |@Hu(2j\3Dk.3v|dPhPYlv۹yɵm|dPGuYv.7C?# $*rHf5 QYY 2k.3v|dPhPYlv۹yɵm|dPEuYv.7C?# $rHf5 QYY rjk.3v|dPhPYlv۹S /4 @ e:+۹#w_#- $ +rHfSי!T2]gp7%*0 *a;wxA!>2BEH4MQ뷨cWvZ/v+9w?'~>CY+lhSiJ(>- +}{X ,!VF)_G)7VYUF.ԓ',й2 $5X>u*)ŭg;IN}<1pl;1]Տ;@HsQeKI̎dEK[tM>7ݍCQϰy9 $X)ٴ]Bu%ܠ BG:GàL}&_x׾N>qD i[Оo٘MImm:z|@HMbTO3vS<;ݰ7i^ݟsV1qc6:qO/ EH@Hku T~fu&!Keֶ1S_YUrУ9/tB܆^ݻ3˯;y'3SCsS Eeq +"}\b!QnC={uZ'}{X N;/ <=xbͿfxFKE/!:^D=v?-EoMRnLO٦ײ@H";ӕKX^pqLv]{e4 RfsLQPwp? t! :b|m ј53ⶂn Y ~*z.5/J,-_ >c{p@,\BYz-p>I;|ou߾txdf=͌A$YtDq$!Nw[.[0 *76(,psڝa {fr27}YZ8QDMvo*RZ yٿ+zV&1AjܷEr }t^2 $N%w< +2'`Z-WW{~r8Mm a&"}qУ9$|| ḨαĄ֦bj!Et{Grr_hj: ?ww;VFdzC|d +,&4w>*j! ^AZ6&t zl\3DkߠDixYx4.%,?|>$b}{bX˞~aQ>"QMZUG%Bq,_b@H<2n%5\pN̷2u9Aqΰzгݡ!q&1Avуg;΂WZD Z'Uv"h #ٖNB{2ҟ<@H m|ľ=RSyM9>2E|~~]p4 Iu0ҟ}2?/7rqDn%%4~ukf6$dRrI({Z=^:S)R;]|"Mw %!z#7gkmkۘ9P(6]k.3H8f/~^/8H D@nnc+d+hnkHj,6^9Х0G&$&HPG|3~ +ٲAH,Ç.4 +wGv]>2 Gih +-%*K+/<'1JH̋#"2 .TfѝTAJ;ZȲa[FY# +;AMi%EDwsɽf=4@6z+ŵ4qXM[ 7dJ.@>/] ,uȩ/rh-KT(-p[gJ䋃! ,MNWytE>M"l _6i-LbpZKSb6K zNEt$Q)}qvm[O߰jmJN4߮ZwhTM͝#Z j+^=}ub2 +CmC?rѐrl0ް:ٴ$x&?'Ӳq_Y5zѢAu 4ڼ!7Ιu.ixCJOs훡o~=J44%2R1Bin}Yա{C*-p[HXjftJWx.u44%2۷kz^;?'3iiuCkC{;,5t45oK$V$+;UDUG7_g֐+ʳ&&XjHz18Rwf8HD4cs`02^&Ґ R )'ʇT%Ф0>Y0>X;=awЕ!9R&צּ=R0it PLCcrx?1$aFISi*BC(-p[g,FBKBB;"ׅ! 3Jr3Z j֤G[=m=}Z+i7$aFR )'ʇT%ФGHY ВЈ.BB/fnT/bZ+]A<-ФG煉wj|$ kHܹ?K1J\%AǷGhh+Yk,&MI iHŒ {uDXkx;^HSR/f$'"H96:$0bmPēFR#R]n&S_VfvGSMi%5 eH 5׺G^ց|/yDINjөʎdIdN cHYkȆu:x.j-=V[Q`9)M aHAӡ}1))džVZTChh2 +,64yk7troHYm+xtJ:eNQcc!J +.o6uf1pZ ^j^*!нH:JАhH #cFFe~˭!f8͏=wb">wCd樵e 5׺G^Zȝc^Ҹ4$̜{:ڈ!~`6zXiRg@h`lJشj쁉~ǝ!9R&צּ=Z5CoYKIh`.zN4ɴ,n\Phm.qgHb\P$deGdPwb\GʐˊCSs۬uȈˠ0u3LV4hjd:y\&rcHE*Q{C׬u VZTChh2*Yk,5\4qaHr}$֫|tuJͺˁBW ]Mʨ*)L]cÊq{4yo50\ae$ʎdɨdZV7mlX37$bhʐajk22invzzgjHnb'7a_jꁔcC +C!UI44 LMf̐sIl,Q7MKuwt+ʳ&&Xj@JCJ憄ȂP.<n2H96:A UI44 LԱم=:Щ55$GGiz5kz܅X$Ë!sSDSC"=҂A!j3ˊM֡wrlH9auHU>*&4(nHnb@ŋ|tuJ螖JWxPi]sEy: MpzgHiϋnש@#{4d41147CJOsvC?!U.,8 ( ޑvfHГ=? t$F?uzz$ 0$ґio58JihbCHIJ 3j iC1f8-+;DDxH]UݐxLGc|xZQ =ݭa|Bʢ0Dg!M+D"Ml@n\Tt@\(XtYuQݸPhFԝ% 5ѪO}˻y{2z^ww rD$l?0AYqskwibcֵW<4 pu\a!ɘh +ᒥ8kcgb^jH2e~o:ʎbJ^KfK"R i5{eR?{W%Jbj1͐gˌJX+:q] R5l/G L FQ]H, (ߣF=h&;霥C0[L/L1$-Zxy·ORL5l? `{6<4E!#7Bh-C™kcؐdtَ'KE ,E,M;17:n! 4W̮ji#,^KfK"tBO?3dHh$i*b:kltO9H"v75-l?3dH#>hM/Eh&?)dޗ=aB5Z`Ȑ0^c#B>@dӴ()i"5');)DYچ$Һ&_0 ۥDbq%:֡Fk8mHW67v ;ACG}ťou`s`] 9ikM ѹ: J!ɸ\d)ҊpmLS}mCon~!ɸ!>A.Z@̶#f3RۥDbq%:`p`j e"eo<-Chi]'84m> Ё!'!'zs]CTaIд&-d7桉H ;I@kH(tiB4$LL] ~hsZۥDbq%:ȺḲJT{>4]﹪3H*w%AApl=@9H"txY췏[_CކԐb6SD猦y|A#H!uH>0MDjXO6ID@Kshi8Ugmjs + '!Ft4VͯnFE 'ۥDbq%::vS}mCoRORCꨯ{<<дpltO9H"th)^^9C 4)֣JGk(c;JC:M ѹѺtHȈhj I xtaJbV0/D븉+۩OS!0K1EO ٿ8g]J$7[Ccug~uH5uO&!e҄!ᐣuXW/|hXg{k|2A5hjM˚ڄ||ln=5> HL550KP::-Zq!u4"IQǾwdސ:L,.}b05uOvWd 7$XND +ۥDbq%I@"-@"=C ǁ`'C"yhi]硉 gJ4% C"BFW7<4y{pGu4%ސʊ [LSvv r(dSqT~(SR r5֡Ƭ{JD0\583Cq!cȢ<4y(-C]H,~ì nHL^\L4C"c:jM/z-C2$SqT~(03%71!(0=OzC2``:2Z5 +k:M/dLG0\䉙4] i`,05u0<Y&#xDwf'cMCnj-L&vȐ8h,TUωUlM/dLG%Y;溑-!u=X\f1B\,Sledz5 I.֮#uXDEbqʋ|}0E!!9x|Q>r|q!ZCR cY3Z#˃Eyh"`zy@+VrVNx=_Ӑ`v9/5_@mHL}&l]ƢiH4ِ!
0uDٜV?:㊻`mxh痧_vyvÚW5o&f()vn잉q$}=I Iw&C ƲfԊ$6ݽRw]ԐX'ټ,{UzFq L@HL6VX]̊*`IA6 +J5jIk+XRT%um6bd |B„?<&%D{}yssꮞW: >lA, UoNmM6|{! o5$Y"㮍=~2ͭÌT03s1Fz18蝄jHI 13BSMlCMWBnuzVo5$V ^N fEtޚV7w[GHkT^\㹞b6r`  UoNmMVɥOOyYz_ܰQ ޢVTϩT0,3soSngkHlDyE7ˍ5j^j^@ MVE@EC]= kHLOs`hTc4 0|Ks0DYP MVD-kHGvlMm?^P/85 TlPŠHj^qjX֐6gg=SRvm\iN f℩er+Λ uz[Q^\e )mU>onS@rvM(=m^mB@5Zj$EҤZȰh5$\/QKtloզ;\75F# jJВc%Zkj6]88d !"2$j[RBc|rS)&PF{/Fw!Pd8{t9!C72yYz_r e5ֱ vu.э{Pz55/&vs ؚy[R"6$f{=v+=g/蠖۪3qkysm:DĆD4Բ^]> +߂YT=ޜښL &[-V@H!}@J[&M"t2(h[EuEC]Q!%%ƌOmX5хB[5/&%Aft  t60|Ks0DYP Mf&=s0 )ӓb`htNKQ@pv=ߨr }!3:Wv4h#?ņD\:^VRyVa610N k03LmIPUTƕyyB?ŸJT8&jkB9Լ|X-4یCȐΔdċ"adA-4$T$anFF 3%U ^gڨ\ "gQ\zsjk2#E!)))!1>9hSqTf怙-tfQgJDܸ P +PZh2yYz_r0Qv)*kj+<6\Ktތ )ӓb`htNMQk{Ls<(rD΢PXޭH}6$hMc{sDE℩]a훑hݺq,fDbHI 1>=u:EƒFPz55/&#mrqp,(~eEC"` q0)5D)NIၱX%ȂZh22&f5#B5C"D?Z͠rUυ7&#sdԖÜ(Ow324CUCJOv;jRPf}IT03sةbFߋDpU*7֫seF^#d4(eVxw`r!G85DpU+=3P{%ȂZh2dFgXfy1XXӜBCv hh7sp "gQ\zsjk2\3kn\ҒĐ.rV]⢵/~lT0A9ltw'Vr٦+ǂBKŨhfHzo*z¼]=~LvQ&C+@E hšMqjwPXq)hjHTca нadA-4 ѝ ]?a!nǹwe2cޜښdfX-z/vG}Ϭ7ܐLOʊQ݇m\n`*N`V2)b]oʉ>.DЋjٱ5ߍ? Rm[R1Ü:h>o~pJK gJ+Eal|k{LkI&&/aǶښdӝ`W!Ek;L +<IRBl'A%}ʩc{&z a1$gjEݔDhϛW Me:gK/px?=F !)ijmPeQeEzqdHEwgp{SiJfO,8ͲioX;ũNEa5$»;cޤތ\@s! +g58Ijb"1 )!0s?;|0aϛЫ&tɇ;YbTeJ5g\ +YP" \_)a߶enb{ (ZF(J3BIqmm߰.n_gqj/ڋa +3$"/8|4S\GHYaRBl >!8F->ứo FD΃̄! |# +GPc ףgǥzy6mJKA{vܯ\/ݤƐGwn_KƄyX9{ФJC[r~vr-Fă )mѓJ+9LƄDC޵q}O p.+XC!CZ +ͷ .lJ3B8FZ&de&iǜ e)2-+cXC +A~tw Q kRjŬq]޻&DސJK7C̞h7}}CZ:YjKa|_G1m]w1`v!1SvK.І5 Y +Hd/   +01  4/E1!lusUMq ;Ru+KD_/?4=F'v"^&9D˜cr&)IFUMgܛyΫ7Va]yaRAmWTLkYx/#ۙ$ gPWU/66OV`e3PeĬ}P,ZxWPXq&)fVNaāxw|~q$K翹8xJ[1.pJorjEK;gLA^gz2a&у8Tc/ +gx,‰m)z|U)KJ4_ 4,.O0-7^,Z?x=xU?.wHs=HoϹ6W#@g]osn">>x"wH? )zm O{bj;] dA@RXVmNvHɤz؊B1ӵ[9 Q KJ[16_ {+J|;yFΠ,~G{f{?S*ُD_7o"'>>x"w78;0H O>|bpbn~Zu3ߣ=Z׍؈?ON4v Z_M sM\os߸~, eES/TW^zNA iJzX8C@*a2HͬZ$o e‰m\auoJ 2V92v4WcNAb7MHZe H' RUinuF'T e‰m\auoj 1V92v4WcNAb7MHZe H7 RUinuF'0Hpbai4tF][4:ЀAM}S+Uht8MJ='dz2 +K8v8inuF'Z0Hk*,ڝӨk~F'Z0Hmn웜Z!حE7F-$irUaXAbwt(  ,AǤv4ߢ @$ԕ?X'حE7F0H wN&iΨ*0* GeuF`df J<&͵;QNr ɬ4>inU/1AٽwJ6IsFVO=aG<*m #c +$#v8ihbaiF'9adXUY^#U9?$ʾɩҜ@Ҩ + L4*E0 w5tR ; Lf.ϮꢉAIcUvfy}4Wa3zC 0H2mn웜Z! +4Y(J @RD pG[C,JL n~j.XXڡ $4VigHs6sΪOZj&vht`)ʴ3{ +9g'27u Fq<מʵ!E!{*fi pH h@. 8WAAAбIHR&!RE*.JRϚhҥKBwV}L${z٭T, E¢Rc L +d ٳ{y;& Hba`a9s9o(6A2{z,KubP$حXkw^|v#& HT9*wCۇ%MA y;9[ui-C @4AVfwxfYү nU,Ų^{뷛)6A2ǥʩV{trI @DB>oG4]T)~'HI$B ,'HڔhUMf 5@ߣ<7J,`vb)]?vF Mf `O0=*?}_G!HDϟ9#x■NO?gO @TA~JQ +;? 0 J endstream endobj 174 1 obj << /Subtype /Form /BBox [ 18.47461 13.97266 21.62793 19.30762 ] /Length 175 1 R /Resources << /XObject << /Im0 173 1 R >> /ProcSet [ /PDF /ImageC ] >> /Group 176 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +q +3.15009 0 0 5.32925 18.47461 13.97836 cm +/Im0 Do +Q +endstream endobj 175 1 obj 53 endobj 176 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 178 1 obj << /Type /ExtGState /ca 1 /CA 1 /BM /Multiply /AIS false >> endobj 179 1 obj 12636 endobj 180 1 obj << /Type /XObject /Subtype /Image /Name /X /Width 236 /Height 395 /BitsPerComponent 8 /Intent /Perceptual /ColorSpace /DeviceCMYK /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 236 /Colors 4 /BitsPerComponent 8 >> /Length 179 1 R >> stream +H}Lm0 +ł ؠNPa)htDZ@5LK`#рR5+)M[@! x{^ {.~sEx b b?(,"(QLdyѰ"\8kG=w?o*olhgJeap{ոͥGk0ݼ@a&Dc^З^TYS[=ufϼʝl/YՂEF\">.7[1ooE\"=A.9 kgAxN#v\Eݜ<ݓ'446|'ϼ(,b76}Ռ={qhOED(ʷs ~)=wx[QXx3n[E^EWD=LqVj'7lm"#/-D$c}XED)r; +RA:7- zA^("{o$jus{4"Mq9Sf7@ݿ߿pnѰgLLDXz,@QA/}=>gr}qcUHs- +c"*߇ZX0ܺټbW3N6U݄PEa}zOv(yxmT]tIAOaV7YGz!IZQ?6vpeA\X(uVϾ!%4AﱪA7'Xo("{0ǜG鬩/yģ5R讑UVBxDDK*scKqdrA)`bQ^zaG=G`= +@z t;Sp*QQs?a0($Fbmڬmu>z1KʳxE`9^h:Ȩg~sbGG?Qp%+Tt-jض%V`XiAvѰ"If]V[z(,@kBUk{ܢ1nY,(z.; Zve[П܂̢VJO>!근n? +BF%5 =c + )t]u l^ZrQϠR.Ɏ]އ/@߻q IS(!)!ކ/*lsH3()rp ]Aq(u pgMmroW '_4Y; +rEmzࡩ-} ¦'&VS ++oW#]mzz6iۂH5 +KhTZApa+sc%A6A, Iw6J듮kMz1Ɇ]BɲOLP?3P?/=X޽ڃ +tE岠r #1@8Jmj>"ޒA&pP{0p`ӵ"{fmO(KUwGׁuɲO:6"OW\@n+t*qz=ey}=G( {QGG7Wux=Be`Eu5S˫G:C 5UK݈yIWc}{a#Vԛ1XwgKئEW}2erIhZ  +lUò뽥P"'j<=Pk0^;lAlF圥O?|"{iw|OV +Q{0]M`EAPY*37.=¡\at5ֿw/,`P"E`Ep ۚ}:,JHwS˫=_>=mڌ'j%Z+g6"9YVy@0ax>%lj,\غ mcmsFd@_"PBb/4|u".JpBYٻP|uw6OR{(!m`EaK#JC@B ;j5G=ϴ; LJп XW[S6\壪aYR{!]`sе발VWf6Ϩ=Ԑ.P5Q{uXNdhnT1pz25|ubz SjjWeHwˠM![,N[]Q{DBdEU7vg|bCLt8v߂.3[d3="uXN*37.=p5N{&\`1 +1="uXNRaC i+~_}ADd@o03kpτ + u%H8}ųwMDZHd" رYjH 5()}"N_ +qR`GŌ!3aX_^X:~,ec2bK:V<{W`!0 R J.,7_{]M=N="i(ӄyOGWCg^PYuA W[SsbjEkP lS{D{as"^TaJ-DAՔ=CDTzNXTL *-Vj+kj&zr#"g)ȵOR:C=ϼ;~PzNXnΖ9j&6Z+l3kgZ4џE^W?zDĆLM!djԚhp:wOČnI`1=]4cZ&R\heh;j! L;^$qLlt5=PYu4݄.ļFlX bv {ڃ,< ee8$<CÉXвS0"[3hcB+XUHYJ˼6yFm.ZΫښJG緩=2D\B+S/߾` 噋[>VQQLlL{jh]X0܌`bYٻЊ-a&t5=@R:~IĎLbg|bNgX0T:59YVyC+ V.HAtxT8,[j4Tg.nl]jl+[0b"[CF,Ƚ=ͳx[aQ{0|ZA7klՌ5y+PRPiKCNuFsXF&ێV0W[S5 [Uj&vd[ _5xx`bbbmS{h%,nE4ZJKNYP=TFFq ,n nxj1nYy}߱lnT[` KT2Tj&v*37.=;Vja_R{0#Z]=濉K` J-Q̨S̿B!1kcT9K`qspsߎ}C#Lڌ'_>m?nFqz{QԻ 5( 6R(6%b! X>X)6J6,lh:52r}g~}י볿7Jjfgz1MϘb؉ƞ%36ڼ3l~;ljѻ$h; >=F?0tC-- +GZnXjN ! lFu$cmVs KmA|oqF.4k6ÒTr4Y [_W:HC\sB SSQ l V yVa!C.y&$͕YzjX`r|y&$允<hX+`u^^t=+̰ +GtM ]lꙜ^0B.A.u$#5UfX *#İ_FFreeW!02B a1_e +èh1lX *cذ_FUưa{[V0 $Q s 0 +x=3`92l?u0<5&lkq!֕܈bٙ^u [w4kq{?*,C};Q+9z[Vuh蓈 v}!V r18Ps:Oa!Z: Z~% + +Gu0x%*dSYk{MUֹsu6VlCb̂+m(V`/‘Gu߄0_{ ?WE6҇Zy̌5VVa_CRvæxDa`3ĘWPKt2ٙ^u̔5"fDC3ĘWP믃mCs;f2Otw6LN/!F4_C€Iso HCYbD>qXFa>%F4_ +#d2?Ce4ZDD- fvdRYbDbŴc̥h|a[Z̎2 K%17ljjAh2LQĈ+m9gEdXgE-(Gseoq{ +[޼>}ZTJmNu0 i [INai [XNX$T VeXկR!aPCvyyCyz$G!n{V ``AvuMa_Ѱ3]3cٍslv,@q81,D4T: $0WlJu ajP4l]YIb [HG!}֡Dsei~SC֡06{\:x%/97Z147e;hޖC+J. slv f f^aP0{cH +V 6C':Ltw6LN/aHD?Gb~U6,~ [ N脶nvJp8j~c3Jnu(u^^ǰe|a!R5AZhglJX [HhX.VCW}mFl d )a_bUĪ[l6;lO4AFABB |J Z9!Za`4@%n%4,Lt07VI +q*wvc[ǯ6loKCF]iu +2/C!@9GhUD{lz(@q89"gDChŮy1l/Aڰe0*f@  P +q둜[5,h+mG:=TnlcHDBNtw6LN/Y%F \0)m۽k0?c8L%5l0B#Fvi [d KԶr·lWu(kglBseoq{ +[KRvqlj i؉Φel:{5ZIR0; +Gl(mW+QglAmʐ4l]YI-&1^}(xHb1[ͯ:cѱ4O#O:4/bxUa!j9MߍL:fCuʐ4CY7 lt`7:v!g֊lLb&;{&u +*CΰЋa`^&C-Ayʐ3lsei~[25Ug7>cUaOd`d; [,H c`O*|;l Ua9ӿ/㗸+D3F * +*h3LQ.44[bVctHW RAVّB +_&"Js֚q޽羙s[9c)b8K(tW K7G9*ݕ9aaG҇‡E +f6s%T+Csg&5vvҝP M >~ug ;!ba8KN+4l$1(*? OYA|74.dΡ&$,4 s%Ժ+CSNLa  "}ph;hJXؓ;=) qm1v#W[ + *O$|vF:](, +V.Q v@׏/].5Д9+ˮ9!`@O6TTхi>ylbGƅZ̦H-MG#aL;9N+Ӆ‚  ȑ0 a^WSju]64 $,0 t+CVa{ +(Kp$1G[eEnvD@]i+d + Lmqэމ9|T'Llb_$HXDc]4WKkcdŽ" P t$f9|ܹub_GF$,uWXª6C4$,ٺk)1rսuC4~HD]kR{'&װs`aukKkc\ QPPڱonvpCZ`I:\y E­T;E8]*+rs`HX%dYOV0uהm4y0P$ , +# (έ1_"HX]u5w?}l{; +:M3%FxQDȰ ; (@ۖD(wbr ;," &][ZtwhHIX]-frKE PU4053HXHr1(|(GO;WyQ ˑ a~uFQ,$ {]Mo;'\R(,ݕF HʊC/xQ cAEcsSugGfUIS3#>֨bYܺ=vEuCf=\C.Ae_]`f _ CªĀU+6옣Q?g$yA4Z `aK2hFk0?y`jfStP">֨\><=\W;?h  ? K _gglthK#sVg)WwvD Qg g5x.-,IOnF!{b}[U҇k5wvjGmqQjVP"n#j]jQUVYq}pR\۰cVuJX::ȚZ=\Ǩ zþ`E6'l_vF )A.W JXcAz2tM5JcyIfc|6]|JXa%Q +(L*?ƞH{ޫF l/&*+rmÎ9D  =0@(.]67PEز츑م7j{h}s"v8) qzQ*gD +i`52jtQ;PEX.^*OQK+kW.&'|e~EsT~~ڡZϻr`ΉD%^uՄe7M՝]j=e:0F8*Ѥ#U[>͔Bd">֨7(KmqQjȚ²ó=Qqk_z+z |oe+m1=U40&%sX^_]GfD}Ӑ.,0s=6'l_vIC˄٧M-r8XdMU+˖e_]#FKT}O%q"&q"段og 0FtMoUd nŠ0Fa-.;1ZT=U> qe,*OUd²}kgX R\JoDk}9wJ +*,CaM} 'l_vd ;E$(Ύ.^5KKJ o}(p$+1ˀ. ]p +f6y=_$e o:^u4.K!LXF%=zڹEkϛ츑م7p.5PaG4Sb{y. :݆Z-͟owG"!\XޣϞy8Q]ӽC/Dc_׷='""\Xl۝Q0Z^jokOߨzmaǜV.3CPeR0<Xң+ȝ #zЄegٞ#F?6ꓟ蝘|-eUXlҲUwVwvtFg_+*,#>֨74:2H?41?ݤ}5@CoSϿ췋i(ndv፨XJA +aee__:$1eE%52K?vvJFXiYWvSiĈf%LlN\H%د0r*mjf +CLz5JŢ". +".mDh`ɨ@*u*<:Fmn`680$p;? b_CЏsREk[7Tnt,V%mK㉃Jp\ן_MO +> rm99B)1߿`hxtەwԞ5r{C9G13O雐UK6:glI]*zw=}J9.%+ z"ӝzޝkd+U^bn삖-mg> /ProcSet [ /PDF /ImageC ] >> /Group 184 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +q +2.54596 0 0 4.26125 21.86523 20.35545 cm +/Im0 Do +Q +endstream endobj 182 1 obj 53 endobj 184 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 186 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 187 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 188 1 obj << /Subtype /Form /BBox [ 16.97803 17.91406 19.53369 18.5957 ] /Length 190 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 186 1 R /GS1 187 1 R >> >> /Group 191 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +19.51563 18.16309 m +18.60596 18.16309 17.74902 18.22949 16.99609 18.34668 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +19.51563 18.16309 m +18.60596 18.16309 17.74902 18.22949 16.99609 18.34668 c +S +endstream endobj 190 1 obj 248 endobj 191 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 193 1 obj << /Type /ExtGState /ca 0.81 /CA 0.81 /BM /Normal /AIS false >> endobj 194 1 obj << /Type /ExtGState /CA 1 /ca 1 /AIS false /BM /Compatible >> endobj 195 1 obj << /Subtype /Form /BBox [ 19.49707 17.91406 22.08887 18.60156 ] /Length 196 1 R /Resources << /ColorSpace << /CS0 60 1 R /CS1 61 1 R >> /ExtGState << /GS0 193 1 R /GS1 194 1 R >> >> /Group 197 1 R /FormType 1 /Matrix [ 1 0 0 1 0 0 ] >> stream +0 0 0 0 k +0 i +/RelativeColorimetric ri +/GS0 gs +22.07129 18.35254 m +21.30957 18.23145 20.43945 18.16309 19.51563 18.16309 c +f* +0 0 0 1 K +0.5 w 4 M 0 j 0 J []0 d +/GS1 gs +22.07129 18.35254 m +21.30957 18.23145 20.43945 18.16309 19.51563 18.16309 c +S +endstream endobj 196 1 obj 248 endobj 197 1 obj << /Type /Group /S /Transparency /I false /K false >> endobj 199 1 obj << /Type /Group /S /Transparency /I false /K false /CS /DeviceCMYK >> endobj 200 1 obj << /Height 128 /Width 124 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /FlateDecode /Length 201 1 R >> stream +HkE[cbDH4XGj E +n`TVJ5*pQЅ`ͲY馁{wg{3;Y3;3y;j&h&h&h&X}68<<|f=144T*N +6\.+j(e@=LuNRmᅬy&֞[^R3::|tLkym Vǜ__l(Iioٖ̓]$hL # oۨ ŪŶKn8;D.)|EYDr!SEpXGG33ժ/>¤X56ב,1s^ H <ܔ@sg! Z+u.G_<ڈsmkC CA628ohХ O1,X0p&,ŕ+War*`Y+,118|pi-nݺW|vv.[Uc߾}f u1UK>|]MC3Q_|7B=z]}ˊC@dbA&7o팶`nّl5S%=go#:mDragΜ/?@+?~>Ū%$d B俶ɱ݁d 233p]6PNTZ WE`փs,?c.j]bΆ݈H&&&R;& w!ow}K*lel֏sw$M=OIO #ZZZs.%5`B\8\C^~؉M)4B's2T7P/FR0ګ/ˀpΉ /T wɌEOn޼=ʕ+8Ĺ,YjӧT*MeQXm!ݖl]l(r8Ǐhq>|R_$OIg\0I@;$@W_}믿K"_n %\vM/򶧧G׀ơ!~ |8&Uܹc/IO~lA0|<|'gZ؞>}|5;;{I~嗱O.O%()rחvwׯ +9[%?U8T>xmLk*{눰S WvK .^}GPe0x,7$?uYe ,ʁuIJvBN?{ĎX3gˀR{. E!s/) ###p1.yG g\.G:2jx؅ i'T>cx63eS*#Q;u(fW6LzjttT-h8#G<9f[U`@sFq~zz'XAHR[G\ޥ&eG'`*RNmb~"4֫PǤEER;r\W#n8IIۓ&{5:L߾}B U.as[9F!%+'iT|czԖ张 +pieAcո";L l1F*p^?)SӒZqwކe$g%򡔳f!1Q, Ҽ’ +OCe!YB Ϥ3`9u=*-0Zp/_<a.1P#r 蕻 UKvz }1p6;wB5茧՛mSC%tݜA5BWa18\ę|¸ABJw" ek g#t'"9ccea@۳k,r6!(vw +d aq,@ +w/7تRK"PdUZ(ADR\{;KZmHH`lH+ +ޏ,ᐙ{L⽫2:g>kY{Fc Kv,cZK؅47mb ]BI\>Y2Y^KbvG-IF= nYpsK`0pqE^1lu7`aNOO"#gb]7χapϰ.WA*rn& N^] C1\PT7Ȱ:nnnb.OE???bxX 8hlAB%0B}%r,A0 n+{^jvaZ܎N FawUP- uaXr" n9DЛm4ˋa =$[ܝ D&AC)(8iaВmZC\Ze (̛P]1< 9aUTjccHJ'▶ 9ϫ+Һo-d;.P\E5Add`@WFv^uO)/=999ɒtK(rI-a{3EU:r3~NnjJ3c>HxI7779/&s6-1/?jLIMsgggp^z]ۓ'Գ,e :;; SƄ oPohɁ(H8p{뷷,dHL?Xإ,@ +?...ūa:E0[[[> stream +HTN0+6N$TiJ ̠Ј b[)6@2#ea{|xv[88g~kp8wK>(\F揶EJ {9ۏ]"ҵk wEWwM\Ud+6e9KRBEwzn6om]#Qk{y>wOt;뮙Uׅ}QB<qS4ΰ.VzuVv?!ӌLto'J2#_4VxDFH3FFx+AV%J)/>f彌 +gs !/ߴ& endstream endobj 204 1 obj 612 endobj 205 1 obj << /Filter /FlateDecode /Length 206 1 R /Length1 36606 >> stream +Ht xMksrBf""9&iTk -5TbnbA1<5Om=+ UUr{Nxg:Zg@9ѵKZu3/=ViC /9Z&?S)fjo2 ]论z^]Gqz>CחYz[?O+ gs9<m5B:6al lfֶ."!?v%z-OKR!WH)tS(iJRYPr}5G=^U R25WKi%uƥ%w{J=$%S[A!%{RoRcq +P)t5VԂ8$ױMJ(SfثBCU[E֢EX߬̂n-Q d̗SnRpvN-yyyW7Pyyyֶ6kckk5jVz[N(i1Q|[FNKKKK Kd1Z-R6VVVV'%yQw~c͡xOc_ig"{bCoGmBN+ިX)"? ,O(Qy:HȍɃVO. ->|_?_b8#.ʃreE~`dZjc.6o %H˥@@do`bgn}K}Mr*|)h})K/+|#ӾwheCȱ.]Cμj!2"g$t6鬜 r=r!c -7ӹ/B>rS_?Ax,?ǯ@\`jgb!~/|. Q\` >Id2"I;MBMejvqu<Μz֬#Ri%󗡥`p ^+a )R20Gא,KTX4 0ocn)D3R$ۈjV +9 bMv,ɬ}-bz >ߔ zEn!54'm#ca%JiXOۨ%Jp@f/;Yz7YHj'REnLh^=Eq*o0WoF:χ"= +A"[5jV_eUT\ߢ6h+x)*,'1bV mle!<qdb:j3>qQC*IG>S MD@ 'Rh7l:)Oм$G[X /Y4]aIs q7<vH&,eknԋc@t&E`j6a4 +Y{'|*L)+D1ʤ`>X4ܗfެ n[uQY#G >tA$'%7)q{m\7KxX.;M$8dU&%ƥ}ՇS^MPγk4\<2+֕+EA#Rh'R&!T=v'(rW66(R1r]^'&CutNIΡC!iVYXPVWf PJQ.44Є囦]X͓1TX#u\B1ɡ(3PR\_VgboRi4&|nI8שY#?]|sgc=S1~bEx9^^f1: WiT2FeI˼G_¹ژ]zŸ[ibUٳ; nxv&%ҭ՚5amBO %sA)ܐr @LU[E2 O2<]4a[2qc&-,^gG|m#&!v|a%%i.8:fCSjE?Lm6ëUuTVYn+T[KiI{'3'3۽*ٟ(R Ih DEJ35?KZs'݊mmn36IpE,7uczz+J,{-ْeB8`ޯ b 2Mg +LthP!0MiL: 6VM0+de2-ҩaH<]}sz/ue157z3E`T^:_ *jQ2kv=鏽@ᅹYBB?, [maY a7ZV-jT=x. ޱ0>vag{py8>1;4Vq!f Vd]C1pTM 3C^,sm/yN487 [-3]$!o.̃LClf!F~ ozHh/`}o>U|ˬg2+2(uqxLq)(`F2e&L<=HCp-">GZ_[[lF#4Np.ĨOg)VbI`MBf!ocs*(,c*2+^&  =4% *eXYKRf (QS@2Fi=|OdTYj_SUq&[QsVxEPFiWA)/'1z;뢙"pCÛaOg2aP;бsGv(opl*[yĸ\U*ڮr/.nl, zxɶ]G.snh={2|~la܌(Uoćo_G.<21)Jەʔb”YͲlE QFYqdo8 VvlȜL7F\?NnHhJ }pz:kYֳI'kkazjThMExj;,,tMz~JmPx.fw'*\AqEKLrIg$F/JTbQikΥVNT#j\8shgtM|XiHj.?ҧ>jHHCo23%yiKcqW`.ރ$XVb#3G)*j#^ +-=q;iշd+?q"ض(,W[]Vz?){\5;=JS[}ᯇڂjjle۲dߩ|a^ ȋ_s EN8!J&JYIvNoRa1(/t5Q%f9w=1v)b?bxM.6i-`lɈpL;лiHZ 0*@C?AO7I`?d^<.6jS^]~D{Wnsr{QoqCA"pEH itjtuqHGF.:C I_M3P_ u?@|@.7< {vv#h?=. )pHA +H@y I@Hpc^A*8ՂD :mB-8b:EN|/ wwΞ={|YQüo޳'_ +˶Gk HOܥ{C#| +yemneMq1(6uܹD_致vjlMgѴz ^jHfCvwPρsvbⴍc^K1X8V[Kn`"w!{ګ`_/ Ѝ8[:8^&?>^!EW2| j15ȁOZl\wum'6Pᅦ~(.{@}ssccO8pobY>ϵ5KSzH9{gsm%$׾s8,7YK?홐>ES#|ibq4!ת_]m mw EӈaMsnk(=6 D.r #d} ! n#m6_t,ϫW!^ɼl ,KFݧ'z*פDm b~7gmYus i75wFgC"ߢoSuj[=CTb-$1>det eZ2үw})g};=nhWh.7yZ}6SA>9-2 ϰ仅;-X[;yGrÙo)wYJnB\|»Iq*P,h<^ANuwI/yRGԺ=M]L~sX)&O'VGEʒRMsg}'se8#{w.P;E=eM|':-)wF(Fvǽ +cO@zQErP{seu$TD 4g>{iS EXz粺12_c!w3Sf(N%<ތܩ2E4!ZH%ޭj'{(߭CAvjN/K@}/M =w's^wZ +fPeTG|SʷBv\˩>o|9/q}(zizɘM7 Sb <18.de}>>|>HC;9U꘽AtKϩ4ztؙJzyAu3v[hP۝_RS*,tzyPs6FIGߪ50zm [gN&Q7F쯦uYP: W}ogS[_Ae?7ەy㎧DO@WoGN +KEͦxߕ裋 {8 Gw f=|ە>~Еq|ܝL~UmO$$z5Ouϸr?CXKY_EIap۬Ɨ$H"$H"$H"$n E=A"Ȧ4ܺh{~2<1)jG w:iK_2ܣ !d3Z8N}.43ټ 6sh8 VuD+J:W]jjiD=F +_XsrD5t+dόQTybb4-2.?8\Ez͚?sˤJgcXr_D}qĊVf:8IۑWS,)!RDi$aDRHq[n=@PzLI2N8NsI^&2'8ス;$%P3a[f7]VW$"GWڂOu9g=ږ]LX޲ΦX8g6O'*{ Wuϥ2>[%=SF i[T̹t9jWxѕ(`ʈz᏷TA U͌9K7r\u1Ͼo!Luźso8Ɇ xw53rdC |v9Iʢͱ\8zk2 XW.ʛOnS~Z! wC0 Sm~N1H74LrNy +:ih9l2EKƌOQv ߥڒM+짯 }<%Xe1Xhُ}[LLҭ`k}ke-0ul;5x,a s*:hlk6WX~Y߭( g/U bƤE͖m9O}U\Iti UMPtgMo[2=**m{g,? 38A7'~^^=FIfiR25S93V+ +yZ=UgQVUӁiϹr{wy =/>M{΅EE +#yEJw2jŗe۟G lnEgqƺ:1&lȧ}CRZpY0=ոSF\ p̛nAX_r!ЁwwIgz+$fTW+ƔO,̯/f7 ݣOMIO2r>eo2~:dWkX:_Mq*;&:~{TU(qX+pIѦtND3JtrPb|&c_IƱ8Ί*RjPV,82^4BWy0Y +Ek+bY:qX]'ՒI(TlUb\̆Cżq̜Rƒ}qg1 +8Jʘ_\]::l%qX?22'f8978k箝 +Lhh2C>!xfda#D)JT:S{&2oXR"Z5TC%$muRBW!("TfD#F7vi&ILy`2YuV%lv0*#G4 p2pc2Z6`TTϑnVfŘshrj846>9>cq\ϩSbӻv֝kΔvFoN(q6a)F'4DV'T8`A޿f0 +W#cͦY qjKbCmJLQƨ]:hK+BeUI`0bxӊUƄgaTC+ i i,A0X FTГi$ð#sIEŶՊLEZ:nQ$sI-"֤O67 HaDJ-\V\*.ǜϣ<ܠlјu0A]"!jsQ`GerPpV@8ϓ0WE@e&`EFac¢=CCE,ŠK_eEk,IPF\nD6Taq:䣡6TV11qU.K< 8YAG9]*@u>=i{Yͣo:hu÷ 4|7! \;HЕ(ar6+v/'/H9ВKF\>2;rhd6#M HԼ zHzAtiq%\pnKſ.a ";`'p' x <.C0x8w)< Ge^x <[c8ؗa&`I8a +4^'Ip9aQ\Ox>_E"u%z^)">Lx^S^V0!3@xMohAt σ "x1^ +/+*x5^ &x3 +o;F.xЅx/o"‡(\718|> p |> V"_ _5:| ߂ow=>~?O39~ _o;=?# +?/&&I6eL[Vb2Ԑ233ӕᘱ̽JWO"ՏyowggfՎrȑ#c*rI\Q*ה rKQBA84E1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D:2  +6hvhN.n@OBoA_C @ ` P pHhXxLDL\၆< &c +t@!LEDCa:f`&fa6`.a>`!a1`)a9V`%Va5`-a=6`#6a3`+a;v`'va7`/>!1 ܏ x1<'$x9<p/%W*^xo-w.#|O)>_+|o-?'_+~/Sq,<."%\\5\ -ܥBF;,B'SƢ,,,,ò,cyV`EVbeVaUVcu`Mbma]e>!1)9[%әLVlla[c{v`GvbgvaWvcw{{srsrsGrGs rs'rUM51^8S q*Ì0 89399s9 K˹+k빁]­ýxxGxx'x?|>8|O><_Iȗ2_| ɷ6|~ȏ1? ~ɯ5ȟ3ɿ7O˳<󼠜EK+k$)b88%UҤRBJJ))-eRA*J%,UTRCjJ--uԓ@J#i,M4BZJdH$KZIkɖ6VI{ t.UIwɑSzIo#}2P`"Ce 2RFh#ce 2Q&*h'L)_LD$*1)i2]fL%e̕y2_BY$e,e\VJY%eu^6rl-Uv!;e=Wwr@!9,Gr<` ^7QA⏥Kȗ.X8Uw8p;x kv F]rZfW7)D{wj̲{LՈבS*嘣 Tw,uzRSpV ΁\s3h1…-S?lP3"ܚǧjh!3բ KXf& eL<♆T~fQUy}6UyUQ-EUtvėW%$KԬmw,+`"9Z^ԑ`Pjþ|oLzj@$ˍhFE0` MFlޠQ36[ܪnDqGCI-2Gz'酤edZ$".d[EZYE +˲aMϲ\dY3-;VOaɲBuYʙVIbyϰLkeHO:,gXʖe+.˲˚\`N Aq-=pxUfKHgJyFjhاB& ۞z u ¾g֌*H6$ 4B)qa )n=kjS'&Vnd={orZ@ #p0䍟@wN5kʶXv{/c[g{ggLJO@ffj0]͡-?OצS?f!9349)% %'"=3o]5mW|7Nm'i+%Fg)~0,ڦtR\\IJ/^KǢ0j9v_{?P A/ +4ir#37og.gvWfQ5-ߚ7Z]xg-7̰%Ld^iyŒ;l-io[%KpeӰo]pXbJPU +p׭ %|a5#_pM%쨄oompna/ua\0MTŁ&ᘁi[ inɳaCκհ5kuc. +ߖ7^u f[q#f4aOTn;Cb~+khZ.Nv!Rǽ`yd,,ޘ8i|PaWx` J mնwFjj\Y0}CH0/"E9D[ʊ z9 \؍zO7 'Ůw伏wT]tqK'iIZnGK3XGxhВ,w] %B7[kaqg#*2[C6-yWWܦNh:KM***(?E8.G6G%KQSNQ8)夏S\7?ͮh/K]+!*fz]BbbH m؀«Nu cBmCmch׌ +j۲:&ڵj2BV\5` LnVz6Fi'ŒdBm*Wl3hrq: |ͥVDą3bua ڠQ#|3S_ +r +/6ي#zjw 檹 [n'UîVQw$+E<(+u9T.1S]y#E7*HR +gXVcPn9=!(і)A QPޞ;1%T%D~ H!A%mau $čR+vI;WhOIvQOb4]4 B=]Fձ;V\%^^W4*PF7#NǚN}MTL+Sa˶3Seå#4W, |ᄧ0 +op=6b [.3k`pv('r8/['gQvVEqù'EdJ)Sl]gn.Ƒ#GA|;TQGUsQZ-bed 8V^υ1c!#qK+,8*?lЗ(/y` ]/QcX:Gߥ1 cBW:{%Ul:*U7^9AU Vz倪?,yEJȦUon:kQ=AEZBk3 +Q+{Pr QF!=5/'`Sx*kU:UjYR=٩T.sOŅ3~0{= A`OkZ +&?j;g__lWZij$W9!6E59{ПImЮC[ 0Ѿ=hAm_CKC@j&S[P`+w>Նoݽ;My?_E~V3)EkҞJK_ +e7,;u3_Ojf'v!0۝~xgcя<k~h'^}`9=f6ӗ\58N-\O MK |,pݽ49ߥ2t0U^ggرQb:=jcOM)NJ}Z +&*܉lGw#{t:)mL`Q'NBqO@1*癟޷lK+Ab߃=dF? +w.hq4!<"~FpZ(0c`f?'26ыl<+πjmO@bB*|>|1_^6`Af;.*B??kFEיִ汍$7',mR;EJ:EҦ +BW4"JH<@ E1-R/$3k5P!a9gs쮮o#&p>wEĊ zUJ. c ?V :"odpJP 21sqH\6X\+.o7O AsMo 'a|2,?ˇr:,'e2HA;83$4@ͧd)m*j:B&$;1Mn!$Tpqz+eqQ/@~܋|VC>pj&[",!҅.r~o1L{Q +;CNj/ql$GL>n`0NT;@ l Փtl[̑M8BѦ?ݏf(:Ct~}~:LTWJEGQn<"08}U]/FY|E>TPVyH9NR~.׃7ƃp}E:]8b2Y} +?W!9[")Z/@$gqjz8'>)Nb)v͒_IzVj+ HN;]4WU{z'0D`H Vl G,5ê/W"g@%8vU7Kl gc9Y|EsA9ӄ'qp`hv#MV(;>[fS0-aa6pڼnÆA6kawq۸k.F̶(Yd6l3+i&]{SP䞢wtq_X㞵*?["D#Rꌠ膬+r 9K?SLfSɕ$HC]}xi5iU:%D@I1&d]+^G+RO'$lg&mpCE +Ձ,V$,ь=Md&PGP l`5f-iS&r`Xݘ`ItL5iw1Ƹ8auF:o> moKZ,j5%MfX˭w9h; endstream endobj 206 1 obj 17168 endobj 207 1 obj << /Type /Metadata /Subtype /XML /Length 820 >> stream + + + + + + 2009-08-14T17:55:26Z + 2009-08-14T20:21:11+02:00 + + + + 2009-08-14T17:55:26Z + 2009-08-14T20:21:11+02:00 + Adobe Illustrator 10.0 + 2009-08-14T20:21:11+02:00 + + + + endstream endobj 387 1 obj << /Private 388 1 R /LastModified (D:20090814202111+02'00') >> endobj 388 1 obj << /CreatorVersion 10 /ContainerVersion 9 /RoundtripVersion 10 /AIMetaData 7 1 R /AIPDFPrivateData1 8 1 R /AIPDFPrivateData2 9 1 R /AIPDFPrivateData3 11 1 R /AIPDFPrivateData4 13 1 R /AIPDFPrivateData5 15 1 R /AIPDFPrivateData6 17 1 R /AIPDFPrivateData7 19 1 R /AIPDFPrivateData8 21 1 R /AIPDFPrivateData9 23 1 R /AIPDFPrivateData10 25 1 R /AIPDFPrivateData11 27 1 R /AIPDFPrivateData12 29 1 R /AIPDFPrivateData13 31 1 R /AIPDFPrivateData14 33 1 R /AIPDFPrivateData15 35 1 R /AIPDFPrivateData16 37 1 R /AIPDFPrivateData17 39 1 R /AIPDFPrivateData18 41 1 R /AIPDFPrivateData19 43 1 R /AIPDFPrivateData20 45 1 R /AIPDFPrivateData21 47 1 R /AIPDFPrivateData22 49 1 R /AIPDFPrivateData23 51 1 R /AIPDFPrivateData24 53 1 R /AIPDFPrivateData25 55 1 R /AIPDFPrivateData26 57 1 R /NumBlock 26 >> endobj xref 0 394 0000000004 65535 f +0000000016 00000 n +0000000088 00000 n +0000000152 00000 n +0000000006 00003 f +0000000313 00000 n +0000000072 00002 f +0000001049 00001 n +0000002342 00001 n +0000012940 00001 n +0000027009 00001 n +0000027032 00001 n +0000044299 00001 n +0000044322 00001 n +0000065225 00001 n +0000065248 00001 n +0000084882 00001 n +0000084905 00001 n +0000092336 00001 n +0000092358 00001 n +0000095882 00001 n +0000095904 00001 n +0000117632 00001 n +0000117655 00001 n +0000139218 00001 n +0000139241 00001 n +0000153987 00001 n +0000154010 00001 n +0000160253 00001 n +0000160275 00001 n +0000161293 00001 n +0000161314 00001 n +0000162385 00001 n +0000162406 00001 n +0000164284 00001 n +0000164306 00001 n +0000166111 00001 n +0000166133 00001 n +0000167926 00001 n +0000167948 00001 n +0000169814 00001 n +0000169836 00001 n +0000171332 00001 n +0000171354 00001 n +0000172428 00001 n +0000172449 00001 n +0000174025 00001 n +0000174047 00001 n +0000175542 00001 n +0000175564 00001 n +0000177153 00001 n +0000177175 00001 n +0000178573 00001 n +0000178595 00001 n +0000180061 00001 n +0000180083 00001 n +0000181561 00001 n +0000181583 00001 n +0000182001 00001 n +0000182022 00001 n +0000182109 00001 n +0000182138 00001 n +0000182167 00001 n +0000182252 00001 n +0000183049 00001 n +0000183070 00001 n +0000183146 00001 n +0000183227 00001 n +0000183314 00001 n +0000183399 00001 n +0000184017 00001 n +0000184038 00001 n +0000000078 00002 f +0000184114 00001 n +0000184201 00001 n +0000184286 00001 n +0000184905 00001 n +0000184926 00001 n +0000000084 00002 f +0000185002 00001 n +0000185089 00001 n +0000185174 00001 n +0000185791 00001 n +0000185812 00001 n +0000000090 00002 f +0000185888 00001 n +0000185975 00001 n +0000186060 00001 n +0000186678 00001 n +0000186699 00001 n +0000000096 00002 f +0000186775 00001 n +0000186862 00001 n +0000186947 00001 n +0000187380 00001 n +0000187401 00001 n +0000000099 00002 f +0000187477 00001 n +0000187564 00001 n +0000000103 00002 f +0000187649 00001 n +0000188083 00001 n +0000188105 00001 n +0000000105 00002 f +0000188182 00001 n +0000000110 00002 f +0000188270 00001 n +0000188356 00001 n +0000188776 00001 n +0000188798 00001 n +0000000111 00002 f +0000000117 00002 f +0000188875 00001 n +0000188963 00001 n +0000189049 00001 n +0000189493 00001 n +0000189515 00001 n +0000000118 00002 f +0000000123 00002 f +0000189592 00001 n +0000189680 00001 n +0000189766 00001 n +0000190210 00001 n +0000000125 00002 f +0000190232 00001 n +0000000129 00002 f +0000190309 00001 n +0000190397 00001 n +0000190483 00001 n +0000000132 00002 f +0000190927 00001 n +0000190949 00001 n +0000000135 00002 f +0000191026 00001 n +0000191114 00001 n +0000000139 00002 f +0000191200 00001 n +0000191650 00001 n +0000191672 00001 n +0000000141 00002 f +0000191749 00001 n +0000000146 00002 f +0000191837 00001 n +0000191923 00001 n +0000192358 00001 n +0000192380 00001 n +0000000147 00002 f +0000000153 00002 f +0000192457 00001 n +0000192545 00001 n +0000192631 00001 n +0000193069 00001 n +0000193091 00001 n +0000000154 00002 f +0000000159 00002 f +0000193168 00001 n +0000193256 00001 n +0000193342 00001 n +0000193780 00001 n +0000000161 00002 f +0000193802 00001 n +0000000165 00002 f +0000193879 00001 n +0000195116 00001 n +0000195362 00001 n +0000000170 00002 f +0000195450 00001 n +0000195536 00001 n +0000196052 00001 n +0000196074 00001 n +0000000171 00002 f +0000000177 00002 f +0000196151 00001 n +0000196175 00001 n +0000214740 00001 n +0000215036 00001 n +0000215057 00001 n +0000000183 00002 f +0000215134 00001 n +0000215218 00001 n +0000215242 00001 n +0000228164 00001 n +0000228459 00001 n +0000000185 00002 f +0000228480 00001 n +0000000189 00002 f +0000228557 00001 n +0000228645 00001 n +0000228731 00001 n +0000000192 00002 f +0000229252 00001 n +0000229274 00001 n +0000000198 00002 f +0000229351 00001 n +0000229439 00001 n +0000229525 00001 n +0000230047 00001 n +0000230069 00001 n +0000000203 00002 f +0000230146 00001 n +0000230240 00001 n +0000234895 00001 n +0000234918 00001 n +0000000208 00002 f +0000235610 00001 n +0000235632 00001 n +0000252895 00001 n +0000252919 00001 n +0000000209 00001 f +0000000210 00002 f +0000000211 00001 f +0000000212 00001 f +0000000213 00001 f +0000000214 00001 f +0000000215 00001 f +0000000216 00002 f +0000000217 00001 f +0000000218 00002 f +0000000219 00002 f +0000000220 00001 f +0000000221 00001 f +0000000222 00001 f +0000000223 00001 f +0000000224 00001 f +0000000225 00001 f +0000000226 00001 f +0000000227 00001 f +0000000228 00001 f +0000000229 00001 f +0000000230 00001 f +0000000231 00001 f +0000000232 00001 f +0000000233 00001 f +0000000234 00001 f +0000000235 00001 f +0000000236 00001 f +0000000237 00001 f +0000000238 00001 f +0000000239 00001 f +0000000240 00001 f +0000000241 00001 f +0000000242 00001 f +0000000243 00001 f +0000000244 00001 f +0000000245 00001 f +0000000246 00001 f +0000000247 00001 f +0000000248 00001 f +0000000249 00001 f +0000000250 00001 f +0000000251 00001 f +0000000252 00001 f +0000000253 00001 f +0000000254 00001 f +0000000255 00001 f +0000000256 00001 f +0000000257 00001 f +0000000258 00001 f +0000000259 00001 f +0000000260 00001 f +0000000261 00001 f +0000000262 00001 f +0000000263 00001 f +0000000264 00001 f +0000000265 00001 f +0000000266 00001 f +0000000267 00001 f +0000000268 00001 f +0000000269 00001 f +0000000270 00001 f +0000000271 00001 f +0000000272 00001 f +0000000273 00001 f +0000000274 00001 f +0000000275 00001 f +0000000276 00001 f +0000000277 00001 f +0000000278 00001 f +0000000279 00001 f +0000000280 00001 f +0000000281 00001 f +0000000282 00001 f +0000000283 00001 f +0000000284 00001 f +0000000285 00001 f +0000000286 00001 f +0000000287 00001 f +0000000288 00001 f +0000000289 00001 f +0000000290 00001 f +0000000291 00001 f +0000000292 00001 f +0000000293 00001 f +0000000294 00001 f +0000000295 00001 f +0000000296 00001 f +0000000297 00001 f +0000000298 00001 f +0000000299 00001 f +0000000300 00001 f +0000000301 00001 f +0000000302 00001 f +0000000303 00001 f +0000000304 00001 f +0000000305 00001 f +0000000306 00001 f +0000000307 00001 f +0000000308 00001 f +0000000309 00001 f +0000000310 00001 f +0000000311 00001 f +0000000312 00001 f +0000000313 00001 f +0000000314 00001 f +0000000315 00001 f +0000000316 00001 f +0000000317 00001 f +0000000318 00001 f +0000000319 00001 f +0000000320 00001 f +0000000321 00001 f +0000000322 00001 f +0000000323 00001 f +0000000324 00001 f +0000000325 00001 f +0000000326 00001 f +0000000327 00001 f +0000000328 00001 f +0000000329 00001 f +0000000330 00001 f +0000000331 00001 f +0000000332 00001 f +0000000333 00001 f +0000000334 00001 f +0000000335 00001 f +0000000336 00001 f +0000000337 00001 f +0000000338 00001 f +0000000339 00001 f +0000000340 00001 f +0000000341 00001 f +0000000342 00001 f +0000000343 00001 f +0000000344 00001 f +0000000345 00001 f +0000000346 00001 f +0000000347 00001 f +0000000348 00001 f +0000000349 00001 f +0000000350 00001 f +0000000351 00001 f +0000000352 00001 f +0000000353 00001 f +0000000354 00001 f +0000000355 00001 f +0000000356 00001 f +0000000357 00001 f +0000000358 00001 f +0000000359 00001 f +0000000360 00001 f +0000000361 00001 f +0000000362 00001 f +0000000363 00001 f +0000000364 00001 f +0000000365 00001 f +0000000366 00001 f +0000000367 00001 f +0000000368 00001 f +0000000369 00001 f +0000000370 00001 f +0000000371 00001 f +0000000372 00001 f +0000000373 00001 f +0000000374 00001 f +0000000375 00001 f +0000000376 00001 f +0000000377 00001 f +0000000378 00001 f +0000000379 00001 f +0000000380 00001 f +0000000381 00001 f +0000000382 00001 f +0000000383 00001 f +0000000384 00001 f +0000000385 00001 f +0000000386 00001 f +0000000389 00001 f +0000253824 00001 n +0000253907 00001 n +0000000390 00001 f +0000000391 00001 f +0000000392 00001 f +0000000393 00001 f +0000000000 00001 f +trailer << /Size 394 /Info 3 0 R /Root 1 0 R /ID[<24654b74c41f1535dc733f16dee3876d>] >> startxref 254745 %%EOF \ No newline at end of file diff --git a/source/Misc/FastI.cpp b/source/Misc/FastI.cpp new file mode 100644 index 0000000..c3d6188 --- /dev/null +++ b/source/Misc/FastI.cpp @@ -0,0 +1,29 @@ +#define getint(n) int n; read(n) +#define getll(n) ll n; read(n) +#define inta getint(a) +#define intab getint(a); getint(b) +char get() { + static char buf[100000], *S=buf, *T=buf; + if(S == T) { + S = buf; T = buf + fread(buf, 1, 100000, stdin); + if(S == T) return EOF; + } + return *S++; +} +void read(int& n) { + n = 0; char c; bool neg = false; + for(c = get(); c < '0'; c=get()) if(c=='-') neg = true; + for(;c>='0';c=get()) n = n*10+c-'0'; + if(neg) n = -n; +} +void read(ll& n) { + n = 0; char c; bool neg = false; + for(c = get(); c < '0'; c=get()) if(c=='-') neg = true; + for(;c>='0';c=get()) n = n*10+c-'0'; + if(neg) n = -n; +} +int read(char s[]) { + char c; int p = 0; while((c = get()) <= ' '); + s[p++] = c; while((c = get()) >= ' ') s[p++] = c; + s[p] = '\0'; return p; +} \ No newline at end of file diff --git a/source/Misc/NegDiv.cpp b/source/Misc/NegDiv.cpp new file mode 100644 index 0000000..e0bbf90 --- /dev/null +++ b/source/Misc/NegDiv.cpp @@ -0,0 +1,7 @@ +#define div _div +ll div(ll A, ll B) +{ + ll q = A/B; + if(A<0) q-=(B>0)-(B<0); + return q; +} \ No newline at end of file diff --git a/source/Misc/StressTest.sh b/source/Misc/StressTest.sh new file mode 100644 index 0000000..e69de29 diff --git a/source/Misc/mt19937.cpp b/source/Misc/mt19937.cpp new file mode 100644 index 0000000..0be15b7 --- /dev/null +++ b/source/Misc/mt19937.cpp @@ -0,0 +1,7 @@ +const long long rand_L = 1; +const long long rand_R = 10; +mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); +uniform_int_distribution dist(rand_L, rand_R); +auto gen = bind(dist, rng); + +gen(); gen(); gen(); \ No newline at end of file diff --git a/source/String/AhoCorasick.cpp b/source/String/AhoCorasick.cpp new file mode 100644 index 0000000..5daf91f --- /dev/null +++ b/source/String/AhoCorasick.cpp @@ -0,0 +1,49 @@ +struct Node { + int next[26]; int par, int fail; bool isfin = false; + Node(){fail = 0; fors(i, 0, 25) next[i] = -1;} +}; +Node trie[N]; int c; +void insert(char s[], int i, int node) { + if(s[i] == '\0') { + trie[node].isfin = true; return; + } + if(trie[node].next[s[i]-'a'] == -1) { + trie[node].next[s[i]-'a'] = ++c; + trie[c].par = node; + } + insert(s, i+1, trie[node].next[s[i]-'a']); +} +void bfs() { + queue q; q.push({0, -1}); + while(!q.empty()) { + auto [node, x] = q.front(); q.pop(); + if(x != -1) { + int pf = trie[trie[node].par].fail; + while(pf != 0 and trie[pf].next[x] == -1) pf = trie[pf].fail; + + if(trie[node].par != 0 and trie[pf].next[x] != -1) + { + trie[node].fail = trie[pf].next[x]; + trie[node].isfin |= trie[trie[pf].next[x]].isfin; + } + else trie[node].fail = 0; + } + fors(i, 0, 25) { + if(trie[node].next[i] == -1) continue; + q.push({trie[node].next[s[i]-'a'], i}); + } + } +} + +// For char* s, insert(s+1, 0, 0); +// trie[0].fail = 0; bfs(); +// find trie from s: +int now = 0, ok = false; +for(int i = 0; s[i]; i++) { + while(now != 0 and trie[now].next[s[i]-'a'] == -1) now = trie[now].fail; + + if(trie[now].next[s[i]-'a'] != -1) { + now = trie[now].next[s[i]-'a']; + if(trie[now].isfin) ok = true; + } +} \ No newline at end of file diff --git a/source/String/Eertree.cpp b/source/String/Eertree.cpp new file mode 100644 index 0000000..beee3a7 --- /dev/null +++ b/source/String/Eertree.cpp @@ -0,0 +1,38 @@ +struct Eertree { + int len[N], link[N], nxt[N][26], r[N]; + long long cnt[N]; int sz, last, n; + char s[N]; + Eertree() { + memset(nxt, 0, sizeof(nxt)); + memset(cnt, 0, sizeof(cnt)); + s[0] = -1; + n = 0; sz = 2; last = 1; + len[0] = -1; link[0] = 0; + len[1] = 0; link[1] = 0; + } + int get_link(int v) { + while (s[n-len[v]-1] != s[n]) v = link[v]; + return v; + } + void insert(char c) { + s[++n] = c; + int cur = get_link(last); + if (!nxt[cur][c-'a']) { + int now = sz++; + r[now] = n; + len[now] = len[cur] + 2; + if (len[now] == 1) link[now] = 1; + else link[now] = nxt[get_link(link[cur])][c-'a']; + nxt[cur][c-'a'] = now; + } + last = nxt[cur][c-'a']; + cnt[last]++; + } + void propagate() { fore(i, sz-1, 2) cnt[link[i]] += cnt[i]; } +}; + +Eertree et; forr(i, n) et.insert(s[i]); +int m = et.sz; et.propagate(); +fors(i, 2, m-1) ans = max(ans, et.cnt[i] * et.len[i]); +// node i : s[(et.r[i]-et.len[i]+1)~(et.r[i])] +// distinct count of pal : m-2; count of node i : et.cnt[i]; \ No newline at end of file diff --git a/source/String/F_Z_M_SA_LCP.cpp b/source/String/F_Z_M_SA_LCP.cpp new file mode 100644 index 0000000..3c1e4eb --- /dev/null +++ b/source/String/F_Z_M_SA_LCP.cpp @@ -0,0 +1,92 @@ +const int N = 1e5+7; +char s[N]; +int F[N], Z[N], M[N]; +int sa[N]; int ord[N], tmp[N], cnt[N]; +int lcp[N]; +int main() { + scanf("%s", s+1); + int n = strlen(s+1); + + // KMP - fail function { + F[1] = 0; int j = 0; + for(int i=2; i<=n;i++) + { + while(j > 0 and s[i] != s[j+1]) j = F[j]; + F[i] = j+=(s[i] == s[j+1]); + } + } + + //Z - Z array { + Z[1] = n; int j = 1, r = 0; + for(int i=2; i<=n; i++) + { + Z[i] = i 0) k--; + } + } + + printf("\nF : "); forr(i, n) printf("%d ", F[i]); + printf("\nZ : "); forr(i, n) printf("%d ", Z[i]); + printf("\nM : "); forr(i, n) printf("%d ", M[i]); + printf("\nSA : "); forr(i, n) printf("%d ", sa[i]); + printf("\nLCP : x "); fors(i, 2, n) printf("%d ", lcp[i]); + + printf("\n"); forr(i, n) printf("%s\n", s+sa[i]); +} \ No newline at end of file diff --git a/source/String/KMP.cpp b/source/String/KMP.cpp new file mode 100644 index 0000000..dcbd99b --- /dev/null +++ b/source/String/KMP.cpp @@ -0,0 +1,17 @@ +int fail[N]; // N : s의 최대 길이 +vi kmp(char obj[], char s[]) { + vi ret; + for(int i = 1, j = 0; s[i]; i++) { + fail[i] = 0; + while(j > 0 and s[i] != s[j]) j = fail[j-1]; + if(s[i] == s[j]) fail[i] = ++j; + } + for(int i = 0, j = 0; obj[i]; i++) { + while(j > 0 and obj[i] != s[j]) j = fail[j-1]; + if(obj[i] == s[j]) { + if(s[j+1]) j++; + else ret.push_back(i-j), j = fail[j]; + } + } + return ret; +} \ No newline at end of file diff --git a/source/String/std::string.cpp b/source/String/std::string.cpp new file mode 100644 index 0000000..417a0bd --- /dev/null +++ b/source/String/std::string.cpp @@ -0,0 +1,132 @@ +///////////////////////////////////////////////////////// +string s; //변수 선언 +///////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////// +string s = "Hwan"; //output : Hwan +///////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////// +string s1("Hwan"); //output ㄷ: Hwan +string s2(4, 'A'); //output : AAAA +string s3(s1, 0, s1.length() - 2); //output : HW +string s4(s1, 2, s1.length()); //output : an +string s5(s2); //output : AAAA +string s6("ABCDE", 3); //output : ABC + +char c[] = "TEST Code!!"; +string s7(c); //output : TEST Code!! +/////////////////////////////////////////////////////////​ +string s = "ABCDE123"; + +cout << s.at(2) << endl; //output : C (범위가 맞지 않으면 예외처리를 함) +cout << s[0] << endl; //output : A +cout << s.front() << endl; //output : A +cout << s.back() << endl; //output : 3 + +const char * c = s.c_str(); //배열로써 접근이 가능하며 '\0'에 접근이 가능하다. + +cout << c << endl; //output : ABCDE123 + +cout << (c_arr == s) ? true : false; //output : 1(true) +cout << (&(c_arr[0]) == &(s[0])) ? true : false; //output : 1(true)​ + +///////////////////////////////////////////////////////// +string s = "ABCDE123"; +string::iterator iter = s.begin(); +string r_s, cp; + +for (; iter != s.end(); iter++) { + cout << *iter; + if (*iter == 'E') + break; +} //output : ABCDE + + +copy(s.rbegin(), s.rend(), back_inserter(r_s)); +copy(s.begin(), s.end(), back_inserter(cp)); + +cout << r_s << endl; //output : 321EDCBA +cout << (s == r_s) ? true : false; //output : 0(false) +cout << (s == cp) ? true : false; //output : 1(true) +cout << (&(s[0]) == &(cp[0])) ? true : false; //output : 0(false)​ +///////////////////////////////////////////////////////// +string s = "ABCDE123" + +s.insert(0, "TEST"); //output : TESTABCDE123 +s.insert(s.begin() + s.find_first_of('D') + 1, ':'); // output : TESTABCD:123(문자만 가능) + + +////////// (compare) s = TESTABCD:123 ///////////// +s.compare("TESTABCD:123"); //output : 0 +s.compare("a"); //output : -1 +s.compare("X"); //output : -1 +s.compare("BBBBBBBBBBBBBBB"); //output : 1 +s.compare("100000000000000000000000"); //output : 1 +s.compare("VVVVV"); //output : -1 + + +////////// (erase) s = TESTABCD:123 ///////////// +s.erase(0, 4); //output : ABCD:123 +s.erase(find(s.begin(), s.end(), 'D')); //output : ABC:123('D'만 지움) +s.erase(s.find(':')); //output : ABC(':'부터 뒤 문자까지 모두 지움) + + +////////// (push, pop) s = ABC ///////////// +s.push_back('S'); //output : ABCS +s.pop_back(); //output : ABC + + +////////// (append) s = ABC ///////////// +s.append("TEST"); //output : ABCTEST +s.append(1, '1'); //output : ABCTEST1 +s.append("123456789", 3, 3); //output : ABCTEST1456 + + +////////// (clear) s = ABCTEST1456 ///////////// +const char c[] = "Hwan"; +s.append(c); //output : ABCTEST1456Hwan +s += c; //output : ABCTEST1456HwanHwan(capacity() = 15 -> 31) +s.clear(); //s.size() = 0, s.capacity() = 31 + + +////////// (replace) s = '' ///////////// +s.append("ABCD123"); //output : ABCD123 +s.replace(4, 2, "Hwan"); //output : ABCDHwan3 +s.replace(s.find('H'), s.size() - s.find('H'), "WOW"); //output : ABCDWOW + + +////////// (substr) s = ABCDWOW ///////////// +string temp = s.substr(4); //output : WOW; +temp = s.substr(3, 2); //output : DW; +temp = s.substr(s.size() - 3, 50); //output : WOW; + + +////////// (copy) s = ABCDWOW ///////////// +char arr[5]{}; +s.copy(arr, sizeof arr - 1); //output : ABCD (마지막 '\n' 포함) + + +////////// (resize) s = ABCDWOW ///////////// +s.resize(100); //output : ABCDWOW, s.size() = 100, s.capacity() = 111 +s.resize(4); //output : ABCD, s.size() = 4, s.capacity() = 15 + + +////////// (swap) s = ABCD ///////////// +string sw = "AAA"; +s.swap(sw); //s = "AAA", sw = "ABCD" + + +/////////// c++ 20 /////////////////// +s = "hello Hwan"; +s.starts_with("hello"); //output : true; +s.starts_with('h'); //output : true; +s.starts_with("Hwan"); //output : false; +s.starts_with('x'); //output : false; + +s.ends_with("Hwan"); //output : true; +s.ends_with('n'); //output : true; +s.ends_with("hello"); //output : false; +s.ends_with('q'); //output : false; \ No newline at end of file diff --git a/source/Technic/CartesianTree.cpp b/source/Technic/CartesianTree.cpp new file mode 100644 index 0000000..78de742 --- /dev/null +++ b/source/Technic/CartesianTree.cpp @@ -0,0 +1,13 @@ +int A[N], par[N]; +stack st; +forr(i, n) { + int l = -1; + while(!st.empty() && A[st.top()] < A[i]) + l = st.top(), st.pop(); + if(l != -1) par[l] = i; + if(!st.empty()) par[i] = st.top(); + st.push(i); +} + +while(st.size() != 1) st.pop(); +par[st.top()] = st.top(); \ No newline at end of file diff --git a/source/Tree/Centroid.cpp b/source/Tree/Centroid.cpp new file mode 100644 index 0000000..8386917 --- /dev/null +++ b/source/Tree/Centroid.cpp @@ -0,0 +1,30 @@ +vi adj[N]; bool cent[N]; +int sz[N], par[N]; + +void getSz(int s){ + sz[s] = 1; + for(auto i:adj[s]){ + if(cent[i]) continue; if(par[s] == i) continue; + par[i] = s; getSz(i); par[i] = 0; + sz[s] += sz[i]; + } +} +int getCent(int s, int n){ + for(auto i:adj[s]) if(!cent[i]&&sz[i]n/2) + return getCent(i, n); + return s; +} + +int cpar[N]; +int getCentTree(int s){ + getSz(s); int C = getCent(s, sz[s]); + cent[C] = true; + for(auto i:adj[C]){ + if(cent[i]) continue; + int c = getCentTree(i); + cpar[c] = C; + } + return C; +} + +int C = getCentTree(1); cpar[C] = -1; \ No newline at end of file diff --git a/source/Tree/HLD.cpp b/source/Tree/HLD.cpp new file mode 100644 index 0000000..8fc6741 --- /dev/null +++ b/source/Tree/HLD.cpp @@ -0,0 +1,40 @@ +BOJ 트리와 쿼리 1 +1 i c: i번 간선의 비용을 c로 바꾼다. +2 u v: u에서 v로 가는 단순 경로에 존재하는 비용 중에서 가장 큰 것을 출력한다. + +vi adj[N]; int par[N]; int sz[N]; int d[N]; +void dfs1(int s) { + sz[s] = 1; + for(auto it=adj[s].begin(); it!=adj[s].end(); it++) + if(*it == par[s]) {adj[s].erase(it); break;} + for(auto &i : adj[s]) { + par[i] = s; d[i] = d[s] + 1; + dfs1(i); sz[s] += sz[i]; + if(sz[i] > sz[adj[s][0]]) swap(adj[s][0], i); + } +} +int in[N], c; int top[N]; +void dfs2(int s) { + in[s] = ++c; + for(auto i : adj[s]) { + if(i == adj[s].front()) top[i] = top[s]; + else top[i] = i; + dfs2(i); + } +} + +int query(int a,int b) { + int ans = 0; + while(top[a] != top[b]) { + if(d[top[a]] > d[top[b]]) swap(a, b); + ans = max(ans, query(root, in[top[b]], in[b])); + b = par[top[b]]; + } + if(d[a] > d[b]) swap(a, b); + return max(ans, query(root, in[a]+1, in[b])); +} + +// dfs1(1); dfs2(1); +// forr(i, n) arr[in[i]] = m[{par[i], i}]; init(root, arr); +// q == 1: update(root, in[a], c); // in[a]를 c로 대체 +// q == 2: query(a, b); \ No newline at end of file diff --git a/source/empty.cpp b/source/empty.cpp new file mode 100644 index 0000000..e69de29 diff --git a/source/poro.sh b/source/poro.sh new file mode 100644 index 0000000..cf77aec --- /dev/null +++ b/source/poro.sh @@ -0,0 +1,3 @@ +mkdir {A..M} +alias solve='g++ main.cpp -o solve_exefile -g -fsanitize=undefined,address -fno-omit-frame-pointer -Wall -Wextra && echo "Compile Done" && time ./solve_exefile' +alias fast='g++ main.cpp -o solve_exefile -O2 -Wall && echo "Compile Done" && time ./solve_exefile' diff --git a/source/qwerty.cpp b/source/qwerty.cpp new file mode 100644 index 0000000..814825a --- /dev/null +++ b/source/qwerty.cpp @@ -0,0 +1,7 @@ +#pragma GCC optimize("O3") +#pragma GCC optimize("Ofast") +#pragma GCC optimize("unroll-loops") + +#define endl '\n' +#define foreach(i, l, r) for(ll i=(l); i<=(r); i++) +#define forreach(i, l, r) for(ll i=l; i>=(r); i--) \ No newline at end of file diff --git a/teamnote.sty b/teamnote.sty new file mode 100644 index 0000000..9b2fc5d --- /dev/null +++ b/teamnote.sty @@ -0,0 +1,114 @@ + +\ProvidesPackage{teamnote} + +\usepackage[left=1cm,right=1cm,top=2cm,bottom=1cm,a4paper]{geometry} +\usepackage{fancyhdr} +\usepackage{lastpage} +\usepackage{minted} +\usepackage{color} +\usepackage{indentfirst} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{import} +\usepackage{caption} +\usepackage[table,xcdraw]{xcolor} +\usepackage[T1]{fontenc} +\usepackage{setspace} + +\setstretch{1} % No line-spacing + +\renewcommand{\@listI}{% No spacing on list +\leftmargin=25pt +\rightmargin=0pt +\labelsep=5pt +\labelwidth=20pt +\itemindent=0pt +\listparindent=0pt +\topsep=0pt plus 2pt minus 4pt +\partopsep=0pt plus 1pt minus 1pt +\parsep=0pt plus 1pt +\itemsep=\parsep} + +\setlength{\columnseprule}{0.4pt} +\pagenumbering{arabic} +\setminted{breaklines=true, tabsize=2, breaksymbolleft=} +\usemintedstyle{perldoc} + +\newcommand{\revised}{Should be \textcolor{red}{\textbf{revised}}.} +\newcommand{\tested}{Should be \textcolor{red}{\textbf{tested}}.} +\newcommand{\added}{Should be \textcolor{red}{\textbf{added}}.} +\newcommand{\WIP}{\textcolor{red}{\textbf{Working in progress.}}} + +\newcommand{\schoolname}{Some University} +\newcommand{\teamname}{Some Teamname} +\newcommand{\authorname}{Some Members} +\newcommand{\contestname}{Some Contest} + +\newcommand{\maketitlepage}{\maketitle + +\tableofcontents + +\thispagestyle{fancy} + +} +\DeclareRobustCommand{\teamnote}[4]{ + \renewcommand{\schoolname}{#1} + \renewcommand{\teamname}{#2} + \renewcommand{\authorname}{#3} + \renewcommand{\contestname}{#4} +} +\pagestyle{fancy} +% \lhead{\schoolname{} -- \teamname} +% \rhead{Page \thepage{} of +\rhead{\schoolname{} -- \teamname -- \contestname} +\lhead{Page \thepage{} of +\ifthenelse{\pageref{LastPage} < 26}{\pageref{LastPage}}{\textcolor{red}{\textbf{\pageref{LastPage}}}}} +\fancyfoot{} + +\title{Team Note of \teamname} +\author{\authorname} +\date{Compiled on \today} + + + + +\newboolean{BangShowUsage} +\setboolean{BangShowUsage}{false} +\newcommand{\ShowUsage}{\setboolean{BangShowUsage}{false}} +\newcommand{\HideUsage}{\setboolean{BangShowUsage}{true}} + + +\newboolean{BangShowComplexity} +\setboolean{BangShowComplexity}{false} +\newcommand{\ShowComplexity}{\setboolean{BangShowComplexity}{false}} +\newcommand{\HideComplexity}{\setboolean{BangShowComplexity}{true}} + + +\newboolean{BangShowAuthor} +\setboolean{BangShowAuthor}{false} +\newcommand{\ShowAuthor}{\setboolean{BangShowAuthor}{false}} +\newcommand{\HideAuthor}{\setboolean{BangShowAuthor}{true}} + +\newcommand{\Algorithm}[6]{ + \subsection{#1} + + \ifthenelse{\equal{#2}{} \OR \boolean{BangShowUsage}}{}{\textbf{Usage:} #2} + + \ifthenelse{\equal{#3}{} \OR \boolean{BangShowComplexity}}{}{\textbf{Time Complexity:} #3} + + \ifthenelse{\equal{#6}{} \OR \boolean{BangShowAuthor}}{}{\textbf{Author:} #6} + + \ifthenelse{\equal{#5}{}}{}{\ifthenelse{\equal{#4}{}}{\inputminted[]{cpp}{#5}}{\inputminted[]{#4}{#5}}} +} + +\newcommand{\SubAlgorithm}[6]{ + \subsubsection{#1} + + \ifthenelse{\equal{#2}{} \OR \boolean{BangShowUsage}}{}{\textbf{Usage:} #2} + + \ifthenelse{\equal{#3}{} \OR \boolean{BangShowComplexity}}{}{\textbf{Time Complexity:} #3} + + \ifthenelse{\equal{#6}{} \OR \boolean{BangShowAuthor}}{}{\textbf{Author:} #6} + + \ifthenelse{\equal{#5}{}}{}{\ifthenelse{\equal{#4}{}}{\inputminted[]{cpp}{#5}}{\inputminted[]{#4}{#5}}} +}