From 7b2cb0e324ea5531d490add25c6ffb2097f67099 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 20 Oct 2002 11:00:23 +0000 Subject: [PATCH] sistemate varie figure, finita prima stesura file locking POSIX --- fileadv.tex | 182 +++++++++++++++++++++++++++++++++++++------- fileunix.tex | 34 ++++----- img/file_flock.dia | Bin 4027 -> 4099 bytes img/filedup.dia | Bin 2886 -> 2975 bytes img/filemultacc.dia | Bin 3777 -> 3919 bytes img/fileshar.dia | Bin 3752 -> 3813 bytes img/procfile.dia | Bin 3837 -> 3887 bytes 7 files changed, 172 insertions(+), 44 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 349d157..084f783 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1286,7 +1286,6 @@ gi \subsection{La funzione \func{flock}} \label{sec:file_flock} - La prima interfaccia per il file locking, quella derivata da BSD, permette di eseguire un blocco solo su un intero file; la funzione usata per richiedere e rimuovere un \textit{file lock} è \func{flock}, ed il suo prototipo è: @@ -1397,16 +1396,21 @@ condividono la stessa voce nella file table, e quindi, nel caso di file descriptor ereditati attraverso una \func{fork}, anche su processi diversi. Infine, per evitare che la terminazione imprevista di un processo lasci attivi -dei file lock, è previsto che quando un file viene chiuso il kernel provveda -anche a rimuovere tutti i lock ad esso associati. Anche in questo caso occorre -tenere presente cosa succede quando si hanno file descriptor duplicati; in tal -caso infatti il file non verrà effettivamente chiuso (ed il lock rimosso) -fintanto che non viene rilasciata la relativa voce nella file table; la -rimozione cioè avverrà solo quando tutti i file descriptor che fanno -riferimento alla stessa voce sono stati chiusi, quindi, nel caso ci siano -processi figli che mantengono ancora aperto un file descriptor, il lock non -sarà rilasciato. +dei file lock, quando un file viene chiuso il kernel provveda anche a +rimuovere tutti i lock ad esso associati. Anche in questo caso occorre tenere +presente cosa succede quando si hanno file descriptor duplicati; in tal caso +infatti il file non verrà effettivamente chiuso (ed il lock rimosso) fintanto +che non viene rilasciata la relativa voce nella file table; la rimozione cioè +avverrà solo quando tutti i file descriptor che fanno riferimento alla stessa +voce sono stati chiusi, quindi, nel caso ci siano processi figli che +mantengono ancora aperto un file descriptor, il lock non sarà rilasciato. +Si tenga presente che \func{flock} non è in grado di funzionare per i file +mantenuti su NFS, in questo caso, se si ha la necessità di eseguire il +\textit{file locking}, occorre usare l'interfaccia basata su \func{fcntl} che +può funzionare anche attraverso NFS, a condizione che sia il client che il +server supportino questa funzionalità. + \subsection{Il file locking POSIX} \label{sec:file_posix_lock} @@ -1414,8 +1418,8 @@ sar La seconda interfaccia per l'\textit{advisory locking} disponibile in Linux è quella standardizzata da POSIX, basata sulla funzione \func{fcntl}. Abbiamo già trattato questa funzione nelle sue molteplici funzionalità in -\secref{sec:file_fcntl}, quando la si impiega per il \textit{file locking} -però essa viene usata secondo il prototipo: +\secref{sec:file_fcntl}; quando la si impiega per il \textit{file locking} +però essa viene usata solo secondo il prototipo: \begin{prototype}{fcntl.h}{int fcntl(int fd, int cmd, struct flock *lock)} Applica o rimuove un \textit{file lock} sul file \param{fd}. @@ -1440,21 +1444,13 @@ per } \end{prototype} -Si tenga presente che \func{flock} non è in grado di funzionare per i file -manetenuti su NFS, in questo caso, se si ha la necessità di eseguire il -\textit{file locking}, occorre usare l'interfaccia basata su \func{fcntl} che -può funzionare anche attraverso NFS, a condizione che sia il client che il -server supportino questa funzionalità. - -La standardizzatione operata con POSIX.1 ha adottato le API per il -\textit{file locking} originarie di System V, basate sulla funzione - - - -Al contrario di \func{flock} con \func{fcntl} è possibile bloccare anche solo -delle sezioni di un file. La funzione prende come argomento una struttura -\var{flock} la cui definizione è riportata in \figref{fig:struct_flock}. - +Al contrario di quanto avviene con l'interfaccia basata su \func{flock} con +\func{fcntl} è possibile bloccare anche delle singole sezioni di un file; +inoltre la funzione permette di leggere le informazioni relative ai blocchi +esistenti. Per poter fare tutto questo la funzione utilizza come terzo +argomento una apposita struttura \var{flock} (la cui definizione è riportata +in \figref{fig:struct_flock}) che contiene tutte le specifiche di un dato file +lock. \begin{figure}[!htb] \footnotesize \centering @@ -1475,7 +1471,139 @@ struct flock { \label{fig:struct_flock} \end{figure} +L'operazione effettivamente svolta dalla funzione è stabilita dal valore +dall'argomento \param{cmd} che, come già riportato in \secref{sec:file_fcntl}, +specifica l'azione da compiere; i valori relativi al file loking sono tre: +\begin{basedescript}{\desclabelwidth{2.0cm}} +\item[\macro{F\_GETLK}] verifica se il file lock specificato dalla struttura + puntata da \param{lock} non è bloccato da qualche altro lock: in caso + affermativo sovrascrive la struttura con i valori relativi a quest'ultimo, + altrimenti si limita a impostarne il campo \var{l\_type} con + \macro{F\_UNLCK}. +\item[\macro{F\_SETLK}] se il campo \var{l\_type} della struttura puntata da + \param{lock} è \macro{F\_RDLCK} o \macro{F\_WRLCK} richiede il + corrispondente file lock, se è \macro{F\_UNLCK} lo rilascia. Nel caso la + richiesta non possa essere soddisfatta a causa di un lock preesistente la + funzione ritorna immediatamente con un errore di \macro{EACCES} o di + \macro{EAGAIN}. +\item[\macro{F\_SETLKW}] è identica a \macro{F\_SETLK}, ma se la richiesta di + un lock non può essere soddisfatta per la presenza di un altro blocco, mette + il processo in stato di attesa fintanto che il lock precedente non viene + rilasciato. Se l'attesa viene interrotta da un segnale la funzione ritorna + con un errore di \macro{EINTR}. +\end{basedescript} + +Come accennato nell'interfaccia POSIX ogni file lock viene associato ad una +struttura \func{flock}; i tre campi \var{l\_whence}, \var{l\_start} e +\var{l\_len}, servono a specificare la sezione del file a cui fa riferimento +il lock, \var{l\_start} specifica il byte di partenza, e \var{l\_len} la +lunghezza della sezione; \var{l\_whence} infine imposta il riferimento da cui +contare \var{l\_start} e segue la stessa semantica dell'omonimo argomento di +\func{lseek}, coi tre possibili valori \macro{SEEK\_SET}, \macro{SEEK\_CUR} e +\macro{SEEK\_END} (si vedano le relative descrizioni in +\secref{sec:file_lseek}). + +Si tenga presente che un lock può essere richiesto anche per una regione al di +là della corrente fine del file, così che una eventuale estensione dello +stesso resti coperta dal blocco. Se si specifica un valore nullo per +\var{l\_len} il blocco si considera esteso fino alla dimensione massima del +file; in questo modo è possibile bloccare una qualunque regione a partire da +un certo punto fino alla fine del file, coprendo automaticamente quanto +eventualmente aggiunto in coda allo stesso. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|l|} + \hline + \textbf{Valore} & \textbf{Significato} \\ + \hline + \hline + \macro{F\_RDLCK} & Richiede un blocco condiviso (\textit{read lock}).\\ + \macro{F\_WRLCK} & Richiede un blocco esclusivo (\textit{write lock}).\\ + \macro{F\_UNLCK} & Richiede l'eliminazione di un lock.\\ + \hline + \end{tabular} + \caption{Valori possibili per il campo \var{l\_type} di \func{flock}.} + \label{tab:file_flock_type} +\end{table} + +Il tipo di file lock richiesto viene specificato dal campo \var{l\_type}, esso +può assumere i tre valori riportati in \tabref{tab:file_flock_type}, che +permettono di richiedere rispettivamente uno \textit{shared lock}, un +\textit{esclusive lock}, e la rimozione di un lock precedentemente acquisito. + +\begin{figure}[htb] + \centering + \includegraphics[width=13cm]{img/file_posix_lock} + \caption{Schema dell'architettura del file locking, nel caso particolare + del suo utilizzo secondo l'interfaccia standard POSIX.} + \label{fig:file_posix_lock} +\end{figure} + +Infine il campo \var{l\_pid} riporta (viene usato solo in lettura, quando si +chiama \func{fcntl} con \macro{F\_GETLK}) qual'è il processo cui appartiene il +file lock. Nella semantica POSIX infatti il comportamento dei lock è diverso +rispetto a quanto visto in precedenza per \func{flock}. Lo schema della +struttura usata in questo caso è riportato in \figref{fig:file_posix_lock}; +come si vede essa è molto simile a quanto visto in +\figref{fig:file_flock_struct} per \func{flock}:\footnote{in questo caso si + sono evidenziati nella figura i campi di \var{file\_lock} significativi per + la semantica POSIX, in particolare adesso ciascun lock contiene, oltre al + \acr{pid} del processo in \var{fl\_pid}, la sezione di file che viene + bloccata grazie ai campi \var{fl\_start} e \var{fl\_end}. La struttura è + comunque la stessa, solo che in questo caso nel campo \var{fl\_flags} è + impostato il bit \macro{FL\_POSIX} ed il campo \var{fl\_file} non viene + usato.} il lock è sempre associato all'inode, solo che in questo caso la +titolarità non viene identificata con il riferimento ad una voce nella file +table, ma con il valore del \acr{pid} del processo. + +Tutto ciò significa che la rimozione di un blocco viene effettuata +controllando che il \acr{pid} del processo richiedente corrisponda a quello +contenuto nel lock. Questa diversa modalità ha delle conseguenze precise +riguardo il comportamento dei lock POSIX. La prima conseguenza è che un lock +POSIX non viene mai ereditato attraverso una \func{fork}, dato che il processo +figlio avrà un \acr{pid} diverso, mentre passa indenne attraverso una +\func{exec} in quanto il \acr{pid} resta lo stesso. Questo comporta che, al +contrario di quanto avveniva con la semantica BSD, quando processo termina +tutti i file lock da esso detenuti vengono immediatamente rilasciati. + +La seconda conseguenza è che qualunque file descriptor che faccia riferimento +allo stesso file (che sia stato ottenuto con una \func{dup} o con una +\func{open} non fa differenza) può essere usato per rimuovere un lock, dato +che quello che conta è solo il \acr{pid} del processo. Da questo deriva una +ulteriore sottile differenza di comportamento: dato che alla chiusura di un +file i lock ad esso associati vengono rimossi, nella semantica POSIX basterà +chiudere un file descriptor per cancellare tutti i lock realtivi al file cui +esso faceva riferimento, anche se questi fossero stati creati usando altri +file descriptor che restano aperti. + +Come abbiamo visto come l'interfaccia POSIX per il file locking sia molto più +potente e flessibile di quella di BSD, ma è anche molto più complicata da +usare, specie in tutti quei casi in cui non si vogliono bloccare sezioni +separate di file. Per questo, seguendo System V, è disponibile una interfaccia +semplificata grazie alla funzione \func{lockf}, il cui prototipo è: +\begin{prototype}{sys/file.h}{int lockf(int fd, int cmd, off\_t len)} + + Applica, controlla o rimuove un \textit{file lock} sul file \param{fd}. + + \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di + errore, nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\macro{EAGAIN}] Non è possibile acquisire il lock, e si è + selezionato \macro{LOCK\_NB}, oppure l'operazione è proibita perché il + file è mappato in memoria. + \item[\macro{ENOLCK}] Il sistema non ha le risorse per il locking: ci sono + troppi segmenti di lock aperti, si è esaurita la tabella dei lock. + \item[\macro{EDEADLK}] Si è riconosciuta una situazione di + \textit{deadlock}. + \end{errlist} + ed inoltre \macro{EBADF}, \macro{EINVAL}. + } +\end{prototype} +Il comportamento della funzione dipende dal valore dell'argomento \param{cmd} +che specifica quale azione eseguire; i valori possibili sono riportati in \subsection{Il \textit{mandatory locking}} \label{sec:file_mand_locking} diff --git a/fileunix.tex b/fileunix.tex index bd3ed09..a36652d 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -487,11 +487,12 @@ essersi spostata, ma noi scriveremo alla posizione impostata in precedenza. Non tutti i file supportano la capacità di eseguire una \func{lseek}, in questo caso la funzione ritorna l'errore \macro{EPIPE}. Questo, oltre che per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non -supportano questa funzione, come ad esempio per le \acr{tty}.\footnote{altri - sistemi, usando \macro{SEEK\_SET}, in questo caso ritornano il numero di - caratteri che vi sono stati scritti.} Lo standard POSIX però non specifica -niente al proposito. Infine alcuni device, ad esempio \file{/dev/null}, non -causano un errore ma restituiscono un valore indefinito. +supportano questa funzione, come ad esempio per i file di +terminale.\footnote{altri sistemi, usando \macro{SEEK\_SET}, in questo caso + ritornano il numero di caratteri che vi sono stati scritti.} Lo standard +POSIX però non specifica niente al proposito. Infine alcuni file speciali, ad +esempio \file{/dev/null}, non causano un errore ma restituiscono un valore +indefinito. \subsection{La funzione \func{read}} @@ -1004,21 +1005,20 @@ valori nella terza sezione di \tabref{tab:file_open_flags}.\footnote{la pagina di manuale riporta come impostabili solo \macro{O\_APPEND}, \macro{O\_NONBLOCK} e \macro{O\_ASYNC}.} -\item[\macro{F\_GETLK}] se un file lock è attivo restituisce nella struttura - \param{lock} la struttura \type{flock} che impedisce l'acquisizione del - blocco, altrimenti imposta il campo \var{l\_type} a \macro{F\_UNLCK} (per i - dettagli sul \textit{file locking} vedi \secref{sec:file_locking}). -\item[\macro{F\_SETLK}] richiede il file lock specificato da \param{lock} se - \var{l\_type} è \macro{F\_RDLCK} o \macro{F\_WRLLCK} o lo rilascia se - \var{l\_type} è \macro{F\_UNLCK}. Se il lock è tenuto da qualcun'altro - ritorna immediatamente restituendo -1 e imposta \var{errno} a \macro{EACCES} - o \macro{EAGAIN} (per i dettagli sul \textit{file locking} vedi - \secref{sec:file_locking}). +\item[\macro{F\_GETLK}] richiede un controllo sul file lock specificato da + \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato + (questa funzionalità è trattata in dettaglio in + \secref{sec:file_posix_lock}). +\item[\macro{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto + specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da + qualcun'altro ritorna immediatamente restituendo -1 e imposta \var{errno} a + \macro{EACCES} o \macro{EAGAIN} (questa funzionalità è trattata in dettaglio + in \secref{sec:file_posix_lock}). \item[\macro{F\_SETLKW}] identica a \macro{F\_SETLK} eccetto per il fatto che la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se l'attesa viene interrotta da un segnale la funzione restituisce -1 e imposta - \var{errno} a \macro{EINTR} (per i dettagli sul \textit{file locking} vedi - \secref{sec:file_locking}). + \var{errno} a \macro{EINTR} (questa funzionalità è trattata in dettaglio in + \secref{sec:file_posix_lock}). \item[\macro{F\_GETOWN}] restituisce il \acr{pid} del processo o il process group che è preposto alla ricezione dei segnali \macro{SIGIO} e \macro{SIGURG} per gli eventi associati al file descriptor \var{fd}. Il diff --git a/img/file_flock.dia b/img/file_flock.dia index b5df9a4e024adb3feb414ef563667bb8c94230d3..7c30fd8f7a805266e9158a287731c312b0767ff3 100644 GIT binary patch literal 4099 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 hNF9pm^)&sS6<HlWJ*a_rH0RT(kt5pC1 diff --git a/img/filedup.dia b/img/filedup.dia index 076627fb96811ff4e284124b76f0feb127b41cbe..fdb6361ba9616dcb2271c5018ad721bf8029d6f8 100644 GIT binary patch literal 2975 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 VUhqHbEZE$A`V$*;i?-C=0004k&zt}N literal 2886 zcmV-M3%T?kiwFP!000001MOW)Z`()`zUNm6$~9@TpCreV3^sdOV1XQVZi9tDOSH@# ziWEqC9PeR&`*xGG9(+g^yV(Mj${@x_X?Llp`l`B~{p)W(Hu3DQFw3Jf`7+1Ing90n z!>_9-_(lF*XTfGB7bLlQ^=1B46x(0!?p|JAQ2d$)MVg^FdPaG8_rD;HgFCtCZvOSd zY<9T8DkuW=Uj1%R6j}7}T!gbE*o0r^55e-!b(TISt9iAmUbjr+G@Jbu#9!tgAIm@U zyLy|uqkT^7y$!Zu*4%cpP4h@DDPFg&B|ZD7p9gE|Rk>W0tiOKz8~a#&r238hUR@uw zmq@V*vUQZS>11ILR}X?9j}Y?q94;sEFg}TRd=lCCB%*w=O|v2kqM}XaAx+~jNGeK2 z_8bnUlP`lo)$k& zJuU}neC^f#ucPh%SCmH&aoEK{loZr!^+ulUY>StU7|KKU45B~|5Ma|y7iXd49*=qKA_RlB@=X(q5 z%xBT+%lx}@{Ct`m$=##|YCWKBy8j{xVxJtunoPI9&A$B~9-7-{l7k>w$Kj3yb-5%W zf8Hy4gnx38Abc3jWtt?5FjYc5F4h%YACZwI*GG6KxRRPBxoz>)y#%CoRH^-z z{^$@|qARr0@P8ts3awKLZK-qbX{l`K;O8F3;byT+v!w0ZnBu7z!G?IrS~3}^eAr>%j{PCm9pkY(vh zzrYgBofmPKtWSS>Z4zgn&pRn7QIb+Bp_Df^+yBe#NrF%L^Ac-Cst$^HKHLBE5yJa_ z8P~te#PKiFc1WV}kuFpazlT4H4h6xrqX`lz&d8@*?)u8Dcl>*TeAf|*pg)Xap&mo) zYdH=vHP-Z*k}_t0w5}1}-)8AD%=1|hJj7v7r2j;ut}iy5CPf!j^?tqN_h=L5pZ`$= zakM-X!pn)ZOnoP+m>!X10ehE_4IxwJg}MkGCXAf&j~*fU*w@J>?Eaee3KhSTN@qyY z%&DPADF|();Eb*neB@K{rWP=GCO|1@D+LF%!YEpy$Cq$T_!7?05axS* zi86Z2cdoinFa9yojT{Bq}C~O4mPB=#aH(dklHIm zMST-OOD$v^{DX{x7(FIRAtDM9QQaK0cKw9+iH{l(b&>CR%#(=nnV{m{N0fLDQ&chL zWMs3@;I2Cn%^)-iq0tLMql{^UMu}%AG^#Y*_K2CwtTM*u%Ff!#qr+`gz5pLytJl&Y zJtbJu7xE=geg7T{B(Q|F(5MjXHqz#~>$KIUt@R)h9Wjiy&DN-w?zY-pYDt5We%q~4 zaNGvZFt89~U}25Qs4?L}_i%A+!9|Nd0L-lbh8hD5MV=MFxXSHwRf(@q4vrFJ!YzSD zi^rc2G#Xz^Bu`h_q8%r1Mae_1{+l{Fdvao!8G)w)2^k-pk_am?;=9VCaip^5@=f(} zIQ8xX*x5AMC5f^|sw_&i@)s;DWXYOnWxxW0_xeVIrOkH;tZG3IQ4QUf@<7~_jCPW2>93L~P)QLx2 zqG+qvlhP-PJo@kT6v{2?5^jPP=n@TGB8;6(JR7=%d7|`r-*kxzax2QcUN9Z?4(w;8HCL0tt32&nF5}&k)BvU48_7zvRh_6rGQbYM$}9$ z<5>jxp9}fod09Z-)2xwhiz3)*({}not88Ta53?}-haHUnVHU>!Fc|*>%`WCk*ol!U zCcoJiIFeEK5%yKI$1i7yV)?(Gg_>M#?w}<1MoMxCH-#3CgdMbS#P?_+me8Wb9iZh_ z&?1bX#ST`g=BN@YcABF!c>|=}3Q}BCNU@P_uCYS*SaB?21sbCOEoJ|&A+*@&i>e05 z*KJXxju%*o-D`6Qv3ux>x->~(rhr6EaEWYD}G2nFHYyqJD%#P*}m+=uaDmTO3h4RBDMw|ki&roq#k%+3pHJA z_N)TjoX3rOqVM~1+_-jeBg|D1+sep`!;HLLTO*o&7Jz0TXqZuBGZZwJb-wgrNc%di zT59-+y)Vk*ctV|)96}vWP1)fdQ`s(#sW)6mT8I1vmBTTt|WF$T#(N zSHV#u7nxBD7n#w6>-QKU9^RQ#1{X?5UX#cp8hABo&0ft(Gi+=zYVGAx4zye^Q#=v5s z+n|C=6=A91!u00fUIZ5y^8kQRcljCujExf53NTg7qyh}L(~YamAOPl80K-iIhFkMr z_<{c-?D;Po{1*VscP2~$23xZ*_`t#tdlm*}HN(6IoAVx+k;z2@F)Kr%B|;b%yP?o7 z@;PHu915+5J>)PIdW`0U4q1fW1>22K%rm7{sD&dkN5pd!sj3gkMNIfYQJz{KRJsk5 z#p4QEp^R!13Y}0_)+W9wZDK>02&P0v)T#tK>T`NkyjTluU9DJKAD-vu@k$4sqiC0~4S&fVl$W!-Q^65>C zf%`3uD-xI%V@Hv6XGJ(Mmv<-D^6vPcP{p&CcZb`1;0DX@oSI8k*vKOax6DpdmREwt zHrms7ZV(ky82@Sv3R3a zS3qUJb*-*z%<5X}^%4iYUaq}fF9E$?V0k5Cj1}g&w!Gc?=A}1p*PUK54S2hT?XC+} k*NoL|OunpM#=&ctef?0qkbl=%u=)Do|I#38vLN070Mmq&7XSbN diff --git a/img/filemultacc.dia b/img/filemultacc.dia index 88ee2a699493e5437133bbb685725c265e69f392..587c3c224eaf028056241d0f5c00dfd5d2b015cc 100644 GIT binary patch literal 3919 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 literal 3777 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 rJsHe&|n diff --git a/img/fileshar.dia b/img/fileshar.dia index cdc2a6618a2b50fba6272ff6c085daf56f387107..97eb2892757d4efad4e0e1fea3ef888dbb3c6c9a 100644 GIT binary patch literal 3813 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 b9Oqv@Rp018_j&aA_0#_Wcgs>;7cl_<*mQ%B literal 3752 zcmV;Z4p;FXiwFP!000001MOW~Z`(K)e($d^GOsDaJE_UEgPna^V1X=l=WVbs6kAEO zV_Sx-Oq+e!-@c@z#5c(ok)lV*Y0S=Da<~cC;GF~S6?zHn|wo1*A;$^uvq-7rabz@9DYGnp39>4zZ7yd)_mg*PQ zb2YuuRw2ba&L7jozMMRXXVrtCNK;B*pTqeg?)w)p>t96Pzld}-US@fb$7!)I=03}2 zNxY~e75Q`0UCwF}&y30(S_{?qGgtE z>9lwne?RoNFmm|VtNCAgoBxk=mEO;irWK@%!uj)lo&Lpfde_hTIh`h}BcJy6n3kEI z>R~s>7QQ>~)D=`O?QB$~h*|uSTW?=E`((`=jn{(g7*+^is8 zJkF9g5ljgq#C*NA@~F5re_<-R37uq%#W-0^%T=7Www5u3c6%p_=lNv0`v#gYa?YfN z$&+zOA^XpDO&?e|%)TmKX36gCiCIlG`!QvxUaT~=yXq2G)r}DCS#u*q-W1nJ3#GSv z3u_(%THB}A{*rxfP+ID$v}WVKroAdHE|s?A+*?+XE$jT;lUXt!PqKWmZ`}A=Qz_zz z;xI%VCVxuO$EV_uTFS1FzR&V$lJ}?gtEcSSxWTkNZbA$aUCal%NLOV!16{;^t^hu4~DLm6Bl=dmr-~_^rT04F~qb|kvaZEOi{sZIf{r;AS;$oN_swd?JaPB z2uIq&e|SeP))C~3={U~w>|49`QpcIcvt;pj_}x2;IQo1}lweiKsI0-&YG<fLCPp)JU&J>;K+@d;1TQ`iDid{ljeEKe6+c&SZ;UlkY_XTL@>@f8vT=gju0)RAe~78_s$BDIXlQ#S|9{T!pJ~);UP7P08(%! z1q`gv3oEo37RrZVVGPB74U5v1E8gsO-Q6%f%bwU;SMw0vb?M;BbQ0SIk%w`Z;0TUYZC-E|iSt?lk2jeICA3lM&YHo_0GcLym0_b9kW9c>%poJ^rm zM7Si^#^}J9^yw#6NXt?ZMojbD4Z%e7Kfj$5(z^L;_ME4NKmr&xx^Kg#Rl&f%=`~fw zIaftrbJQ;%L^@)Tk%H~tw-I8TaC$8ew}1D1VBA?%kM}LiJ^L~d_V>_{ z+2&CaUZ5#T>xuUdPHwD4Zbaco85`2bjj-Kixc#=f^k%2gQP9#MUi^xWo)A49}7g76;r_;2so3tjs(}|v^F5=p}PsjXEhy7g5 zKB)c~MS5ct8RB%z5u;SwLvchnvpYVfs+4WN9~7sISLuH*M=I}=Pj++=_#`-=D1Uqs zf=#5B_JATQHZlK@%sP(n(AWea1XSXeN`Od$5J_8zOb^a&r>yJ2W>#6LR9vg=)T(nO zw?@lOTV~5BMaqUx@~u- z23nmL2$9zJ5&)%sl6lOjhz8i5F=9m8?jE{~e;Ng2%yzb-LyLbF@#^=n`Q~|2Kor#P zM!m0!uuuEmr_bD#xsQ@K9-wO&-{=~~19T1J&@~Lo;+%_LsPIwUFHzKU+b~JXY<2th ztwEPEzl}*HHPb9WmH*cIn!AQ6B%lBW3SdqyfZ^Ps07kJtNdXM?lCcz({*nH@#1SHq z^$|y9qjGYs5e|^e@4Pxl=6@&2{8afuiwxjmD$yd5dPR%T;Xr7S;9ml?+)?chEi@Eb z$SYdHlvX;g4$$&m&=UDVONd035-n9-WsMdZ2rW=n31}%h2>3!v2&}A&Dys{Y0u@y{ zt`8!8P*ZtkNRj!;_`zi&Vt}+WjEEF;T~tYI!!A9!L9!vq`HQLV^_6+=?Dr4&lT2vX$EJlTXxcA41@hzjt_WvY%+(#iElE2GVRM!iSS1y zA*xj|!kn+$#}Fj29AfvF2m4HcO8im@G>^G#&j%(47EpXEe2?n8ba0^Z--b0d57JQc zemE&|x3RZqc%}!^BB?y^r~QcKv@P%=eyY`VfNJ%1=NN%_fNFIO@B(-_!i)NVSO0sL z*tj2A2Dl#?b}oRHYaM$5LU)+rG&VV% zOSYI~8RtfAT1n)PdYnigyY%sEI!{)g|C!C>#ZJ8POj(W0af~<46|&D6N3^SpkS4Y` zi7U<()W#F-#?Im0u$dux^qVOkezUDg*4{j4Y{PSgd-t4mUK9AvKBDieZLihtd#&ns zr^TW=z*qaMJ-ZKLpPf9Vvngz|F59evO}67Ed%9Pw&8P0ACzmYuss1a4B_i7Hz~<|% z?Z;(zU{1m$H#V%Xd5|3X{aLIJCsT|53G7GzWFY+$8~P^$>z_PD|0L+&S^7tY%YRn? zY{KfFivJve_-^&@AKC2XFb8m<7t z%1W>bFg(m1;?4^Mz`Pg0XkUQg!R!~lVZVrQ_6rC51psp=B42>P!FCwDvBQvXI}C;$ z2JWs2SkfUqMccUnNeJhH=0aMK*eVWkt576(DSC)E*Q}tdqmQzV24#f8j?i75CGo{8 zG)NGeYHUT79pMeFa2ZJ}d1y_Yvt_avKTM&ovsX5ua2?i#*@XIH6Bd9=B)2LfYbqgF zUb6vSH8K4S{~Kt;Cyg*5k&BWD^F<;&fT>f_2&-?vs%V4{@cygmZwsIiuQbBJwz)8o zaDPOi0}zSU(u%6?=9EZFW~pRwS92nSfJpoj3EavVhDe&jB2xGZywhNTce0VGqQeE= zA+-w{P~A!CFIo{IkSJ9dov3zR0~#f&#xVoic_*`Mm5j5+IQgDTU=Q{isDM5AvWI!) z&9xXHU9>*Tv-00$9y=4umU`bGFBMC}}OM+66 z1O-`xchXzdpbnO1t2feYqi|`q8q#b5Fn0?30!$PPF3|>Df|UtI02TlX@m7S6gLz*G z-f+L#8|Q=7p<{5s0%-0O^#~dr4m2C3906-N2o!SwXbfnWKf|8}GyK>4j0(5SDA;A7 z`YB*MQF+VcQ9*h|l+{nFs&;xUep1y9H&FZp#ZS$;2%&(`F-0YO(TWa|AXpYZ={ilJ zE`HL(OH+X2r#{$3Lx#eI*~DAYQxv3>($+0RZ=Q4Bb??xv||8hq?a0~>f2fTlH^}MRo|FD Sk9j=*`sx3D<_Vo@F#!NKkx)JW diff --git a/img/procfile.dia b/img/procfile.dia index 2a8948f6e1af9e4e9284024f4261c506f8994520..adff9e72a0ee7d7f14028ab5eb9310eaf9429814 100644 GIT binary patch literal 3887 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

7k6y^5)Lpj1*kt6ui?Xtu=vVL|hL~ z6NnLU|73!Kz+N>xiVrS;w>@;N(D0Z*LS}bQpSs5KVmK&jI3a3~y{dSWFBK1n+ZQUH z((Q{d9H85)Gn`(b%U|yDusR;)Psd~6_Kup}y`#WfZvu&K?{)3sPt5~T@vvOGY$_g> zYnK65JjAt&@3jloJN&`bJj#ojhuc?80l0?e<=yfkZ@0<~a~~PZ*-@=KhrGVs_vnq2R(0EbksHI`jq>fW=e+m!b|&0T-Y$Jgqy3fO#u`A-(_uQ5&%U49_EO z1z<$GlB1UZ28$yiU@Ty$FTe<}^^4e9zeu?Ci@@~@0_ILLUw|QCBMjLYVJO@PLvVya zVKrdjUwhFRNDC1P08Gw}LrAWvR)G-2*&X63(W{C5^fJv*SnW0bU-3f>{zI!EweUkI z3}k9-G;v{&B8%vD9_rlk(2|JBbG)2|{rlqT#aaSX|~kB@G)!T@!j* z{{zUlHj{U{9|4d9oV*j9y!(s*V40VGC+~*%%5Z{64~U(u({l1|M_z5`@^pBU_vs>8 x#gk+?iND8Fq!XX{O`OJev$?7GxQJfk^vj3hgZ=%GMo(Wp{2w`css$lf0RX9Uk4^vp literal 3837 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