From 8b19e2cb4c4e6c581204cba496ebca54fadbaa84 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 12 May 2015 22:33:33 +0000 Subject: pst-barcode (12may15) git-svn-id: svn://tug.org/texlive/trunk@37353 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/pst-barcode/Changes | 3 + .../doc/generic/pst-barcode/pst-barcode-doc.pdf | Bin 278101 -> 274754 bytes .../doc/generic/pst-barcode/pst-barcode-doc.tex | 23 +- .../texmf-dist/dvips/pst-barcode/pst-barcode.pro | 26891 ++++++++++++++----- .../tex/generic/pst-barcode/pst-barcode.tex | 4 +- .../tex/latex/pst-barcode/pst-barcode.sty | 2 +- 6 files changed, 20548 insertions(+), 6375 deletions(-) diff --git a/Master/texmf-dist/doc/generic/pst-barcode/Changes b/Master/texmf-dist/doc/generic/pst-barcode/Changes index 39729819828..fd32f16f588 100644 --- a/Master/texmf-dist/doc/generic/pst-barcode/Changes +++ b/Master/texmf-dist/doc/generic/pst-barcode/Changes @@ -1,4 +1,5 @@ ----- pst-barcode.tex +0.13 2015-05-11 - updated documentation, new pro file 0.12 2013-10-26 - added option file for including an external file 0.11 2013-10-06 - added more options for data matrix 0.10 2012-08-25 - using another code for loading the ps code @@ -18,6 +19,8 @@ ----- pst-barcode.pro + +2015-05-11 - several fixes for the code 2013-10-06 - the Data Matrix encoder now supports C40, Text and ANSI X12 encoding modes as well as the FNC1, PROG, 05 Macro and 06 Macro prefixes diff --git a/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.pdf b/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.pdf index 55b731ce2a3..12e7e21ff11 100644 Binary files a/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.pdf and b/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.pdf differ diff --git a/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.tex b/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.tex index 72c33bffcff..edaf38f00ef 100644 --- a/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.tex +++ b/Master/texmf-dist/doc/generic/pst-barcode/pst-barcode-doc.tex @@ -396,11 +396,18 @@ funtion symbols, starting with the approriate start character for the initial character set. UCC/EAN-128s must have a manditory \texttt{FNC 1} symbol immediately following the start character. \item[Options]~\\ - \begin{tabular}{l|l} + \begin{tabularx}{\linewidth}{@{} l|X @{}} Option & Feature\\ \hline \texttt{includetext} & Enable human readable text\\ - \texttt{includecheckintext} & Make check digit visible in text\\ - \end{tabular} +% \texttt{includecheckintext} & Make check digit visible in text\\ + \texttt{parse} & Any instances of \verb|^NNN| in the data field are replaced with their + equivalent ASCII value, useful for specifying unprintable characters, e.\,g. \verb|^029| for GS, etc.\\ + \texttt{parsefnc} & Non-data function characters like \verb|^FNC1|. + The special pseudo characters \verb|^LNKA| and \verb|^LNKC| at the end of the symbol + indicate that a GS1-128 symbol includes a CC-A/B or CC-C GS1 composite 2D component.\\ + \texttt{raw} & The data field provides the input as pre-encoded codewords in + \verb|^NNN| format, suitable for direct low-level encoding. + \end{tabularx} \item[Notes] Any non-printable character can be entered via its escaped ordinal value, for example \texttt{\^{}070} for \texttt{ACK} and \texttt{\^{}102} for \texttt{FNC 1}. Since a caret symbol @@ -414,6 +421,12 @@ for the initial character set. UCC/EAN-128s must have a manditory \end{pspicture} \end{LTXexample} +\begin{LTXexample}[width=.5\linewidth] +\begin{pspicture}(5,1in) +\psbarcode{^FNC3L09}{parsefnc includetext}{code128} +\end{pspicture} +\end{LTXexample} + \subsection{Rationalized Codabar} \begin{description} @@ -435,7 +448,6 @@ for the initial character set. UCC/EAN-128s must have a manditory \end{LTXexample} -\newpage \subsection{Interleaved 2 of 5 and ITF-14} \begin{description} @@ -478,7 +490,6 @@ for the initial character set. UCC/EAN-128s must have a manditory \end{LTXexample} -\clearpage \subsection{Postnet} @@ -496,7 +507,7 @@ for the initial character set. UCC/EAN-128s must have a manditory \begin{LTXexample}[width=.6\linewidth] \begin{pspicture}(7,0.3in) -\psbarcode{01234}{includetext textpos=-10 textfont=Arial textsize=10}{postnet} +\psbarcode{01234}{includetext textpos=-10 textfont=Helvetica textsize=10}{postnet} \end{pspicture} \end{LTXexample} diff --git a/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro b/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro index 487e75a1be6..efdca8a3bb0 100644 --- a/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro +++ b/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro @@ -1,9 +1,9 @@ %!PS -% Barcode Writer in Pure PostScript - Version 2013-06-03 -% http://www.terryburton.co.uk/barcodewriter/ +% Barcode Writer in Pure PostScript - Version 2015-05-09 +% http://bwipp.terryburton.co.uk % -% Copyright (c) 2004-2013 Terry Burton +% Copyright (c) 2004-2014 Terry Burton % % Permission is hereby granted, free of charge, to any % person obtaining a copy of this software and associated @@ -28,168 +28,445 @@ % CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS % IN THE SOFTWARE. - +% % --BEGIN TEMPLATE-- - +% % --BEGIN RESOURCE preamble-- -%%BeginResource: Category uk.co.terryburton.bwipp 0.0 0 0 0 -%%BeginData: 7 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -P1OerF_-`n01TSk ATDKp 010/i AS5q% H' 6mE 30Ia,! KmJH23J -i?3%mj@F*(i.@qA VbE +L\DA TVm"@ r# drB 9Ki QP'& -Es@:O(aA79M!@D_ ?-CE -cQG7F`MSBDD#CBB lJ$S4 tf9 3FC f*'E d8 d -% Category/uk.co.terryburton.bwipp 0.0 0 +%%BeginResource: Category uk.co.terryburton.bwipp 0.0 2015050900 31191 34576 +%%BeginData: 6 ASCII Lines +currentglobal +true setglobal +/Generic /Category findresource dup length 1 add dict copy dup +/InstanceType /setpacking where {pop /packedarraytype} {/arraytype} ifelse put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal %%EndData %%EndResource % --END RESOURCE preamble-- - +% % --BEGIN RESOURCE raiseerror-- -%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 0 0 0 -%%BeginData: 9 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ -% uk.co.terryburton.bwipp/raiseerror 0.0 0 +% --REQUIRES preamble-- +%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 2015050900 44890 44440 +%%BeginData: 13 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/raiseerror { + $error exch /errorinfo exch put + $error exch /errorname exch put + $error /command null put + $error /newerror true put + handleerror quit +} bind def +/raiseerror dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END RESOURCE raiseerror-- % --BEGIN RENDERER renlinear-- -%%BeginResource: uk.co.terryburton.bwipp renlinear 0.0 0 0 0 -%%BeginData: 72 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\Ch[ O"NW jQC F( KH V1G Ou "b5A U&D284U1G<3UEb& a%GA1T0 BSo"S! !&0<0 5#E 9Eb'B-Blmp -E+*6f+D,%u -F(LLj05#E9Eb&utAor!1F,0gZ1G:@UX:eDes?4OtDhQ06CcMFCT6*DfQtBAU&<,Des?4OtDhQ06CcMFE -h51BkM<+FCf]=G[YE&B5WkaOu"b5AU&Ch[O"OtDhQ06CcMFCoH/F5FCf]=F(or3OtVtS06CcMFEh_9AohO*+EV1>FEh_9AohO*OtVtS -06CcMFEqe:AohO*+EV1>FEqe:AohO*OtVtS06CcMFD#$$F!,R9G][S,E-%0qOu"b"Cijc1G]Y' -:Cijc1G]]*#Ou"b#DfTB"Eas$(DfQt0DfTB"Eas$(DfV!mOu"b#@:O(cEc6)D'3;+Eb&a%@W-@1Df(XjOu"b#DfTB"Ed)5.FD)e+DfTB"Ed)5.FD-g -jOu"b(F^]<$Ch74#E,Te?B6@X'A8GghFDu/>OtVtS05#E9Eb&utAor<;Df[%6F^]<$Ch74#H#R -\COtVtS05#E9Eb'3)B4uC+Df[%6F^]<$EbT0"FDu/>OtVtS05#E9Eb'3)B4uC4E,Te?B6@X'A9 -)BsBQSN=Df_'pOu"b(F^]<$GA1T0BHUr1@<,n&Bk2=!OtVtS05#E9Eb&ipBkM+$+D5h*Eb&ipB -kM+$OtVtS04J@1F!,O5F-:!g!KmJ>!g6HE$'I(tG_uJ$!!&0<05Y-BBSZYO1Pc$e!HV^kP%'4J -Oo^@?P#@);P&,pUP,Wd]Bp(ZC1MMXHP%odQP!+.FA0>r&F!,1[94D=MEaa'(Dj"pG@<-BsFD5Z -VWJCS9IT%@j$%>G9C1SG\A4FOo -]E.G\E7:HS95EG\A45+F0+NOu%NL<.0+&@<-E3BnuhR;Mb@9G^Y`TI=!VX+EM"5+DI!3F)YPtA -TD4$BlB/NF)YPtATD4$BlB06L]NY>Ou%NLGT^O[!Ko6eP":a2OslKqGA1T0BSZYOD0pJ@ -A9;L@8:F(KH%DL#`1Ci=?BP#Pn! -EcZSj3/ITtD0qEIP')q+P+.VML]ET%P(f'sI=%-"I?ITYP"Cg2FCf]=@rH1%EfL&G]\"@H=`7uP*KHlFED)=FH-?a4aSi(G]Y'4+EVjMH\_Zb97))M8UZan?'6usFE;PE -+EVjMP%'TNOu%moL]MUBFHU*h!KsF/OuRQ.FHShN96>5sEejgR!Kr5$G^Y`GI=!VhF*)FF@;L% --AU&<[1OYEdFE;PEP%'4IP!+/J!.B3W:6KOO!/LW6Q"Bl8#lH#R>X@!e%Z02Q(kDKJj'E+P2*L]W`&I=#R7Cia09P#[Yf02lt5DeiocBk2=!P$ -jFUH]fL);fm%uCLpR]A9;LJ98EY42M_?r5*@$A7W30d9jr-aBm>e6OuJO`P&-:FOuSV@Oo]WDE -cdHFI?IQXP#X/WAU&<*F(8d!FHShN1GFE_G0FD)e=AU&G]\1KAnH*qFHQZf1OYEcFCf]=G[YE&B5W_7C3=T>BkDXR4`k7[ -FE_G0FD)eAP%Kj[HS9JPG]\1LDf^^7Ou"b5AU&<0@;p91GT_*>G]\.DA9;LJWH<3'Efsmf!KsF -F2NfkEP#O)VAU&P&?F=FCf]=H!tN'B5W -_5@:F.uAWf3'06CcMFEqhDF!,R9G]\4LAnH*qFOu%NL<-2\rFEq;2BkM=D#% -M4^FCfKU4aSi(AU&FCB6#ASuUQWJCV=2Ne*(1OYEcF -Cf]=G]7SB+EV1>FEqhDF-:<\AU&<0@;p:D!-E:(EfpcXP#Zpn<+g>^Eb'B-Blmp-E+*6fH\t$Q -!!&1OB6@X'A8GghFDu/>L]ETTH]i;[F^]<$Ch74#E,Tf\DJ+*#Eb'B.A9;LJ!G?O`Eb&utAor< -;Df[%6F^]<$GA1T0BSZ_Q2Ne*(CM.cuEb'B.A9;LJDJ+*#Eb&ipBkM+$M#NPqP(dOk@<,n&Bk2 -=!+D5h*Eb&ipBkM+$M#NPqP(f'sI?IQBF^]<$EbT0"FDu/>L]ETTH]i;[F^]<$EbT0"FDu/>+F -'%MB6@X'A9V`uFD-i:B6@X'A9)BsBQSN=Df[%6F^]<$BOtmjBQT%3OuAI(P&"]Q@<,n&Bk2=!+ -D5h*Eb&ipBkM+$M#NPqP(dOk@<,n&Bk2=!P&=oT@<,mlASGdjFGTpZ2NicWVgX_-I?IQm9p.Mb -Oq*X2061WACh[cu@<.MjP%64gCG'+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2 -!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/renlinear 0.0 0 +% --REQUIRES preamble raiseerror-- +%%BeginResource: uk.co.terryburton.bwipp renlinear 0.0 2015050900 76908 76502 +%%BeginData: 237 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +begin +/renlinear { +% + 20 dict begin % Confine variables to local scope +% + /args exch def % We are given some arguments +% + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def +% + % Apply the renderer options and the user options + args {def} forall + opt {def} forall +% + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def +% + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /fn () def + txt { + {} forall + 2 copy s ne exch fn ne or { + 2 copy /s exch def /fn exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END RENDERER renlinear-- % --BEGIN RENDERER renmatrix-- -%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 0 0 0 -%%BeginData: 24 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\+DfV !mOu "b# @: O( cEc 6)< A7K OoDf -Qt0@:O(cEc6)G -_cWg2NeW7/;ORpC m$S-E+ sQ< 3 $;E JE +sQA 3$< 0SG^5HgH\_ ZMP(R&'1Pc$ -e!H;atH&)KaWI$: 4P!5$b E+s Q <3$< 0SG^ )1j Bp*:OBm=\A E+sQA+DI!TE -+sQAP"_$aI?I,SE +sQ<+E 2%> F#]= =055 99F *)FFE+sQ

Ou - %moL]MI/G]T$WL ]N[ME'"m(Q(3"[hk3CMEcUdEf)j([hk3;MEcUdEf*)2q/VX.ME'"m(Q(G,q/VX.OqqM8@ -r#^tDfor.@rH1%EfL -Des?4NWjQCF(KHVD0oc2Ci=>:F(KH%DL#`1Ci=?BP#QC7G^(?MBm=nGFE2M8+Bot-Bm=lY!/LV -oBm=odDMS:3Bm=nG?$d].D.dp3Eda*PP"h*"I?G)'1GD_?-CEcQ -G7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I? -IP~> -% uk.co.terryburton.bwipp/renmatrix 0.0 0 +% --REQUIRES preamble raiseerror-- +%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 2015050900 54074 54076 +%%BeginData: 66 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +begin +/renmatrix { + + 20 dict begin + + /args exch def + + % Default options + /width 1 def + /height 1 def + /barcolor (unset) def + /backgroundcolor (unset) def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /width width cvr def + /height height cvr def + /barcolor barcolor cvlit def + /backgroundcolor backgroundcolor cvlit def + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Draw the image + gsave + currentpoint translate + width pixx div 72 mul height pixy div 72 mul scale + 0 0 moveto pixx 0 lineto pixx pixy lineto 0 pixy lineto closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + barcolor (unset) ne { barcolor setanycolor } if + /xyget {pixx mul add get} bind def + newpath + 0 1 pixs length 1 sub { + dup pixx mod /x exch def + pixx idiv /y exch def + pixs x y xyget 1 eq { + x pixy y sub 1 sub moveto + 0 1 rlineto + 1 0 rlineto + 0 -1 rlineto + -1 0 rlineto + closepath + } if + } for + fill + grestore + + end + +} bind def +/renmatrix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END RENDERER renmatrix-- % --BEGIN RENDERER renmaximatrix-- -%%BeginResource: uk.co.terryburton.bwipp renmaximatrix 0.0 0 0 0 -%%BeginData: 16 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\5):8 CC 6CA+H' 1@I -*g0Ea1O4cXP%odQ P!+/: I=! )]M E_ (@ !0R A2P #[;\H' 5. a5@(e2 P&- -:sL]E;s'@;/jL5N _G!! %nj PL +` @Kn o_d ^D" tBP( -ecX!!!"V^6?olP( ecX! ! !" V5 *O? AP( e\lM E_d$I -?K;A^An66ME[6NI ?K;I(6 V"4 P "Cg TL ^o;. ?+@ M(582ClL]E /1BT`O^(5NH -X6!_"4MEe-?`J+D ,L]ESB Oqs 3 IP&H -dME tOX ]8AiX`GLD2 L&ktN"d0XW% -Z3PX\@[V`2cD_?- CEcQG 7F`MS BDD#C BBl J#6A7]@eDI mj"F)Q2A@qC -gGOuY1:ATVm"@r# drB9KiQ P'(hWF DtYuC M@[ !I?IP~> -% uk.co.terryburton.bwipp/renmaximatrix 0.0 0 +% --REQUIRES preamble raiseerror-- +%%BeginResource: uk.co.terryburton.bwipp renmaximatrix 0.0 2015050900 55426 55272 +%%BeginData: 79 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +begin +/renmaximatrix { + + 20 dict begin + + /args exch def % We are given some arguments + + % Default options + /barcolor (unset) def + /backgroundcolor (unset) def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /backgroundcolor backgroundcolor cvlit def + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + gsave + + currentpoint translate + + 2.4945 dup scale % from 1pt to 1.88mm + + 0 0 moveto 30 0 lineto 30 29 lineto 0 29 lineto closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + barcolor (unset) ne { barcolor setanycolor } if + + 0.5 0.5774 translate + + newpath + pixs { + dup + /x exch 30 mod def + /y exch 30 idiv def + y 2 mod 0 eq {x} {x 0.5 add} ifelse + 32 y sub 0.8661 mul + moveto + 0 0.5774 rmoveto + -0.5 -0.2887 rlineto + 0 -0.5774 rlineto + 0.5 -0.2887 rlineto + 0.5 0.2887 rlineto + 0 0.5774 rlineto + -0.5 0.2887 rlineto + closepath + } forall + fill + + % Plot the locator symbol + newpath 14 13.8576 0.5774 0 360 arc closepath + 14 13.8576 1.3359 360 0 arcn closepath fill + newpath 14 13.8576 2.1058 0 360 arc closepath + 14 13.8576 2.8644 360 0 arcn closepath fill + newpath 14 13.8576 3.6229 0 360 arc closepath + 14 13.8576 4.3814 360 0 arcn closepath fill + + grestore + + end + +} bind def +/renmaximatrix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END RENDERER renmaximatrix-- @@ -200,46 +477,143 @@ gGOuY1:ATVm"@r# drB9KiQ P'(hWF DtYuC M@[ !I?IP~> % --EXAM: 90200 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean5 0.0 0 0 0 -%%BeginData: 38 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D P!5 % OP!5 $bI= %,/ FE2M8Ou%NL 5FC f]=F (or3O tVtS 05+ p2B4uB0BOt mjBQTCjOu"b -5AU&-FCAm$+E -).6Gp$X3B5)I/0/%?SBldisEcQ)=P!=AX<.0p$04f$2F!+\I">_ef0ocAl1,:SE">V\e16)Jl1 -bg_F">MVe16)Jl1,CYF">MVc1l_\n1GLYF">MYd1QDSo0ekGD"#2McNWLpi?'6us@UX:eBOPq& -NX@Hp1,CaE2E*TUOu"b.Bl\64Ec#6(F!+\I"Yh_c0JJLj0eb=90TH;k0JG48NWh-k0JG5A"Y_Y -c0JJLj0JG490TH;j0JG49NWh*k0JP8A"Y_Yb0JSRk0JG480jTqu04S[,@r$..D281T1Pc$e!Jg -l*056S5Ou"b#@<,jk@<*K"@<,jrA7ZltP"UTbP,XU#BnuhRC5;kQ4aShlBOt[hF*2=B@UX:eBO -Pq;"-RJ1BOt[hF*2>_!Ko6eHS8lBARfLsF_r71@<,jk@<./1P&+WAARfLsF`!9BOu%NL%ARfLsF_upAP%p.905YEDEc5u8@;m?+Bl\64Ec#6(F!+t+ARfLsF`!:7Ou"b4 -@WR>IP,45?'9G\P"7\t061WA0/%?WDJX$)ARTU4F(025>9IurF*i]sP,Wkm8R3 -uYBQG;#L_+oHASGdjFFB=)>q]YrF!+\C&:935I?K4g+DG_'Cis9"FCf]=HS9JcF -% uk.co.terryburton.bwipp/ean5 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ean5 0.0 2015050900 62897 62576 +%%BeginData: 135 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/ean5 { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Helvetica def + /textsize 12 def + /textxoffset 0 def + /textyoffset (unset) def + /height 0.7 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /height height cvr def + /textxoffset textxoffset cvr def + textyoffset (unset) eq { + /textyoffset height 72 mul 1 add def + } { + /textyoffset textyoffset cvr def + } ifelse + + % Validate input + barcode length 5 ne { + /bwipp.ean5badLength (EAN-5 add-on must be 5 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.ean5badCharacter (EAN-5 add-on must contain only digits) //raiseerror exec + } if + } forall + + % Create an array containing the character mappings + /encs + [ (3211) (2221) (2122) (1411) (1132) + (1231) (1114) (1312) (1213) (3112) + (112) (11) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + % Determine the mirror map based on mod 10 checksum + /mirrormaps + [ (11000) (10100) (10010) (10001) (01100) + (00110) (00011) (01010) (01001) (00101) + ] def + /checksum 0 def + 0 1 4 { + /i exch def + /barchar barcode i get 48 sub def + i 2 mod 0 eq { + /checksum barchar 3 mul checksum add def + } { + /checksum barchar 9 mul checksum add def + } ifelse + } for + /checksum checksum 10 mod def + /mirrormap mirrormaps checksum get def + + /sbs 31 string def + /txt 5 array def + + 0 1 4 { + /i exch def + + % Prefix with either a start character or separator character + i 0 eq { + sbs 0 encs 10 get putinterval + } { + sbs i 1 sub 6 mul 7 add encs 11 get putinterval + } ifelse + + % Lookup the encoding for the barcode character + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + mirrormap i get 49 eq { % Reverse enc if 1 in this position in mirrormap + /enclen enc length def + /revenc enclen string def + 0 1 enclen 1 sub { + /j exch def + /char enc j get def + revenc enclen j sub 1 sub char put + } for + /enc revenc def + } if + sbs i 6 mul 3 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 1 sub 9 mul 13 add textxoffset add textyoffset textfont textsize] put + } for + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [16{height}repeat] + /bbs [16{0}repeat] + includetext { + /txt txt + } if + /opt options + /guardrightpos 10 + /guardrightypos textyoffset 4 add + /bordertop 10 + >> + + dontdraw not //renlinear if + + end + +} bind def +/ean5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ean5-- @@ -250,42 +624,128 @@ eDJ+B\;u~> % --EXAM: 05 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean2 0.0 0 0 0 -%%BeginData: 34 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D P!5 % OP!5 $bI= %,/ FE2M8Ou%NL 5FC f]=F (or3O tVtS 05+ p2B4uB0BOt mjBQTCjOu"b -5AU&-FCAm$+E -).6Gp$X3B5)I/0/%?SBldisEcQ)=P!=AX<.0p$04f$2F!+\I">_ef0ocAl1,:SE">V\e16)Jl1 -bg_F">MVe16)Jl1,CYF">MVc1l_\n1GLYF">MYd1QDSo0ekGD"#2McNWLpi?'6us@UX:eBOPq& -NX@Hp1,CaE2E*TUOu"b.Bl\64Ec#6(+Bsj-0JJLg0JSRh0eeUh0elrV@UX:eDe*F8!/L]>9Tgr -_"HmM_99M(aF(03H%?dQN1GFCf]=F(or3+C1.TI?I,`4>1_dDD*Y`ASuDN]7BOtmjBQSZcK3^->@WNYrL^\Wd!.C#_>p*j!@r-9uATVL.FF,Z_G -]Y'MG]\@s<%i0/FFEqe: -AohO*L]ikA04Jj?A7]e'DfCL>5!C*"Df0Z-Eaa0TE%`kbASu -% uk.co.terryburton.bwipp/ean2 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ean2 0.0 2015050900 61678 61382 +%%BeginData: 120 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/ean2 { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Helvetica def + /textsize 12 def + /textxoffset 0 def + /textyoffset (unset) def + /height 0.7 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /height height cvr def + /textxoffset textxoffset cvr def + textyoffset (unset) eq { + /textyoffset height 72 mul 1 add def + } { + /textyoffset textyoffset cvr def + } ifelse + + % Validate input + barcode length 2 ne { + /bwipp.ean2badLength (EAN-2 add-on must be 2 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.ean2badCharacter (EAN-2 add-on must contain only digits) //raiseerror exec + } if + } forall + + % Create an array containing the character mappings + /encs + [ (3211) (2221) (2122) (1411) (1132) + (1231) (1114) (1312) (1213) (3112) + (112) (11) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + % Determine the mirror map based on mod 4 checksum + /mirrormap [(00) (01) (10) (11)] barcode 0 2 getinterval cvi 4 mod get def + + /sbs 13 string def + /txt 2 array def + + 0 1 1 { + /i exch def + + % Prefix with either a start character or separator character + i 0 eq { + sbs 0 encs 10 get putinterval + } { + sbs i 1 sub 6 mul 7 add encs 11 get putinterval + } ifelse + + % Lookup the encoding for the barcode character + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + mirrormap i get 49 eq { % Reverse enc if 1 in this position in mirrormap + /enclen enc length def + /revenc enclen string def + 0 1 enclen 1 sub { + /j exch def + /char enc j get def + revenc enclen j sub 1 sub char put + } for + /enc revenc def + } if + sbs i 6 mul 3 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 1 sub 9 mul 13 add textxoffset add textyoffset textfont textsize] put + } for + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [12{height}repeat] + /bbs [12{0}repeat] + includetext { + /txt txt + } if + /opt options + /guardrightpos 10 + /guardrightypos textyoffset 4 add + /bordertop 10 + >> + + dontdraw not //renlinear if + + end + +} bind def +/ean2 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ean2-- @@ -293,80 +753,226 @@ AohO*L]ikA04Jj?A7]e'DfCL>5!C*"Df0Z-Eaa0TE%`kbASuD_ -?-CEcQG7F`MSBDD #CBBl J$S g6- ] D3% niO DDd S:06M% _@ rEuAAT Dg: -@Wc^5Df.1:GA2#8 P1l(D Ops 'U@ ;[ eU H\` B!2 3JD%Df Bf 4Df0WZ 5*@ -]T@UX:eDe*FB5*@ ]TA8 c@- A9 )+ &+D ,%u F(L Lj05 -5<6Cis9"FCf]=+D ,%uF ( LL j0 6Cc MFC oH/F HOb01 -GFCf]=AoDR/OtDhQ06CcMFE;/BAKZ) -+G]\"@H=`6mOu"b5AU&@:WneDKKH7FCoH/FHS5=1OYEc@:WneDKKH7FE;/BA -W?q:DKBB2P&5P!@:WneDKKH7FE;/BAKYDlA8c@-AU&<P#Pk#A8c@-AU&!?dPbHS8i:Eas#uAWf6?1Qll6@:WneDN[2H1OXV5FY@06A8c@G!0T-dP#Yt"Ea -s#uAWgMY%$GI:@<,jrA7^p5L^fMaOp$+b@WuO*E%Y^1DDGVoDfQsT1E^4BB5)I/0/%?SBldisEcQ)=P!=AX<+99V@rGmhH]g@E0Tp%25);4^:m,jG -04K->E,[F@@;[eU@UWe7BOPpi@ru:&NZU\U:+\1V+Dl7BFP'XEZd4^A8 -,[jFE9)gEa`['AS#n&DfV"*I?IP_E+*:5%?dQN1G<6OARfLsF_up7Ou%moL]N;>HS9)r5*@]T@ -UX:eBOPp(@UX:eDe*E%Bp),F0TrDu1MMXHP%odQP!+.F@q]F`CNFW8+C\c"@q]:k+Cf(r@r$.. -D3=p_1OXU'@q]F`CNFW8+C\c"@q]:kL]`fV@q]F`CNFW8Oo^_%I?ITYP"769BOt[hF*2>U$=da -\@r$..D28O^C6GQP$Bf.e1Lad5@rGmhP%'4VP!+/$@<,jrA7^Q*P"T:uARfLsF_upgOo^__HS8 -iPBlJ#DARTI21Lad'6YL%@CIDlLBlo@]8T&$VEcP`$FG% -kJuA1oTV@;0doATDg0EfrY8P#Qjm<,c8VL]CmmEas#uAWh=X@:Y0&@q]F`CNFW8LbOtmP'AWh@ -<,jrA7Zm&@:YNW04f$2F!+\I">_ef0ocAl1,:SE">V\e16)Jl1bg_F">MVe16)Jl1,CYF">MVc -1l_\n1GLYF">MYd1QDSo0ekGD"#2MbNWh-l0ekDC"#2Mb?'6us@UX:eBOPq&NX@Hp1,CaE2E*T -UOu"b.Bl\64Ec#6(F!+\I"u%_b0JG2@"u%_c0JP;B"u%_c0eb>B"u%_c0ekAB"u%bc0JP;B"u% -bd0JG5A"u%bd0eb;A"u%bc0eb>B"u%bc0ekAB"u%bd0JP7eOu"b4@WR>eP,4 -5?'9Gg!Jgc4#(&";P!5$b@UX:eDe*E%BnueQ9O_FN@q]:kF-8_MNKSFI@P;G5A9a8$Ou&8DP'& -EhDIXf#DI[`1Bl7I+P"UroD/"$2DfT]'E$/kN!KsFF98G5?'9G\P"9Y'F,1'W!KsF<"HmSW"-N[rDI[aD$^+/GH&)]]!Jh/2056 -S5Ou$QUEas#uAKY]C!Kp,c@<,jk@<-FP5*CngFcp2eBl7I+P!5$bP')q104f$2+D#G#F!,17A9 -a81Ou%/gF!,1Q!KsF<"HmSW#a,4"DI\iTFEhmMBcpV&@UX:eDe*E%BnueQ9PK:`P,X6BP&,peO -o]Z9G]\1KAnH*qFHQZHAU&FCf]=F(or3+C1.TI?I-B@WR>bASu"! -L^]G>P'J^%@WNYr+EM"5H\aA=WI9q$?'7!XDI[L*A7]joG]\9c@VBg*>9ITjBkM+$+D>>#B4uC -C%!uZ!BkM+$MERAqRZaXuP(RFZBkM+$+D>>#B4uCC%!uZ!BkM+$MERAqRZaXuP(RFZBkM+$+D> ->#B4uB0?'6us@UaC$>DN98!/M&1MERAqRXL?OL]E52L^\Wf4dh_,I?K5=!/LV\Ou%N504JU9+B -sXCHY?u)B4uC8P(R&'1G<3HF!+\C*d`\CI?K4gOu"b5G]Y'4+C1-dI?IS`B6@X'A9)BsBQSN=D -f^^7Ou$NWA8c@G!0V2G04AC%DfBf>+?Vb>A8c@-A9)+&+EVXHAM7b8@r-9uATVL.F -ASGdjF"*7pmP"Ur>P'(&n1G<3NF!+[0@VBhG!g -7\7A7T1gA7^c'@VBhG97)OZR@0M,WI9q$?'6us@UaC$>9IBaF-6TfF^\fk@rGmhNWWa"F-91CM -ERAqRZ[]"P"ArB1GF^:.d05#E9Eb'3)B4uC4 -E,Te?BOtmjBQT&$P&,pYP,XU#I?IPl4>1_dDD*Y`ASu -% uk.co.terryburton.bwipp/ean13 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ean13 0.0 2015050900 84460 87603 +%%BeginData: 215 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean2 dup /uk.co.terryburton.bwipp findresource put +dup /ean5 dup /uk.co.terryburton.bwipp findresource put +begin +/ean13 { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Helvetica def + /textsize 12 def + /textxoffset -10 def + /textyoffset -4 def + /height 1 def + /addongap 12 def + /addontextfont (unset) def + /addontextsize (unset) def + /addontextxoffset (unset) def + /addontextyoffset (unset) def + + % Parse the input options, either a string or a dict + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + /addongap addongap cvr def + addontextfont (unset) ne {/addontextfont addontextfont cvlit def} if + addontextsize (unset) ne {/addontextsize addontextsize cvr def} if + addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if + addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + + % Split off the addon + barcode ( ) search { + /barcode exch def + pop + /addon exch def + } { + pop + /addon () def + } ifelse + + % Validate the input + barcode length 12 ne barcode length 13 ne and { + /bwipp.ean13badLength (EAN-13 must be 12 or 13 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.ean13badCharacter (EAN-13 must contain only digits) //raiseerror exec + } if + } forall + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.ean13badAddOnLength (Add-on for EAN-13 must be 2 or 5 digits) //raiseerror exec + } if + + % Add checksum digit + /pad 13 string def + /checksum 0 def + 0 1 11 { + /i exch def + /barchar barcode i get 48 sub def + i 2 mod 0 eq { + /checksum barchar checksum add def + } { + /checksum barchar 3 mul checksum add def + } ifelse + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 13 eq { + barcode 12 get checksum 48 add ne { + /bwipp.ean13badCheckDigit (Incorrect EAN-13 check digit provided) //raiseerror exec + } if + } if + pad 0 barcode putinterval % Add barcode to the start of the pad + pad 12 checksum 48 add put % Put ascii for checksum at end of pad + /barcode pad def + + % Create an array containing the character mappings + /encs + [ (3211) (2221) (2122) (1411) (1132) + (1231) (1114) (1312) (1213) (3112) + (111) (11111) (111) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + % Digits to mirror on left side + /mirrormaps + [ (000000) (001011) (001101) (001110) (010011) + (011001) (011100) (010101) (010110) (011010) + ] def + + /sbs 59 string def + /txt 13 array def + + % Put the start character + sbs 0 encs 10 get putinterval + + % First digit - determine mirrormap by this and show before guard bars + /mirrormap mirrormaps barcode 0 get 48 sub get def + txt 0 [barcode 0 1 getinterval textxoffset textyoffset textfont textsize] put + + % Left side - performs mirroring + 1 1 6 { + % Lookup the encoding for the each barcode character + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + mirrormap i 1 sub get 49 eq { % Reverse enc if 1 in this position in mirrormap + /enclen enc length def + /revenc enclen string def + 0 1 enclen 1 sub { + /j exch def + /char enc j get def + revenc enclen j sub 1 sub char put + } for + /enc revenc def + } if + sbs i 1 sub 4 mul 3 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 1 sub 7 mul 14 add textxoffset add textyoffset textfont textsize] put + } for + + % Put the middle character + sbs 7 1 sub 4 mul 3 add encs 11 get putinterval + + % Right side + 7 1 12 { + % Lookup the encoding for the each barcode character + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 1 sub 4 mul 8 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 1 sub 7 mul 18 add textxoffset add textyoffset textfont textsize] put + } for + + % Put the end character + sbs 56 encs 12 get putinterval + + /sbs [sbs {48 sub} forall] def + includetext { + /bhs [height height 12{height .075 sub}repeat height height 12{height .075 sub}repeat height height] def + /bbs [0 0 12{.075}repeat 0 0 12{.075}repeat 0 0] def + } { + /bhs [30{height}repeat] def + /bbs [30{0}repeat] def + /txt [] def + } ifelse + /guardrightypos 0 def + + % Append the addon + addon () ne { + /addopts << + /dontdraw true + /includetext true + /height height 0.15 sub + /textxoffset addontextxoffset (unset) ne {addontextxoffset} {95 addongap add} ifelse + addontextyoffset (unset) ne {/textyoffset addontextyoffset} if + /textsize addontextsize (unset) ne {addontextsize} {textsize} ifelse + /textfont addontextfont (unset) ne {addontextfont} {textfont} ifelse + >> def + addon length 2 eq {addon addopts //ean2 exec} if + addon length 5 eq {addon addopts //ean5 exec} if + /addcode exch def + /sbs [sbs aload pop addongap addcode (sbs) get aload pop] def + /bhs [bhs aload pop addcode (bhs) get {.075 sub} forall] def + /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def + /txt [txt aload pop addcode (txt) get aload pop] def + /guardrightypos height 72 mul 6 sub def + } if + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs bhs + /bbs bbs + /txt txt + /opt options + /guardrightpos 10 + /guardrightypos guardrightypos + /borderbottom 5 + >> + + dontdraw not //renlinear if + + end + +} bind def +/ean13 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ean13-- @@ -374,74 +980,207 @@ X'A9)BsBQSN=Df[R@DfTB"Eais/FDl#P"[5*mA8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou % --BEGIN ENCODER ean8-- % --REQUIRES preamble raiseerror renlinear ean5 ean2-- % --DESC: EAN-8 -% --EXAM: 01335583 -% --EXOP: includetext guardwhitespace height=0.5 +% --EXAM: 02345673 +% --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean8 0.0 0 0 0 -%%BeginData: 63 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D_ -?-CEcQG7F`MSBDD #CBBl J$S g6- ] D3% niO DDd S:06M% _@ rEuAAT Dg: -@Wc^5Df.1:GA2#8 P1l(D Ops 'U@ ;\ &O L_Q "0O ps'_E- ,f 4DKCt) Ou" -b#@<,jrA7^ofOu" b%Df 0Z- Ea a/ 7Am oLs AWe i&Bl -7EsF_#'*AU&;>Am oLsA W ei &F Cf] =Ao DR/O irnD0 -6CcMFE;/BAV^bX1 GX4aVtcOu8C 3DfBf 4Df0W CP,i2 'Ci a0N4aW>WI? IQm30Ia6V33 -Qn!BlU*FE2M8P!+ /T/Wr;\ FcnqO1 OXV5/ Tc# UAWeitP#Zp nAWe*t3A5;i -FD5Z2F-8_M1OYEcDfBf4Df0WCOu%NL8M>0sG][P9DKI"CAU&FE;/BAWe^01G>#B4uCM09S+E@:WneDJ*Bs+CSekDf02rE0;l;1LXg)Df0Z.G][P9DK -LmBF`)83FHUKf04AC%Df0Z.G][P9DKI"0A7TUrFCf]=AoDR/OtDhQI?IQ$K04K->E,[F@@;\ -&6@:VZ7A5@):ASu.&BT=E*A7R91DBNP0EZde::+\FJD09oA+C\n)1*CLU+>k9PBkM.%F"]1e@; -0doATDg0EfrY8P#O)R@:Y0"P,4_!Ko6eP#Zpn82"IdARfLsF_upA@q]F`CNFW8L^K; -[P,X6EP%p.9@UX:eDe*FB@Yb;Q4aUXHEas#uAV^SS94MXH@r$..D29m/!Kq;H04K->E,[F@@;\ -&6@:V`=ARfLDBkM.%N[.26@rHC.ARfg)76s[#3$;^EARfKuA8,[jFNW_*l1,=jm0f1U>NW_'k1GXsn0etO>NW_'k0f4mn0f(O>NW_'l -0f+gm1GLU>NWV!j0ocDl0ekC;NWV!j0jTqu04J@1@q]:kF,gS]0etOA2)[BQ3Kc0OF(03H/!?` -l1G*ASu"!L^K;FE;/BAKY9AG^Y`GF(03H"Gd2DCkr1V!G-.YF,13e99ORV"Gd)7#CA+9IB`Eas#uAKY]C!Kp,jL^0)ZFCf]=G].2+F(KHV!JglA!H_mtFEq -e:AohO*+EV1>FCoH/FNASGdjFFB=)?'6us@UaC -$>DO&AL]DjdK3aWr06DG\+BosoOu%NL15`DKKE0@FE2M805+p2B4uB0BOtmjBQT+q)4?qVW@ -r@)G]\1KAnH*qF0/$mFDDIA>I?IQ0/$mFDDdSAI?IP_@:WnYDe*FB5*@]TF(025>9IurF-6TfF^\fkD -f02rE$/S"A7KOgAW?k6@WR]*Oogeh?'6us@VBg*>9IBgF-6TfF^\fk@rGmhNWWa(F-91CMERAq -RZaXuP"ArB1G<3HF!+[0@UaDA!g7\7A7T1gA7^c'@UaDA97)OZR@0M,!I^,&?'6usFEhmM>9J$ -4FHQ]gF^\fk@rGmhNWXBJFHT:[!g7\3Ou"b(F^]<$EbT0"FEqhDF!,.-BkM+$Le*\FL^'$AOu% -NL<'38rEb0,A061WACh[cu@<+#B@WNZ5@WO23BQG;*BQGh9@WNZ$@WO2EG]Y'MG]YTWE-*4@E- -,f4DK@IDF^]<$Ch74#E,TfR$86%7@<,n!BkM+$E,TfR$86%7@<,n!BkM+$H#R\C+D5h*Eb'3)B -4uC4E,TeN@W-9tATD6uFEDG -% uk.co.terryburton.bwipp/ean8 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ean8 0.0 2015050900 81954 85278 +%%BeginData: 196 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean2 dup /uk.co.terryburton.bwipp findresource put +dup /ean5 dup /uk.co.terryburton.bwipp findresource put +begin +/ean8 { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Helvetica def + /textsize 12 def + /textxoffset 4 def + /textyoffset -4 def + /height 1 def + /addongap 12 def + /addontextfont (unset) def + /addontextsize (unset) def + /addontextxoffset (unset) def + /addontextyoffset (unset) def + + % Parse the input options, either a string or a dict + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + /addongap addongap cvr def + addontextfont (unset) ne {/addontextfont addontextfont cvlit def} if + addontextsize (unset) ne {/addontextsize addontextsize cvr def} if + addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if + addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + + % Split off the addon + barcode ( ) search { + /barcode exch def + pop + /addon exch def + } { + pop + /addon () def + } ifelse + + % Validate the input + barcode length 7 ne barcode length 8 ne and { + /bwipp.ean8badLength (EAN-8 must be 7 or 8 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.ean8badCharacter (EAN-8 must contain only digits) //raiseerror exec + } if + } forall + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.ean8badAddOnLength (Add-on for EAN-8 must be 2 or 5 digits) //raiseerror exec + } if + + % Add checksum digit + /pad 8 string def + /checksum 0 def + 0 1 6 { + /i exch def + /barchar barcode i get 48 sub def + i 2 mod 0 ne { + /checksum barchar checksum add def + } { + /checksum barchar 3 mul checksum add def + } ifelse + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 8 eq { + barcode 7 get checksum 48 add ne { + /bwipp.ean8badCheckDigit (Incorrect EAN-8 check digit provided) //raiseerror exec + } if + } if + pad 0 barcode putinterval % Add barcode to the start of the pad + pad 7 checksum 48 add put % Put ascii for checksum at end of pad + /barcode pad def + + % Create an array containing the character mappings + /encs + [ (3211) (2221) (2122) (1411) (1132) + (1231) (1114) (1312) (1213) (3112) + (111) (11111) (111) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + /sbs 43 string def + /txt 8 array def + + % Put the start character + sbs 0 encs 10 get putinterval + + % Left side + 0 1 3 { + % Lookup the encoding for the each barcode character + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 4 mul 3 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 7 mul textxoffset add textyoffset textfont textsize] put + } for + + % Put the middle character + sbs 4 4 mul 3 add encs 11 get putinterval + + % Right side + 4 1 7 { + % Lookup the encoding for the each barcode character + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 4 mul 8 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 7 mul textxoffset add 4 add textyoffset textfont textsize] put + } for + + % Put the end character + sbs 40 encs 12 get putinterval + + /sbs [sbs {48 sub} forall] def + includetext { + /bhs [height height 8{height .075 sub}repeat height height 8{height .075 sub}repeat height height] def + /bbs [0 0 8{.075}repeat 0 0 8{.075}repeat 0 0] def + } { + /bhs [22{height}repeat] def + /bbs [22{0}repeat] def + /txt [] def + } ifelse + /guardrightypos 0 def + + % Append the addon + addon () ne { + /addopts << + /dontdraw true + /includetext true + /height height 0.15 sub + /textxoffset addontextxoffset (unset) ne {addontextxoffset} {67 addongap add} ifelse + addontextyoffset (unset) ne {/textyoffset addontextyoffset} if + /textsize addontextsize (unset) ne {addontextsize} {textsize} ifelse + /textfont addontextfont (unset) ne {addontextfont} {textfont} ifelse + >> def + addon length 2 eq {addon addopts //ean2 exec} if + addon length 5 eq {addon addopts //ean5 exec} if + /addcode exch def + /sbs [sbs aload pop addongap addcode (sbs) get aload pop] def + /bhs [bhs aload pop addcode (bhs) get {.075 sub} forall] def + /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def + /txt [txt aload pop addcode (txt) get aload pop] def + /guardrightypos height 72 mul 6 sub def + } if + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs bhs + /bbs bbs + /txt txt + /opt options + /guardleftpos 10 + /guardrightpos 10 + /guardrightypos guardrightypos + /borderbottom 5 + >> + + dontdraw not //renlinear if + + end + +} bind def +/ean8 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ean8-- @@ -449,76 +1188,259 @@ DH]iMmATVm"@r#drB75qB~> % --BEGIN ENCODER upca-- % --REQUIRES preamble raiseerror renlinear ean5 ean2-- % --DESC: UPC-A -% --EXAM: 488581014973 +% --EXAM: 416000336108 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp upca 0.0 0 0 0 -%%BeginData: 65 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D_ -?-CEcQG7F`MSBDD #CBBl J$S g6- ] D3% niO DDd S:06M% _@ rEuAAT Dg: -@Wc^5Df.1:GA2#8 P1l(D Ops 'eE +< =' L_Q "0O ps'_E- ,f 4DKCt) Ou" -b#@<,jrA7^ofOu" b%Df 0Z- Ea a/ 7Am oLs AWe i&Bl -7EsF_#'*AU&;>Am oLsA W ei &F Cf] =Ao DR/O irnD0 -6CcMFE;/BAV^bX1 GX4aVtcOu8C 3DfBf 4Df0W CP,i2 'Ci a0N4aW>WI? IQm30Ia6V33 -Qn!BlU*FE2M8P!+ /T/Wr;\ FcnqO1 OXV5/ Tc# UAWeitP#Zp nAWe*t3A5;i -FD5Z2F-8_M1OYEcDfBf4Df0WCOu%NL8M>0sG][P9DKI"CAU&FE;/BAWe^01G>#B4uCM09S+E@:WneDJ*Bs+CSekDf02rE0;l;1LXg)Df0Z.G][P9DK -LmBF`)83FHUKf04AC%Df0Z.G][P9DKI"0A7TUrFCf]=AoDR/OtDhQI?IQ-FCAm$+E).6Gp$X3B5)I/0/%?SBldi -sEcQ)=P!=AX<.0p$@:WneDN\Ib!0V2-A7TUrP%'4KP&6?b@:WneDN\Ib"d3_c"FDe2GA2#8/p2 -,C6"4856"FM%DG4VZB67gI-:)0Q/T5MLAoD]4U!0T-o!/LZ3$@=F?P!5$b04J@1@q]:k+ -C\c"@rGmh+DI!3LbP!kOu$g.!g7;S!0V2G04S[,@r$..D'3>%ARfLsF_r71@<,jk@<.M3Ou%N5 -04S[,@r$..D'3>%ARfLsF_r71@<,jk@<./+P&-9^Ou%NL -U$Bf.eWJCnEC6CA^@<,jrA7^p5L^]G0HX^E(@rGmhL^TA=@q]F`CNFW8LbOtmP&5P!@WuO*E%Z -9P@mOR4A4($A@r"JHB5)IJ,Y;l`DfTl0@rrhn:dZg#+Cf(r@r!2tBkM.%+E2@>G%kJuA1oTV@; -0doATDg0EfrY8P#Qjm<,c8VL]CmmEas#uAWh=X@:Y0%@q]F`CNFW8LbOtmP'AWh@<,jrA7Zm&@ -:YNW04f$2F!+\I">_ef0ocAl1,:SE">V\e16)Jl1bg_F">MVe16)Jl1,CYF">MVc1l_\n1GLYF -">MYd1QDSo0ekGD"#2MbNWh-l0ekDC"#2Mb?'6us@UX:eBOPq&NX@Hp1,CaE2E*TUOu"b4@WR> -eP,4FCf]=F(or3+C1.TI?ITYP"9Y'F,1$V"HmSW"-N[rDI[a -D$^+/GH&)Z\!Jh,1056S5Ou$QUEas#uAKY]C!Kp,c@<,jk@<-FP5*CngFcp2eBl7I+P!5$bP') -q104f$2+D#G#F!,17A9a81Ou%/gF!,1Q"HmSW#a,4"DI\iTBo!.[4aV9qFGLP"]t/G]\1KAnH*qFGORm!H_mtFEqe:AohO*+EV1>FCoH/F5?'9G\P#Zpn8986]LcAs`@rmG7P"Us`06:TD+Bot0@WQmP0TrD`P"ArB1ML` -:Cis9"FCf]=HS8iAF!+\C"FFfnBkM+$I?K5=$@?GtBkM+$MERAqRZaXuP(RFZBkM+$+D>>#B4u -CC$@?GtBkM+$MERAqRZaXuP(SPnHY?u)B4uC8P(R&'1G<3HF!+\C!/LW2!/LW2$@@XnR@0LlP( -SPjL]E5DO>IL -]DjdK3aWr06DG\+BosoOu%NL15`DKKE0@FE2M805+p2B4uB0BOtmjBQT+q)4?qVW@r@)G]\1 -KAnH*qF0/$mFDDIA>I?IQ0/$mFDDdSAI?IP_@:WnYDe*FB5*@]TF(025>9IurF-6TfF^\fkDf02rE$/ -S"A7KOgAW?k6@WR]*Oogeh?'6us@VBg*>9IBgF-6TfF^\fk@rGmhNWWa(F-91CMERAqRZaXuP" -ArB1G<3HF!+[0@UaDA!g7\7A7T1gA7^c'@UaDA97)OZR@0M,!I^,&?'6usFEhmM>9J$4FHQ]gF -^\fk@rGmhNWXBJFHT:[!g7\3Ou"b(F^]<$EbT0"FEqhDF!,.-BkM+$Le*\FL^'$AOu%NL<'38r -Eb0,A061WACh[cu@<+#B@WNZ5@WO23BQG;*BQGh9@WNZ$@WO2EG]Y'MG]YTWE-*4@E-,f4DK@I -DF^]<$EbT0"FDu/>L^GeJF^]<$EbT0"FEqhDF!,+<@<,n!BkM+$H#R\C04Jj?A7]djDfg)>D28 -?Z4s4BSDKKE0@<[lR0/%?WDJX$)ARTVB<0B7iOq*X206M5D@?NU5A1r(@/n8fPFCfK5H"(o:FD -l%L@WuO*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> -% uk.co.terryburton.bwipp/upca 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp upca 0.0 2015050900 89013 91922 +%%BeginData: 248 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean2 dup /uk.co.terryburton.bwipp findresource put +dup /ean5 dup /uk.co.terryburton.bwipp findresource put +begin +/upca { + + 20 dict begin + + /options exch def + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Helvetica def + /textsize 12 def + /textxoffset -7 def + /textyoffset -4 def + /height 1 def + /addongap 12 def + /addontextfont (unset) def + /addontextsize (unset) def + /addontextxoffset (unset) def + /addontextyoffset (unset) def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + /addongap addongap cvr def + addontextfont (unset) ne {/addontextfont addontextfont cvlit def} if + addontextsize (unset) ne {/addontextsize addontextsize cvr def} if + addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if + addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + + % Split off the addon + barcode ( ) search { + /barcode exch def + pop + /addon exch def + } { + pop + /addon () def + } ifelse + + % Expand a given UPC-E + barcode length 7 eq barcode length 8 eq or { + % Validate the input + barcode { + dup 48 lt exch 57 gt or { + /bwipp.upcAupcEbadCharacter (UPC-E must contain only digits) //raiseerror exec + } if + } forall + barcode 0 get dup 48 ne exch 49 ne and { + /bwipp.upcAupcEbadNumberSystem (UPC-E must have number system 0 or 1) //raiseerror exec + } if + 1 { % Common exit + /upcacode barcode length 8 eq {12} {11} ifelse string def + barcode 6 get 48 sub 2 le { + upcacode 0 barcode 0 3 getinterval putinterval + upcacode 3 barcode 6 1 getinterval putinterval + upcacode 4 (0000) putinterval + upcacode 8 barcode 3 3 getinterval putinterval + exit + } if + barcode 6 get 48 sub 3 eq { + upcacode 0 barcode 0 4 getinterval putinterval + upcacode 4 (00000) putinterval + upcacode 9 barcode 4 2 getinterval putinterval + exit + } if + barcode 6 get 48 sub 4 eq { + upcacode 0 barcode 0 5 getinterval putinterval + upcacode 5 (00000) putinterval + upcacode 10 barcode 5 1 getinterval putinterval + exit + } if + barcode 6 get 48 sub 5 ge { + upcacode 0 barcode 0 6 getinterval putinterval + upcacode 6 (0000) putinterval + upcacode 10 barcode 6 1 getinterval putinterval + exit + } if + } repeat + barcode length 8 eq { + upcacode 11 barcode 7 1 getinterval putinterval + } if + /barcode upcacode def + } if + + % Validate the input + barcode length 11 ne barcode length 12 ne and { + /bwipp.upcAbadLength (UPC-A must be 11 or 12 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.upcAbadCharacter (UPC-A must contain only digits) //raiseerror exec + } if + } forall + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.upcAbadAddOnLength (Add-on for UPC-A must be 2 or 5 digits) //raiseerror exec + } if + + % Add checksum digit to barcode + /pad 12 string def % Create pad one bigger than barcode + /checksum 0 def + 0 1 10 { + /i exch def + /barchar barcode i get 48 sub def + i 2 mod 0 ne { + /checksum checksum barchar add def + } { + /checksum checksum barchar 3 mul add def + } ifelse + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 12 eq { + barcode 11 get checksum 48 add ne { + /bwipp.upcAbadCheckDigit (Incorrect UPC check digit provided) //raiseerror exec + } if + } if + pad 0 barcode putinterval % Add barcode to the start of the pad + pad 11 checksum 48 add put % Put ascii for checksum at end of pad + /barcode pad def + + % Create an array containing the character mappings + /encs + [ (3211) (2221) (2122) (1411) (1132) + (1231) (1114) (1312) (1213) (3112) + (111) (11111) (111) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + /sbs 59 string def + /txt 12 array def + + % Put the start character + sbs 0 encs 10 get putinterval + + % Left side + 0 1 5 { + % Lookup the encoding for the each barcode character + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 4 mul 3 add enc putinterval % Put encoded digit into sbs + i 0 eq { % First digit is before the guard bars + txt 0 [barcode 0 1 getinterval textxoffset textyoffset textfont textsize 2 sub] put + } { + txt i [barcode i 1 getinterval i 7 mul 11 add textxoffset add textyoffset textfont textsize] put + } ifelse + } for + + % Put the middle character + sbs 6 4 mul 3 add encs 11 get putinterval + + % Right side + 6 1 11 { + % Lookup the encoding for the each barcode character + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 4 mul 8 add enc putinterval % Put encoded digit into sbs + i 11 eq { % Last digit is after guard bars + txt 11 [barcode 11 1 getinterval textxoffset 103 add textyoffset textfont textsize 2 sub] put + } { + txt i [barcode i 1 getinterval i 7 mul textxoffset add 15 add textyoffset textfont textsize] put + } ifelse + } for + + % Put the end character + sbs 56 encs 12 get putinterval + + /sbs [sbs {48 sub} forall] def + includetext { + /bhs [4{height}repeat 10{height .075 sub}repeat height height 10{height .075 sub}repeat 4{height}repeat] def + /bbs [0 0 0 0 10{.075}repeat 0 0 10{.075}repeat 0 0 0 0] def + } { + /bhs [30{height}repeat] def + /bbs [30{0}repeat] def + /txt [] def + } ifelse + /guardrightypos 0 def + + % Append the addon + addon () ne { + /addopts << + /dontdraw true + /includetext true + /height height 0.15 sub + /textxoffset addontextxoffset (unset) ne {addontextxoffset} {95 addongap add} ifelse + addontextyoffset (unset) ne {/textyoffset addontextyoffset} if + /textsize addontextsize (unset) ne {addontextsize} {textsize} ifelse + /textfont addontextfont (unset) ne {addontextfont} {textfont} ifelse + >> def + addon length 2 eq {addon addopts //ean2 exec} if + addon length 5 eq {addon addopts //ean5 exec} if + /addcode exch def + /sbs [sbs aload pop addongap addcode (sbs) get aload pop] def + /bhs [bhs aload pop addcode (bhs) get {.075 sub} forall] def + /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def + /txt [txt aload pop addcode (txt) get aload pop] def + /guardrightypos height 72 mul 6 sub def + } if + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs bhs + /bbs bbs + /txt txt + /opt options + /guardrightpos 10 + /guardrightypos guardrightypos + /borderbottom 5 + >> + + dontdraw not //renlinear if + + end + +} bind def +/upca dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER upca-- @@ -527,86 +1449,297 @@ l%L@WuO*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --REQUIRES preamble raiseerror renlinear ean5 ean2-- % --DESC: UPC-E % --EXAM: 00123457 -% --EXOP: includetext height=0.4 +% --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp upce 0.0 0 0 0 -%%BeginData: 76 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D_ -?-CEcQG7F`MSBDD #CBBl J$S g6- ] D3% niO DDd S:06M% _@ rEuAAT Dg: -@Wc^5Df.1:GA2#8 P1l(D Ops 'eE +< I+ L_Q "0O ps'_E- ,f 4DKCt) Ou" -b#@<,jrA7^ofOu" b%Df 0Z- Ea a/ 7Am oLs AWe i&Bl -7EsF_#'*AU&;>Am oLsA W ei &F Cf] =Ao DR/O irnD0 -6CcMFE;/BAV^bX1 GX4aVtcOu8C 3DfBf 4Df0W CP,i2 'Ci a0N4aW>WI? IQm30Ia6V33 -Qn!BlU*FE2M8P!+ /T/Wr;\ FcnqO1 OXV5/ Tc# UAWeitP#Zp nAWe*t3A5;i -FD5Z2F-8_M1OYEcDfBf4Df0WCOu%NL8M>0sG][P9DKI"CAU&FE;/BAWe^01G>#B4uCM09S+E@:WneDJ*Bs+CSekDf02rE0;l;1LXg)Df0Z.G][P9DK -LmBF`)83FHUKf04AC%Df0Z.G][P9DKI"0A7TUrFCf]=AoDR/OtDhQI?IQ$K04K->E,[FPE+; -=G@:VZ7A5@):ASu.&BT=E*A7R91DBNP0EZe@Y6S1_LD09oA+C\n)1*CLU+>k9PBkM.%F"]1e@; -0doATDg0EfrY8P#Pn!Eas#uAV^>L99M8j0Tp:95):qVD3>$K04K->E,[FPE+;=G@:W,UD.7's; -gEG+ASmGQNW_*l1,=jm0f1U>NW_'k1GXsn0etO>NW_'k0f4mn0f(O>NW_' -l0f+gm1GLU>NWV!j0ocGm0ekC;0jTqu04J@1@q]:kF,gS]0etOA2)[BQ3Kc0OD/"$2DfT]'E-! -.+NWq0k0JP::NWq0k0eb=:NWq0k0ek@:NWq0k0ekC:NWq0l0JG49NWq0l0eb:9NWq0l0ek@9NW -q0l0JP79NWq0l0JP:9NWq0l0eb=9?'6usF`:i!@rGmhNXINp0JG170JG170Sg+"V32^Z1NdYH@ -:O4dAV^=q@<,jrA7^PsP"Us_@UX:eDe*F8#*MW80TrDk!g6u=F`:i!@rGmhL]LsnEas#uAV^AC -!g66?H$+(9@:O4dAV^Ft@<,jrA7^Q$L]NZ4P'M1h@prkcA7^Q&@UX:eDe*F8",I&B9Tj[LP#Pn -!Eas#uAV^PR98G9bWJCY>4aVH$tiT@UX:eDe*F8#*MW80TrDk"d2K)F`:i!@rGmhL]LsnE -as#uAV^AC"d2QBH$+(9@:O4dAV^\&@<,jrA7^Q$L]NZ4P'MJ=<%h`pARfLsF_up7Ou%moL]N;= -HS9)r5*@]T@UX:eBOPp(F`:i!@rGmh+DI!3LbP!kOu$g.!g7;S!0V2G04S[,@r$..D'3>%ARfL -sF_r71@<,jk@<.M3Ou%N504S[,@r$..D'3>%ARfLsF_r71@<,jk@<./+P&-9^Ou%NLU$Bf.eWJCnEC6CA^@<,jrA7^p5L^9/,HX^E(@rGmhL^0)9@q]F`CN -FW8LbOtmP&5P!@WuO*E%Z9P@msj8A4($A@r"JHB5)IJ,Y;l`DfTl0@rrhn:dZg'+Cf(r@r!2tB -kM.%+E2@>G%kJuA1oTV@;0doATDg0EfrY8P#Qjm<%i3!A;CMSV33WR@:Y/o@UX:eDe*FBH#R2& -L^.F'ARfLsF_upgOo^_j04J@1@rGmh+E1b"Ou"b5G]\`IOpR:-FEhn`!*^RT@<,jrA7^PsL]NZ -4FCf]=G].2+F(KG9FCf]=H#I;,F(KG9FCf]=AoDR/+EV1>FE;/BAV^DNWEk[305YEDEc5u8@;m -?+Bl\64Ec#6(F!+t+ARfLsF`!:7Ou$QUEas#uAV^>L98G9b4aShrDK^+ED/"$2DfT]'E0=[nV3 -3Wj!/LYmBl\64Ec#6(P%'4JP,Wd]Bp(ZC1MpiHEc5u8@;m?'P"UTbP!+/+DK^+EBo"L,G^XpQD -K^+EBo"I+G^Y`TI?I,SD/"$2DfT]'E$/k4G'&m'I?IP_F(03H+d/[b1NR#HL]D"(@rmG5P"Us` -L]N;4L^&2ZBp(ZC1Lad5@rGmh+DHW4P"]=nEarckEc[C-P)YWIP%$(YDIe!T5*@^bFcpl#ASu! -#ASu"!+DG_(G`k^_1MpiHEc5u8@;m?'L]N[FCf]=F(or3+C1.TI?I-CG]\`H>9IB`Eas#uAV^SI!Kp-4#)EMICkr^e!H_mtFEh_9AohO -*Oo]Z9G]\4LAnH*qF>#B4uB0BOtmjBQT%=HY?u)B4uCE4d -h_,P,WkmK4nh1B4uB0BOtmjBQPA1ASGdjF9I471OYEd05#E9 -Eb'3)B4uC4E,TfR!0T-HA7TUrNW>5ZHS8f5@:WneDKKH7F -E;/BAW?q:DKBB2P&5PSA7TUrFCf]=F(or3I=!)YAU&<@:WneDKKH7 -FCoH/FH-NIDKBB2P&5PSA7TUrFCf]=AoDR/I=!)YAU&"(GqbP"U.Z4dh_,P,Wkm8R7K804JC3+Bost@WR\6P'(2DA7KOgA -W?k%@WR]*H\stSR@99>I?I0-Ou"b5G]Y'4+EVjMOogeh@:WnYDe*F>"*Ad0P"Ur>P'(&n1G>#B4uCC8%QOF -% uk.co.terryburton.bwipp/upce 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp upce 0.0 2015050900 92938 99490 +%%BeginData: 287 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean2 dup /uk.co.terryburton.bwipp findresource put +dup /ean5 dup /uk.co.terryburton.bwipp findresource put +begin +/upce { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Helvetica def + /textsize 12 def + /textxoffset -7 def + /textyoffset -4 def + /height 1 def + /addongap 12 def + /addontextfont (unset) def + /addontextsize (unset) def + /addontextxoffset (unset) def + /addontextyoffset (unset) def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + /addongap addongap cvr def + addontextfont (unset) ne {/addontextfont addontextfont cvlit def} if + addontextsize (unset) ne {/addontextsize addontextsize cvr def} if + addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if + addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + + % Split off the addon + barcode ( ) search { + /barcode exch def + pop + /addon exch def + } { + pop + /addon () def + } ifelse + + % Compress a given UPC-A + barcode length 11 eq barcode length 12 eq or { + % Validate the input + barcode { + dup 48 lt exch 57 gt or { + /bwipp.upcEupcAbadCharacter (UPC-A must contain only digits) //raiseerror exec + } if + } forall + 1 { % Common exit + /upcecode barcode length 12 eq {8} {7} ifelse string def + barcode 3 get 48 sub 2 le barcode 4 4 getinterval (0000) eq and { + upcecode 0 barcode 0 3 getinterval putinterval + upcecode 3 barcode 8 3 getinterval putinterval + upcecode 6 barcode 3 1 getinterval putinterval + exit + } if + barcode 4 5 getinterval (00000) eq { + upcecode 0 barcode 0 4 getinterval putinterval + upcecode 4 barcode 9 2 getinterval putinterval + upcecode 6 (3) putinterval + exit + } if + barcode 5 5 getinterval (00000) eq { + upcecode 0 barcode 0 5 getinterval putinterval + upcecode 5 barcode 10 1 getinterval putinterval + upcecode 6 (4) putinterval + exit + } if + barcode 10 get 48 sub 5 ge barcode 6 4 getinterval (0000) eq and { + upcecode 0 barcode 0 6 getinterval putinterval + upcecode 6 barcode 10 1 getinterval putinterval + exit + } if + /bwipp.upcEupcAnotCompressible (UPC-A cannot be converted to a UPC-E) //raiseerror exec + } repeat + barcode length 12 eq { + upcecode 7 barcode 11 1 getinterval putinterval + } if + /barcode upcecode def + } if + + % Validate the input + barcode length 7 ne barcode length 8 ne and { + /bwipp.upcEbadLength (UPC-E must be 7 or 8 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.upcEbadCharacter (UPC-E must contain only digits) //raiseerror exec + } if + } forall + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.upcEbadAddOnLength (Add-on for UPC-E must be 2 or 5 digits) //raiseerror exec + } if + + % Ensure 0 or 1 number systems + barcode 0 get dup 48 ne exch 49 ne and { + /bwipp.upcEbadNumberSystem (UPC-E must have number system 0 or 1) //raiseerror exec + } if + + % Create an array containing the character mappings + /encs + [ (3211) (2221) (2122) (1411) (1132) + (1231) (1114) (1312) (1213) (3112) + (111) (111111) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + /mirrormaps + [ (000111) (001011) (001101) (001110) (010011) + (011001) (011100) (010101) (010110) (011010) + ] def + + % Derive the equivalent UPC-A for its checksum + 1 { % Common exit + /upcacode 11 string def + barcode 6 get 48 sub 2 le { + upcacode 0 barcode 0 3 getinterval putinterval + upcacode 3 barcode 6 1 getinterval putinterval + upcacode 4 (0000) putinterval + upcacode 8 barcode 3 3 getinterval putinterval + exit + } if + barcode 6 get 48 sub 3 eq { + upcacode 0 barcode 0 4 getinterval putinterval + upcacode 4 (00000) putinterval + upcacode 9 barcode 4 2 getinterval putinterval + exit + } if + barcode 6 get 48 sub 4 eq { + upcacode 0 barcode 0 5 getinterval putinterval + upcacode 5 (00000) putinterval + upcacode 10 barcode 5 1 getinterval putinterval + exit + } if + barcode 6 get 48 sub 5 ge { + upcacode 0 barcode 0 6 getinterval putinterval + upcacode 6 (0000) putinterval + upcacode 10 barcode 6 1 getinterval putinterval + exit + } if + } repeat + /checksum 0 def + 0 1 10 { + /i exch def + /barchar upcacode i get 48 sub def + i 2 mod 0 ne { + /checksum checksum barchar add def + } { + /checksum checksum barchar 3 mul add def + } ifelse + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 8 eq { + barcode 7 get checksum 48 add ne { + /bwipp.upcEbadCheckDigit (Incorrect UPC check digit provided) //raiseerror exec + } if + } if + /pad 8 string def + pad 0 barcode putinterval % Add barcode to the start of the pad + pad 7 checksum 48 add put % Put ascii for checksum at end of pad + /barcode pad def + /txt 8 array def + txt 0 [barcode 0 1 getinterval textxoffset textyoffset textfont textsize 2 sub] put + + % Determine the mirror map based on checksum + /mirrormap mirrormaps checksum get def + + % Invert the mirrormap if we are using a non-zero number system + barcode 0 get 48 eq { + /invt mirrormap length string def + 0 1 mirrormap length 1 sub { + /i exch def + mirrormap i get 48 eq { + invt i 49 put + } { + invt i 48 put + } ifelse + } for + /mirrormap invt def + } if + + /sbs 33 string def + + % Put the start character + sbs 0 encs 10 get putinterval + + 1 1 6 { + /i exch def + % Lookup the encoding for the each barcode character + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + mirrormap i 1 sub get 49 eq { % Reverse enc if 1 in this position in mirrormap + /enclen enc length def + /revenc enclen string def + 0 1 enclen 1 sub { + /j exch def + /char enc j get def + revenc enclen j sub 1 sub char put + } for + /enc revenc def + } if + sbs i 1 sub 4 mul 3 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 1 sub 7 mul 11 add textxoffset add textyoffset textfont textsize] put + } for + + txt 7 [barcode 7 1 getinterval 6 7 mul 18 add textxoffset add textyoffset textfont textsize 2 sub] put + + % Put the end character + sbs 27 encs 11 get putinterval + + /sbs [sbs {48 sub} forall] def + includetext { + /bhs [height height 12{height .075 sub}repeat height height height] def + /bbs [0 0 12{.075}repeat 0 0 0] def + } { + /bhs [17{height}repeat] def + /bbs [17{0}repeat] def + /txt [] def + } ifelse + /guardrightypos 0 def + + % Append the addon + addon () ne { + /addopts << + /dontdraw true + /includetext true + /height height 0.15 sub + /textxoffset addontextxoffset (unset) ne {addontextxoffset} {51 addongap add} ifelse + addontextyoffset (unset) ne {/textyoffset addontextyoffset} if + /textsize addontextsize (unset) ne {addontextsize} {textsize} ifelse + /textfont addontextfont (unset) ne {addontextfont} {textfont} ifelse + >> def + addon length 2 eq {addon addopts //ean2 exec} if + addon length 5 eq {addon addopts //ean5 exec} if + /addcode exch def + /sbs [sbs aload pop addongap addcode (sbs) get aload pop] def + /bhs [bhs aload pop addcode (bhs) get {.075 sub} forall] def + /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def + /txt [txt aload pop addcode (txt) get aload pop] def + /guardrightypos height 72 mul 6 sub def + } if + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs bhs + /bbs bbs + /txt txt + /opt options + /guardrightpos 10 + /guardrightypos guardrightypos + /borderbottom 5 + >> + + dontdraw not //renlinear if + + end + +} bind def +/upce dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER upce-- @@ -614,55 +1747,263 @@ cna % --BEGIN ENCODER isbn-- % --REQUIRES preamble raiseerror renlinear ean5 ean2 ean13-- % --DESC: ISBN -% --EXAM: 978-1-56592-479-6 54495 +% --EXAM: 978-1-56581-231-4 52250 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp isbn 0.0 0 0 0 -%%BeginData: 44 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\AmoLsAWe i&Bl da$ FC f] =Ao DR/ OiN V@05 -5K:DKKH7FE;/BAV ^YU1 G DP! 5%OP! 5$bI =%,/F E2M8 Ou% NL5B lda$F Cf] =F(or3OtVt SBlda$FCf]= -G].2+F(KHR"a+^(ATX)PHS9)S@W$:!G]\1KAnH*qFDI[?gEes[WD0ou<@W!<++DGn+DI[?gEel -E4!Kq\FL^B5VHS8lBARfLsF_rie+Cf(r@r$..D)!`#$>u$+Blda$@q]:kP&-9^Ou%NL<,RL#P% -K&YL]W`SL]ET$HS8lBARfLsF_rih+DGn+DI[?gEZek*ARfLsF_rihOo^_%I=!VWBOt[hF*2=S1 -E^CQ@W#[h@<./+P&+WAARfLsF_rihOo^_%I?ITYP#O)P+Duu9Oo^_%I?IP_Bcq,G!KmJH1MItG -F(0$/G]]*XP!+/T5^eepI?J/ZL^B5-DMSX_4d'i404S[,@r$..D28R0BOt[hF*2=S0Sg+"C6GQ -P$^,7f1Gi"AU0TlI"G^Y`T055K:DKL,F+E1b"Ou"b#@<,jr -A7^Q*P,4H!@<-"%+C\c"@rGmh+E)4@Bl@m10/$mFDD>#B4uC -C89IX$@W$:4F5>p*F9G^Y`TI?IQ -% uk.co.terryburton.bwipp/isbn 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp isbn 0.0 2015050900 97266 100181 +%%BeginData: 252 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean13 dup /uk.co.terryburton.bwipp findresource put +begin +/isbn { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given the isbn text with dashes + + /dontdraw false def + /includetext false def % Enable/disable ISBN text + /isbntextfont /Courier def + /isbntextsize 9 def + /isbntextxoffset (unset) def + /isbntextyoffset (unset) def + /height 1 def + /addongap 12 def + /legacy false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /isbntextfont isbntextfont cvlit def + /isbntextsize isbntextsize cvr def + isbntextxoffset (unset) ne {/isbntextxoffset isbntextxoffset cvr def} if + isbntextyoffset (unset) ne {/isbntextyoffset isbntextyoffset cvr def} if + /height height cvr def + /addongap addongap cvr def + + % Split off the addon + barcode ( ) search { + /barcode exch def + pop + /addon exch def + } { + pop + /addon () def + } ifelse + + % Validate the input + barcode length 15 ne barcode length 17 ne and + barcode length 11 ne barcode length 13 ne and and { + /bwipp.isbnBadLength (ISBN-13 must be 15 or 17 characters including dashes. ISBN-10 must be 11 or 13 characters including dashes) //raiseerror exec + } if + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.isbnBadAddOnLength (Add-on for ISBN must be 2 or 5 digits) //raiseerror exec + } if + barcode length 15 ge { % ISBN-13 + barcode 0 4 getinterval dup (978-) ne exch (979-) ne and { + /bwipp.isbn13badPrefix (ISBN-13 prefix must be 978- or 979-) //raiseerror exec + } if + /wasdash false def /numdash 0 def /numdigit 0 def + barcode 5 9 getinterval { + dup + 45 eq { + wasdash { + /bwipp.isbn13adjacentDashes (ISBN-13 does not permit adjacent dashes) //raiseerror exec + } if + /wasdash true def + /numdash numdash 1 add def + } if + dup 48 ge exch 57 le and { + /wasdash false def + /numdigit numdigit 1 add def + } if + } forall + numdash 2 ne numdigit 7 ne or { + /bwipp.isbn13numDashesDigits (Incorrect number of dashes and digits for ISBN-13) //raiseerror exec + } if + barcode 14 get dup 48 lt exch 57 gt or { + /bwipp.isbn13character15 (ISBN-13 character 15 must be a digit) //raiseerror exec + } if + barcode length 17 eq { + barcode 15 1 getinterval (-) ne { + /bwipp.isbn13character16 (ISBN-13 penultimate character must be a dash) //raiseerror exec + } if + barcode 16 get dup 48 lt exch 57 gt or { + /bwipp.isbn13character17 (ISBN-13 final character must be a digit) //raiseerror exec + } if + } if + } { % ISBN-10 + barcode 0 get dup 48 lt exch 57 gt or { + /bwipp.isbn10FirstDigit (ISBN-10 first character must be a digit) //raiseerror exec + } if + /wasdash false def /numdash 0 def /numdigit 0 def + barcode 1 9 getinterval { + dup + 45 eq { + wasdash { + /bwipp.isbn10adjacentDashes (ISBN-10 does not permit adjacent dashes) //raiseerror exec + } if + /wasdash true def + /numdash numdash 1 add def + } if + dup 48 ge exch 57 le and { + /wasdash false def + /numdigit numdigit 1 add def + } if + } forall + numdash 2 ne numdigit 7 ne or { + /bwipp.isbn10numDashesDigits (Incorrect number of dashes and digits for ISBN-10) //raiseerror exec + } if + barcode 10 get dup 48 lt exch 57 gt or { + /bwipp.isbn10character11 (ISBN-10 character 11 must be a digit) //raiseerror exec + } if + barcode length 13 eq { + barcode 11 1 getinterval (-) ne { + /bwipp.isbn10character12 (ISBN-10 penultimate character must be a dash) //raiseerror exec + } if + barcode 12 get dup dup 48 lt exch 57 gt or exch 88 ne and { + /bwipp.isbn10character13 (ISBN-10 final character must be a digit or X) //raiseerror exec + } if + } if + } ifelse + + /isbntxt barcode def + + % Read the digits from isbntxt and validate checksum for ISBN-10 + isbntxt length 13 le { + /isbn 10 string def + /checksum 0 def + /i 0 def /n 0 def + { % loop + /isbnchar isbntxt i get 48 sub def + isbnchar -3 ne { % Ignore dashes + isbn n isbnchar 48 add put + n 9 lt { + /checksum checksum 10 n sub isbnchar mul add def + } if + /n n 1 add def + } if + /i i 1 add def + i isbntxt length eq {exit} if + } loop + /checksum 11 checksum 11 mod sub 11 mod dup 10 eq {pop 40} if 48 add def + /isbn isbn 0 9 getinterval def + isbntxt length 13 eq { + isbntxt 12 get checksum ne { + /bwipp.isbn10badCheckDigit (Incorrect ISBN-10 check digit provided) //raiseerror exec + } if + } if + } if + + legacy not isbntxt length 15 ge or { + + % Convert ISBN-10 to ISBN-13 + isbntxt length 13 le { + /pad 15 string def + pad 0 (978-) putinterval + pad 4 isbntxt 0 11 getinterval putinterval + /isbntxt pad def + } if + + % Read the digits from isbntxt and validate checksum for ISBN-13 + /isbn 13 string def + /checksum 0 def + /i 0 def /n 0 def + { % loop + /isbnchar isbntxt i get 48 sub def + isbnchar -3 ne { % Ignore dashes + isbn n isbnchar 48 add put + n 12 lt { + /checksum isbnchar n 2 mod 0 ne {3 mul} if checksum add def + } if + /n n 1 add def + } if + /i i 1 add def + i isbntxt length eq {exit} if + } loop + /checksum 10 checksum 10 mod sub 10 mod 48 add def + /isbn isbn 0 12 getinterval def + isbntxt length 17 eq { + isbntxt 16 get checksum ne { + /bwipp.isbn13badCheckDigit (Incorrect ISBN-13 check digit provided) //raiseerror exec + } if + } if + + } if + + % Add the ISBN header to the isbntxt + /pad isbn length 12 eq {22} {18} ifelse string def + pad 0 (ISBN ) putinterval + pad 5 isbntxt putinterval + pad pad length 2 sub 45 put + pad pad length 1 sub checksum put + /isbntxt pad def + + % Convert ISBN digits to EAN-13 + /barcode 12 string def + isbn length 9 eq { + barcode 0 (978) putinterval + barcode 3 isbn putinterval + } { + barcode 0 isbn putinterval + } ifelse + + % Append the addon + addon () ne { + 12 addon length add 1 add string + dup 0 barcode putinterval + dup 12 ( ) putinterval + dup 13 addon putinterval + /barcode exch def + } if + + % Get the result of encoding with ean13 + options (dontdraw) true put + options (addongap) addongap put + /args barcode options //ean13 exec def + + % Add the ISBN text + includetext { + isbntextxoffset (unset) eq { + /isbntextxoffset isbn length 9 eq {-1} {-12} ifelse def + } if + isbntextyoffset (unset) eq { + /isbntextyoffset height 72 mul 3 add def + } if + args (txt) known { + /txt args (txt) get def + /newtxt txt length 1 add array def + newtxt 0 txt putinterval + newtxt newtxt length 1 sub [isbntxt isbntextxoffset isbntextyoffset isbntextfont isbntextsize] put + args (txt) newtxt put + } { + args (txt) [ [isbntxt isbntextxoffset isbntextyoffset isbntextfont isbntextsize] ] put + } ifelse + } if + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/isbn dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER isbn-- @@ -670,53 +2011,242 @@ F5>p*F9G^Y`TI?IQ fAL_Q" 0O ps'_E- ,f4 -DKCt)Ou"b*F)>f: G]]*4 Ou" b%D f0 Z- Eaa /7A moLsAW ei &Bl7Es F_# -'*AU&;>AmoLsAWe i&Bl e-/ FC f] =Ao DR/ OiN V@05 -5KEDKKH7FE;/BAV ^YU1 G f:AU &DP! 5%OP! 5$bI =%,/F E2M8 Ou% NL f:AU&<< BmO>5B le-/F Cf] =F(or3OtVt SBle-/FCf]= -G].2+F(KHR"a+^(ATX)PHS9)SD/OH,G]\1KAnH*qF4uBle-/FEhn`! -/LZ=9TB-JP!*N#D/OH?FHU*h%?b._"FDef:G]]*X -L]ikAP,4f -:G]Y'I@:YNWI?IP_Ble-/L^fNDOu"b$BOt[hF*2>U!0T,kBnubP1Gf)BOPq;rK;#EBle-/+Dr<9F)>f)BOPq;0TlI"G]&f)BOPp(@q]F`CNFW8Oo^_%I=!VWBOt[hF*2=BBle-/@q]:kL -]`fV@q]F`CNFW8Oo^_%I?ITYP#O)P+Duu9Oo^_%I?IP_Bcq,G!KmJH1MItGF)>f:G]]*XP!+/T -5^eepI?J.p@q]F`CNFW8L^IX*ARfLsF_upAP%p/ZL^K;[Ou$ocB45:q+DbV%@:OS)G]\rGP&6? -bHS9)SD/OH?FHA;D"aV33W_P#ZI0A;C5G"\DWe:*> -^FE+*:5"_i$pDKL,FP'M"TA0>i"Af:G]Y'I@:YNW04J@1@rGmh+DGn6DMS:K%$F;I1LXg)Df1R8P&5Q%$t3[WDf1_IOo^@>O -o^`BOuS6t@UX:eDe*FBH'1.C%#t?2P'N3ML^dd'A8c@KGqWW8Eas#uAWf6?1OYEcDfBf4Df0WV -#\7jkFC]E#GB@kJAWh:VE-,f4DKCgD@:WneDJ*Bs@:WneDJ*BsP'AWgEbBG9@UX:eDe*E%DfBf -4Df0VL04eR00f+tWOu$fi@r-9uATVL.FF,-EF)>f:AU&f:AU&f:G]Y'BF)>f:AU&f:AU&f:AU&Ble-/FCf]=F(or3+C1.T@<-"%NWXBJFDbZ6FEhnjG^XpIEbBHR"*Ad0>9I,mBle-/FEhmMBle --/FCf]=G].2+F(KG9Ble-/FCf]=H#I;,F(KG9Ble-/FCf]=AoDR/+DGn6DKKH7FE;/BAKY8$?' -9G\P#Zpn<+0f[F,g?@E--#;FD5Z2F-:cVEbBG9A8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#O -u"b*F)>fX30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm" -@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/ismn 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ismn 0.0 2015050900 94206 93526 +%%BeginData: 231 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean13 dup /uk.co.terryburton.bwipp findresource put +begin +/ismn { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given the ismn text with dashes + + /dontdraw false def + /includetext false def % Enable/disable ISMN text + /ismntextfont /Courier def + /ismntextsize 9 def + /ismntextxoffset (unset) def + /ismntextyoffset (unset) def + /height 1 def + /addongap 12 def + /legacy false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /ismntextfont ismntextfont cvlit def + /ismntextsize ismntextsize cvr def + ismntextxoffset (unset) ne {/ismntextxoffset ismntextxoffset cvr def} if + ismntextyoffset (unset) ne {/ismntextyoffset ismntextyoffset cvr def} if + /height height cvr def + /addongap addongap cvr def + + % Split off the addon + barcode ( ) search { + /barcode exch def + pop + /addon exch def + } { + pop + /addon () def + } ifelse + + % Validate the input + barcode length 15 ne barcode length 17 ne and + barcode length 11 ne barcode length 13 ne and and { + /bwipp.ismnBadLength (ISMN-13 must be 15 or 17 characters including dashes. ISMN-10 must be 11 or 13 characters including dashes) //raiseerror exec + } if + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.ismnBadAddOnLength (Add-on for ISMN must be 2 or 5 digits) //raiseerror exec + } if + barcode length 15 ge { % ISMN-13 + barcode 0 4 getinterval (979-) ne { + /bwipp.ismn13badPrefix (ISMN-13 prefix must be 979-) //raiseerror exec + } if + /wasdash false def /numdash 0 def /numdigit 0 def + barcode 5 9 getinterval { + dup + 45 eq { + wasdash { + /bwipp.ismn13adjacentDashes (ISMN-13 does not permit adjacent dashes) //raiseerror exec + } if + /wasdash true def + /numdash numdash 1 add def + } if + dup 48 ge exch 57 le and { + /wasdash false def + /numdigit numdigit 1 add def + } if + } forall + numdash 2 ne numdigit 7 ne or { + /bwipp.ismn13numDashesDigits (Incorrect number of dashes and digits for ISMN-13) //raiseerror exec + } if + barcode 14 get dup 48 lt exch 57 gt or { + /bwipp.ismn13character15 (ISMN-13 character 15 must be a digit) //raiseerror exec + } if + barcode length 17 eq { + barcode 15 1 getinterval (-) ne { + /bwipp.ismn13character16 (ISMN-13 penultimate character must be a dash) //raiseerror exec + } if + barcode 16 get dup 48 lt exch 57 gt or { + /bwipp.ismn13character17 (ISMN-13 final character must be a digit) //raiseerror exec + } if + } if + } { % ISMN-10 + barcode 0 2 getinterval (M-) ne { + /bwipp.ismn10badPrefix (ISMN-10 prefix must be M-) //raiseerror exec + } if + barcode 2 get dup 48 lt exch 57 gt or { + /bwipp.ismn10character3 (ISMN-10 character 3 must be a digit) //raiseerror exec + } if + /wasdash false def /numdash 0 def /numdigit 0 def + barcode 3 7 getinterval { + dup + 45 eq { + wasdash { + /bwipp.ismn10adjacentDashes (ISMN-10 does not permit adjacent dashes) //raiseerror exec + } if + /wasdash true def + /numdash numdash 1 add def + } if + dup 48 ge exch 57 le and { + /wasdash false def + /numdigit numdigit 1 add def + } if + } forall + numdash 1 ne numdigit 6 ne or { + /bwipp.ismn10numDashesDigits (Incorrect number of dashes and digits for ISMN-10) //raiseerror exec + } if + barcode 10 get dup 48 lt exch 57 gt or { + /bwipp.ismn10character11 (ISMN-10 character 11 must be a digit) //raiseerror exec + } if + barcode length 13 eq { + barcode 11 1 getinterval (-) ne { + /bwipp.ismn10character12 (ISMN-10 penultimate character must be a dash) //raiseerror exec + } if + barcode 12 get dup dup 48 lt exch 57 gt or exch 88 ne and { + /bwipp.ismn10character13 (ISMN-10 final character must be a digit or X) //raiseerror exec + } if + } if + } ifelse + + /ismntxt barcode def + + % Convert old ISMN to ISMN-13 + /legacytxt () def + ismntxt length 13 le { + /legacytxt ismntxt def + /pad ismntxt length 4 add string def + pad 0 (979-0-) putinterval + pad 6 ismntxt 2 ismntxt length 2 sub getinterval putinterval + /ismntxt pad def + } if + + % Read the digits from ismntxt and calculate checksums + /ismn 13 string def + /checksum 0 def + /i 0 def /n 0 def + { % loop + /ismnchar ismntxt i get 48 sub def + ismnchar -3 ne { % Ignore dashes + ismn n ismnchar 48 add put + n 12 lt { + n 2 mod 0 eq { + /checksum ismnchar checksum add def + } { + /checksum ismnchar 3 mul checksum add def + } ifelse + } if + /n n 1 add def + } if + /i i 1 add def + i ismntxt length eq {exit} if + } loop + /checksum 10 checksum 10 mod sub 10 mod 48 add def + + % Validate the checksum + barcode length 13 eq barcode length 17 eq or { + barcode dup length 1 sub get checksum ne { + /bwipp.ismnBadCheckDigit (Incorrect ISMN check digit provided) //raiseerror exec + } if + } if + + % Add the ISMN header and checksum to the ismntxt + legacy legacytxt () ne and { + /ismntxt legacytxt def + /pad 18 string def + } { + /pad 22 string def + } ifelse + pad 0 (ISMN ) putinterval + pad 5 ismntxt putinterval + pad pad length 2 sub 45 put + pad pad length 1 sub checksum put + /ismntxt pad def + + % Convert ISMN digits to EAN-13 + /barcode ismn 0 12 getinterval def + + % Append the addon + addon () ne { + 12 addon length add 1 add string + dup 0 barcode putinterval + dup 12 ( ) putinterval + dup 13 addon putinterval + /barcode exch def + } if + + % Get the result of encoding with ean13 + options (dontdraw) true put + options (addongap) addongap put + /args barcode options //ean13 exec def + + % Add the ISMN text + includetext { + ismntextxoffset (unset) eq { + /ismntextxoffset ismntxt length 18 eq {-1} {-12} ifelse def + } if + ismntextyoffset (unset) eq { + /ismntextyoffset height 72 mul 3 add def + } if + args (txt) known { + /txt args (txt) get def + /newtxt txt length 1 add array def + newtxt 0 txt putinterval + newtxt newtxt length 1 sub [ismntxt ismntextxoffset ismntextyoffset ismntextfont ismntextsize] put + args (txt) newtxt put + } { + args (txt) [ [ismntxt ismntextxoffset ismntextyoffset ismntextfont ismntextsize] ] put + } ifelse + } if + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/ismn dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ismn-- @@ -724,50 +2254,188 @@ u"b*F)>fX30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm" % --BEGIN ENCODER issn-- % --REQUIRES preamble raiseerror renlinear ean2 ean5 ean13-- % --DESC: ISSN -% --EXAM: 0317-8471 00 05 +% --EXAM: 0311-175X 00 17 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp issn 0.0 0 0 0 -%%BeginData: 39 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\AmoLsAWe i&Bl e?5 FC f] =Ao DR/ OiN V@05 -5KKDKKH7FE;/BAV ^YU1 G X4aVtc Ou8C3DfBf4D -f0WCP,i2'Cia0N4 aW>WI? IQm 30Ia 6V33 Qn! BlU*FE2M8P !+/T/Wr;\Fc -nqO1OXV5/Tc#UAW eitP# ZpnA We*t3 A5;i FD5 Z2F-8_M1OY EcDfBf4Df0W -COu%NL8M=e!F)H) 2G][P 9DKI" 8F)u5 @AU &>#B4u -CM09S+E@:WneDJ*Bs+CSekDf02rE0;l;1MLoODKL,FNWC8cNI*Ou$epBle?5FEh -nj@Zim$P!FGY<.0p@04S[,@r$..D28R0BOt[hF*2>U$^,7fWJCqFC6CA+E+*:5%[*ZO1N6c5L] -EG=8Q/P_+Hh"h@:Y/tBle?5FEhnjH#R2&L^dj-ARfLsF_upgOo^_*LcU\^H]iN-=FH?3P'AWoF -)u5@G]Y'I@:YNW04J@1@rGmh+DGn5ZH\`)=A7TUrP%'RTL]NY ->P,4=$L]CmmEas#uAWh>%3/A!'!?dPNOuS7,@:WneDN]8u@UX:eDe*FB5*@^MP#Q@=FD5Z2F,g -N:Df0Z-Eaa06EckrVG].PCBl@m1NX0'(A8c?u@;oXcA8c?u@;qBS04Am6F!+q#Eas#uAKYo1FD -5Z2F"]1X@;[eUP!>*cBl7EsF_#'*AU&Ble?5FCf]=F(or3+C1.T@<-"%NW -XBJFDbZ6FEhnjG^XpIEbBHR"*Ad0>9I,mBle?5FEhmMBle?5FCf]=G].2+F(KG9Ble?5FCf]=H -#I;,F(KG9Ble?5FCf]=AoDR/+DGnD_?-CEcQG -7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?I -P~> -% uk.co.terryburton.bwipp/issn 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp issn 0.0 2015050900 85135 81376 +%%BeginData: 177 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean13 dup /uk.co.terryburton.bwipp findresource put +begin +/issn { + + 20 dict begin + + /options exch def % We are given an options string + /issntxt exch def % We are given the issn text with dashes + + /dontdraw false def + /includetext false def % Enable/disable ISSN text + /issntextfont /Courier def + /issntextsize 9 def + /issntextxoffset (unset) def + /issntextyoffset (unset) def + /height 1 def + /addongap 12 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /issntextfont issntextfont cvlit def + /issntextsize issntextsize cvr def + issntextxoffset (unset) ne {/issntextxoffset issntextxoffset cvr def} if + issntextyoffset (unset) ne {/issntextyoffset issntextyoffset cvr def} if + /height height cvr def + /addongap addongap cvr def + + % Split off the ISSN + issntxt ( ) search { + /issntxt exch def + pop + /seqvar exch def + } { + pop + /seqvar () def + } ifelse + + % Split off the sequence variant and addon + seqvar ( ) search { + /seqvar exch def + pop + /addon exch def + } { + pop + /addon seqvar def + /seqvar (00) def + } ifelse + + % Validate the input + issntxt length 8 ne issntxt length 9 ne and { + /bwipp.issnBadLength (ISSN must be 8 or 9 characters including dash) //raiseerror exec + } if + issntxt 0 4 getinterval { + dup 48 lt exch 57 gt or { + /bwipp.issnBadFormat (ISSN must have the format XXXX-XXXX) //raiseerror exec + } if + } forall + issntxt 4 1 getinterval (-) ne { + /bwipp.issnBadFormat (ISSN must have the format XXXX-XXXX) //raiseerror exec + } if + issntxt 5 3 getinterval { + dup 48 lt exch 57 gt or { + /bwipp.issnBadFormat (ISSN must have the format XXXX-XXXX) //raiseerror exec + } if + } forall + issntxt length 9 eq { + issntxt 8 get dup dup 48 lt exch 57 gt or exch 88 ne and { % Digits or X + /bwipp.issnBadFormat (ISSN must have the format XXXX-XXXX) //raiseerror exec + } if + } if + seqvar length 2 ne { + /bwipp.issnBadSequenceVariantLength (Sequence variant for ISSN must be 2 digits) //raiseerror exec + } if + seqvar { + dup 48 lt exch 57 gt or { + /bwipp.issnSequenceVariantBadCharacter (Sequence variant for ISSN must contain only digits) //raiseerror exec + } if + } forall + addon length 0 ne addon length 2 ne and addon length 5 ne and { + /bwipp.issnBadAddOnLength (Add-on for ISSN must be 2 or 5 digits) //raiseerror exec + } if + + % Read the digits from issntxt and calculate checksums + /issn 8 string def + /checksum 0 def + /i 0 def /n 0 def + { % loop + /issnchar issntxt i get 48 sub def + issnchar -3 ne { % Ignore dashes + issn n issnchar 48 add put + n 7 lt { + /checksum checksum issnchar 8 n sub mul add def + } if + /n n 1 add def + } if + /i i 1 add def + i issntxt length eq {exit} if + } loop + /checksum 11 checksum 11 mod sub 11 mod def + /checksum checksum 48 add dup 58 eq {pop 88} if def + issntxt length 9 eq { + issntxt 8 get checksum ne { + /bwipp.issnBadCheckDigit (Incorrect ISSN check digit provided) //raiseerror exec + } if + } if + + % Add the ISSN header and checksum to the issntxt + /pad 14 string def + pad 0 (ISSN ) putinterval + pad 5 issntxt putinterval % Add issntxt to the pad + pad 13 checksum put + /issntxt pad def + + % Convert ISSN digits to EAN-13 + /barcode issn 0 7 getinterval def + + % Append the sequence variant + /barcode 12 string def + barcode 0 (977) putinterval + barcode 3 issn putinterval + barcode 10 seqvar putinterval + + % Append the addon + addon () ne { + 12 addon length add 1 add string + dup 0 barcode putinterval + dup 12 ( ) putinterval + dup 13 addon putinterval + /barcode exch def + } if + + % Get the result of encoding with ean13 + options (dontdraw) true put + options (addongap) addongap put + /args barcode options //ean13 exec def + + % Add the ISSN text + includetext { + issntextxoffset (unset) eq {/issntextxoffset 10 def} if + issntextyoffset (unset) eq { + /issntextyoffset height 72 mul 3 add def + } if + args (txt) known { + /txt args (txt) get def + /newtxt txt length 1 add array def + newtxt 0 txt putinterval + newtxt newtxt length 1 sub [issntxt issntextxoffset issntextyoffset issntextfont issntextsize] put + args (txt) newtxt put + } { + args (txt) [ [issntxt issntextxoffset issntextyoffset issntextfont issntextsize] ] put + } ifelse + } if + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/issn dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER issn-- @@ -778,121 +2446,429 @@ P~> % --EXAM: Count01234567^FNC2! % --EXOP: includetext parsefnc % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code128 0.0 0 0 0 -%%BeginData: 113 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\Ou"b5AU&K FD5Z2F*j(N AmoLsAWf3'P -!FGY<0B5(@ZmRN0 oc8tP) XR( F_-_ !H]f tD5 *C&O5*@^MH ]ft&EckrV1O -YEdI?J0)*g/N:Df Bf4Df 0WZ5 *@^MP #Q@= FD5 Z2F*j'+I?I /TFCf]=AoDR -/+EV1>FCoH/FHS5 =1G4@UX:eDe*FB@ZmRN1GOo[4NP!5$bP')pIL]E55P"_#iD0'?Q5&,lSP,XU.P'E --LP%'4LP,X6>P!5%&I=%,:D0'?Q5&-6EP'N4"C6ATNC6CcD1G<3GEas#uAKYi2B8?P&P"_#pP! -FGY9I.++G_/#!\c<6+Bsj,+cZRHNWLmh>p*@ -3!@!O),)u^Y10l#,NWCAb!@*U+0JcuW>E/_0NWCDc!\cH:+Bsj,-&r!PNWLml>p*@3!@Eg--B8 --]2I.G0NWCMf!@Nm/0K38[>DO\`.#n?_3*dY2Lae-/NWLmp>p*@3!@j*1.ZOQb0O5f*NWCYj!@ -s030elrV>E/_8NWC\k!\lH9+Bsj,/WKi`NWLpk>p*@3!A9B5/rfuf1gM5.NWCen!ABH70f<5Z> -E/_p*@3!A]Z916)Dj3*dY2NWCqr!Af`;0f`M^>E/_@NWCts -!\uH8+Bsj,23%\pNWLsj>p*@3!B,r=2N@ho10l#,NWD)!!B6#?1,E2Y>E/_DNWD,"!\uT<+Bsj -,3K=,#NWLsn>p*@3!BQ5A3fX7s2I.G0NWD5%!BZ;C1,iJ]>E/_HNWD8&!\u`@+Bsj,4cTP+NWL -sr>p*@3!BuME5)o\#0O5f*NWDA)!C)SG1GN/X>E/_LNWDD*!])T;+Bsj,6&kt3NWM!m>p*@3!C -DeI6B2+'1gM5.NWDM-!CMkK1GrG\>E/_PNWDP.!])`?+Bsj,7?.C;NWM!q>p*@3!Ci(M7ZIO+3 -*dY2NWDY1!Cr.O1HA_`>E/_TNWD\2!]2T:+Bsj,8WEgCNWM$l>p*@3!D8@Q8r`s010l#,NWDe5 -!DAFS1c&D[>E/_XNWDh6!]2`>+Bsj,9o]6KNWM$p>p*@3!D\XU:6#B42I.G0NWDq9!De^W1cJ\ -_>E/_\NWDt:!]2lB+Bsj,;2tZSNWM$t>p*@3!E+pY;N:f90O5f*NWE(=!E5![2)/AZ>E/_`NWE -+>!];`=+Bsj,p*@3!EP3]E/_dNWE7B!];lA+B -sj,=cNMcNWM's>p*@3!EtKa>)iYA3*dY2NWE@E!F(Qc2*"qb>DQO?>`JkD0O5f*NWEFG!F:]e2 -DJJ[>E/_jNWEIH!]Df>+Bsj,?]G.oNWM*p>p*@-!0.(fNWM*q>p*@-!KI1hNWM*r>p*@-!fd:j -NWM*s>p*@-"-*ClNWM*t>p*@-"HELnNWM*u>p*@-"c`UpNWM+!>p*@-#*&^rNWM-n>p*@-#EAg -tNWM-o>p*@-#`\q!NWM-p>p*@-$'#%#NWM-q>p*@-$B>.%NWM-r>p*@-$]Y7'NWM-s>p*@-%#t -@)NWM-t>p*@-%?:I+NWM-u>p*@-%ZUR-NWM.!>p*@-%up[/NWM.">p*@-&<6d1NWM0o>p*@-&W -Qm3NWM0p>p*@-&rm!5NWM0q>p*@-'93*7NWM0r>p*@-'TN39NWM0s>p*@-'oi<;NWM0t>p*@-( -6/E=NWM0u>p*@-(QJN?NWM1!>p*@-(leWANWM1">p*@-)3+`CNWM1#>p*@-)NFiENWM3p>p*@- -)iarGNWM3q>p*@-*0(&INWM3r>p*@-*KC/KNWM3s>p*@-*f^8MNWM3t>p*@-+,GE,!]`,D+Bot -#DDNDIDDR:S3At.c>9INq1*C1H16)Dr2dIP1+EM.:+EM.:NWM4#>p*>oF*D+:F*D,S!]`8H+Bo -t0G@D\,DDWJWG@D\#+Bot#DDWJWG@;V8G@;V"+Bot#DD<8GDD<8GDD<8>+Bot0FC?;5FC?;5FC -?:t+Bot0FCHA6FCHA6FCH@u+Bot0FCQG7FCQG7FCQG!+Bot0FDr@DFDr@DFDr@.+C1-d04S[(E -ctl-F!+\CD3?c4D3?c4D3?b^Ou%moL]M"!@<-3nE-%1OL]N[X4aVtbP"U4d<+BTMEctl --F!,4\99MJQP'DD<8:?Xl06:]H@3B&n@<-O"CibC4P"Uro06:]H@N]/o@<-O"CibC5P"Uro06: -]H@j#8p@<-O"CibC6P"UroF(KH%+Dbh%+EM+9@3BW8@ZjBIG]RG<@3BB%@j#i(FC?;5G@Qe/P' -D%ZFCHA/CLJ?,ATVB(F*D,W99OO@ATVB(ChmN'F(KH&+EMa8P"Us_F(KH'+Dbh%+EM+9@j#i:@ -?O9HG]RG<@j#T'@j#i(FCQG7G@H_.P'D"UGC(uSDI[TqBl7RD"*.goOu%NL<+TrWDe*R"B9!(7 -@<[ktHS8lQF!+q#Ebo<)OpR:-0564BOu"b+L]ESoHYFU3@<-0qDN[/0P!FGY<%ha*+C\c"@rGm -h+DHW4Oo^@@P"_#iOu$TlF!,3?@s=)\052PCL]ikAOu"b++DQ]5Oo^_%I?J.p@s;u:@s`"@c-R11 -kDZNW_gH6Si=l1QDT-:.$jMDD[@V9MS5HChmI>"ADQ`6YpOJ+?huP1GL]il7P"UroFCf]=+DQo;+Hh -"'Bcq,G"HieK1OXU'Bcq,G!KmJH1OYEdI?IQHF(ZV1+Cf(nEftZ#Bcq,G!KmJH1Gd4aV7+!g7;S!0TKl0687WL]NY>Ou%N5P!FGYOu"b4+EN>>Oo^_ - %05r%QL]NY>Ou%NLASrW3I?G)'1G<S05b?GFCK-+FC? -:r+Dl14P%&co!.C#_L*mL;Ou$rrB9H_[!KsFDIn'7@; -^"*@N]B@!0VSTHZ!D>FCB'*FCHA,+Dtb8FCB'*FCHA,L]NY>P"UT3Oo^_jI?ITIF(ZV0P"T8%D -ffE7+Dtb8FCK-+FC?;+L]ET_I=#jCG][D4DffD1Bcq;)G][D4DffD1BnueQ!Kp*3!KmJHG^Y`T -I?I,S@:Ee[DfTDuH]g@+AU&<*DJsW+P!5%%P!3bpG][D4DffEN5*AR%ApogPOu"b#@V'.iEb/[ -+OuR>jG][D4DffEN5*AR%5&OqVFCB'*FCLCsP"UsMI?G)'1G<6^F!+q#Eas#uAWgMY!g7AU"-N -\J$'I(tC5;kQ1Mq2GCh7L?!0U0*L]D=8D0'c.Ed`:js+p]'P#X/QF_u2_5*@]TDI[?gEc[C-Ou - %H%F(]<#DMS:U4aV6l@N]6"@pq$#F(KHR"ES-r@ZiO15^eepD0'?+AT!;*P!*]*D0(L7P!+s2 -HZO:=+D#G#@4u,3ATWq8F(KH'Ou&7dI?IQIF_u2U"HlB(F*(n7ASu!d04T'7FH-KFATVFF1Qk" -OP#R5;@:Ee[DfTDuHQ[BO@3B-!@pq$#F(KHR"ES-r@?NF05^eepF*(k6ASu!d04T'7FH-KFATV -CE1Qk"OP%?:\L]ESoHYFU>F(]<#DN[/0P!FGY<,!ImF_u2@@ra5?F_u2_5*@]TDI[?gEc[C-Ou - %GpF(KHR"ES-r@?Nc`F(KHR"ES-r@Zim;Ec-#:F,0s^8s0F(KHR"ES-r@ZilkF(ZV0P"T5$DffHO"F -Fi*D0'?+AT!;)P,XUVHYJ9:Oo]$$AS,k$ARTp.F(TM:ASu!e+Dl14+DI!3ASu!d052PCL]NY>O -u&7dI?IQXP#QLH@3B-!@q%*$F(KHR"ES-r@?NF05^eep@rl4'NWaE7FCC=qD0'>4Bp)+uDJsW* -Op$,G+Dl14Ch7L?!KsFFAp\6J!KmIl@V'.iEb/^,+EM.:+D#G#@3BE.B-:oO94`!N@P;FOu&7dI?IQ>F(KHR"ES-r@Zim$D -0'>4Bp),#DI[-/Bcq,G!KmJH1Qk"OP#Pq4ATWq8F(KH'P!+//F(ZV0P"TD)0p4\HAo9=GASu!f -052PCL]NY>Ou%N5D0'>4BnuhR9P&*O@kVO=BnuhR!Ko6eP#[Z1I?IQm5^ef,I?J.p@s;u:@s4F,0gZ99M)e!JgbkL]N[4F!,1[950Q*Oo^_%I?I,S@rld0+CfJ8D2;hfC6CA_GB4mA+CfJ8D3 -B-RGB4mAL]NY>F(KH%+EMXDP"Us_04f$2F!+\I"u7ng1,:VF"u7qh0etME"u7qh1,:SE"u.kf1 -,:YG"u.kf1GU_G"u.ng1,:VF"u.kg1,1SF"u.kg1GLYF"u.nh1,1PE"u7qg1,1SF"u7qg1GLYF -"u7th1,1PE"u.hf1,C\G"u.kg0f(SF"u.kg1,CYF"u.hg1,:VF"u.kh0etME"u.kh1,:SE"u7q -i1,1MD"u7qg0f(SF"u7qg1,CYF"u7nh1,1PE"u7qi0ekGD"u@th0f(PE"u@tg1,:VF"uA"h0et -ME"uA"h1,:SE"u@th1,1PE"uA"i0ekGD"uA"i1,1MD"u7ng0etPF"u7ng1GU\F"u7ti0etJD"u -.he1GUbH"u.ng0etPF"u.ng1GU\F"u.hf1GL\G"u.nh0ekJE"u.nh1GLVE"u7nf1GL\G"u7th0 -ekJE"u7th1GLVE"u.hf0f(VG"u.hf1G^bG"u.nh0f(PE"u.hg0etPF"u.hg1GU\F"u.ni0etJD -"u@ti0etJD"u7nf1G^bG"u7th0f(PE"u7nh0ekJE"u7nh1GLVE"u7nh0f(PE"u@tg0etPF"u@t -g1GU\F"uA%i0etJD"u@th0ekJE"u@th1GLVE"uA%j0ekDC"u@tj0ekDC"u7qg1bg_F"uJ+j0ek -DC"u.he1,:\H"u.he1bphH"u.kf0etSG"u.kf1bpeG"u.qh0etME"u.qh1,:SE"u.hf1,1VG"u -.hf1bgbG"u.kg0ekMF"u.kg1bg_F"u.qi0ekGD"u.qi1,1MD"u8"i1,1MD"u7qg0ekMF"uJ%j0 -ekDC"u8"i0ekGD"u.nj0ekDC"u.he1,LbH"u.kf0f1YG"u.kf1,L_G"u.hh1,1PE"u.ki0ekGD -"u.ki1,1MD"uJ%h1,1PE"uJ(i0ekGD"uJ(i1,1MD"u7ng0f1VF"u7ni0etJD"uJ%i0etJD"u.h -e0f1\H"u.he1GghH"u.ng0f1VF"u.hh0ekJE"u.hh1GLVE"uJ%h0ekJE"uJ%h1GLVE"u.hg0f1 -VF"u.hh0f(PE"u@tg0f1VF"uJ%h0f(PE"u7nf1bgbG"u7nf1,1VG"u7nf1,C\G#;S(k0ekCq]Z#F!+[0F(03R -@Yb&J!Jgf?;L<(gBkM+$I?K4g04JC3+Bot0@WR]AL]NY>L]W`;H\_ZMP(R$nFEhmM>9I,mFCf] -=+EV1>FEh_9AohO*+EV1>FEqe:AohO*+EV1>FCoH/FD_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB -9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/code128 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code128 0.0 2015050900 112448 118940 +%%BeginData: 421 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code128 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + /encoding (auto) def + /raw false def + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Special function characters + /sta -1 def /stb -2 def /stc -3 def + /swa -4 def /swb -5 def /swc -6 def + /fn1 -7 def /fn2 -8 def /fn3 -9 def + /fn4 -10 def /sft -11 def /stp -12 def + /lka -13 def /lkc -14 def % CC-A/B and CC-C linkage + + % Character maps for each state + /charmaps [ + % A B C A B C A B C + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 + [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 + [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 + [ (,) (,) (12) ] [ (-) (-) (13) ] [ (.) (.) (14) ] % 12-14 + [ (/) (/) (15) ] [ (0) (0) (16) ] [ (1) (1) (17) ] % 15-17 + [ (2) (2) (18) ] [ (3) (3) (19) ] [ (4) (4) (20) ] % 18-20 + [ (5) (5) (21) ] [ (6) (6) (22) ] [ (7) (7) (23) ] % 21-23 + [ (8) (8) (24) ] [ (9) (9) (25) ] [ (:) (:) (26) ] % 24-26 + [ (;) (;) (27) ] [ (<) (<) (28) ] [ (=) (=) (29) ] % 27-29 + [ (>) (>) (30) ] [ (?) (?) (31) ] [ (@) (@) (32) ] % 30-32 + [ (A) (A) (33) ] [ (B) (B) (34) ] [ (C) (C) (35) ] % 33-35 + [ (D) (D) (36) ] [ (E) (E) (37) ] [ (F) (F) (38) ] % 36-38 + [ (G) (G) (39) ] [ (H) (H) (40) ] [ (I) (I) (41) ] % 39-41 + [ (J) (J) (42) ] [ (K) (K) (43) ] [ (L) (L) (44) ] % 42-44 + [ (M) (M) (45) ] [ (N) (N) (46) ] [ (O) (O) (47) ] % 45-47 + [ (P) (P) (48) ] [ (Q) (Q) (49) ] [ (R) (R) (50) ] % 48-50 + [ (S) (S) (51) ] [ (T) (T) (52) ] [ (U) (U) (53) ] % 51-53 + [ (V) (V) (54) ] [ (W) (W) (55) ] [ (X) (X) (56) ] % 54-56 + [ (Y) (Y) (57) ] [ (Z) (Z) (58) ] [ ([) ([) (59) ] % 57-59 + [ 92 92 (60) ] [ (]) (]) (61) ] [ (^) (^) (62) ] % 60-62 + [ (_) (_) (63) ] [ 0 (`) (64) ] [ 1 (a) (65) ] % 63-65 + [ 2 (b) (66) ] [ 3 (c) (67) ] [ 4 (d) (68) ] % 66-68 + [ 5 (e) (69) ] [ 6 (f) (70) ] [ 7 (g) (71) ] % 69-71 + [ 8 (h) (72) ] [ 9 (i) (73) ] [ 10 (j) (74) ] % 72-74 + [ 11 (k) (75) ] [ 12 (l) (76) ] [ 13 (m) (77) ] % 75-77 + [ 14 (n) (78) ] [ 15 (o) (79) ] [ 16 (p) (80) ] % 78-80 + [ 17 (q) (81) ] [ 18 (r) (82) ] [ 19 (s) (83) ] % 81-83 + [ 20 (t) (84) ] [ 21 (u) (85) ] [ 22 (v) (86) ] % 84-86 + [ 23 (w) (87) ] [ 24 (x) (88) ] [ 25 (y) (89) ] % 87-89 + [ 26 (z) (90) ] [ 27 ({) (91) ] [ 28 (|) (92) ] % 90-92 + [ 29 (}) (93) ] [ 30 (~) (94) ] [ 31 127 (95) ] % 93-95 + [ fn3 fn3 (96) ] [ fn2 fn2 (97) ] [ sft sft (98) ] % 96-98 + [ swc swc (99) ] [ swb fn4 swb ] [ fn4 swa swa ] % 99-101 + [ fn1 fn1 fn1 ] [ sta sta sta ] [ stb stb stb ] % 102-104 + [ stc stc stc ] [ stp stp stp ] % 105-106 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 109 dict 109 dict 109 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 2 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + /seta charvals 0 get def + /setb charvals 1 get def + /setc charvals 2 get def + + % Include pseudo characters for GS1-128 Composite linkage identifiers + seta lka seta swb get put seta lkc seta swc get put + setb lka setb swc get put setb lkc setb swa get put + setc lka setc swa get put setc lkc setc swb get put + + raw {/encoding (raw) def} if + + encoding (raw) eq { + /cws barlen array def + /i 0 def /j 0 def + { % loop + i barlen eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + cws j cw put + /i i 4 add def + /j j 1 add def + } loop + /cws cws 0 j getinterval def + /text () def + } if + + encoding (auto) eq { + + /fncvals << + (FNC1) fn1 + (FNC2) fn2 + (FNC3) fn3 + (FNC4) fn4 + (LNKA) lka + (LNKC) lkc + >> def + + % Convert input into bytes accounting for FNC and LNK characters + /msg barlen array def + /text barlen string def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + text j char put + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + text j ( ) putinterval + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + /text text 0 j getinterval def + + % Determine digit runlength and characters from given position + /numsscr { + /n 0 def /s 0 def + /p exch def { + p msglen ge {exit} if + msg p get + dup setc exch known not {pop exit} if + fn1 eq { + % FNC1 in odd position of run like two digits + s 2 mod 0 eq {/s s 1 add def} {exit} ifelse + } if + /n n 1 add def + /s s 1 add def + /p p 1 add def + } loop + n s + } bind def + + % Encoding for each alphabet + /enca { + seta exch get cws exch j exch put + /j j 1 add def + } bind def + /encb { + setb exch get cws exch j exch put + /j j 1 add def + } bind def + /encc { + dup type /arraytype ne { + setc exch get + } { + aload pop 48 sub exch 48 sub 10 mul add + } ifelse + cws exch j exch put + /j j 1 add def + } bind def + + % Character exclusively in either alphabet A or B + /anotb {dup seta exch known exch setb exch known not and} bind def + /bnota {dup setb exch known exch seta exch known not and} bind def + + % Pre-compute relative position of next anotb and next bnota characters + /nextanotb [ msg length {0} repeat 9999 ] def + /nextbnota [ msg length {0} repeat 9999 ] def + msg length 1 sub -1 0 { + /i exch def + msg i get anotb { + nextanotb i 0 put + } { + nextanotb i nextanotb i 1 add get 1 add put + } ifelse + msg i get bnota { + nextbnota i 0 put + } { + nextbnota i nextbnota i 1 add get 1 add put + } ifelse + } for + + % Does a-only come before b-only after given position and vice versa + /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def + /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def + + /cws barcode length 2 mul 3 add array def + + % Select start character + /j 0 def + msglen 0 gt {0 numsscr} {-1 -1} ifelse /nums exch def /nchars exch def + { % common exit + msglen 0 eq { + stb enca + /cset (setb) def + exit + } if + msglen 2 eq nums 2 eq and { + stc enca + /cset (setc) def + exit + } if + nums 4 ge { + stc enca + /cset (setc) def + exit + } if + 0 abeforeb { + sta enca + /cset (seta) def + exit + } if + stb enca + /cset (setb) def + exit + } loop + + % Main encoding loop + /i 0 def { + i msglen eq {exit} if + + i numsscr /nums exch def /nchars exch def + + % Determine switches and shifts + { % common exit + cset (seta) eq cset (setb) eq or nums 4 ge and + msg i get fn1 ne and { + nums 2 mod 0 eq { + swc cset (seta) eq {enca} {encb} ifelse + /cset (setc) def + exit + } { + msg i get cset (seta) eq {enca} {encb} ifelse + /i i 1 add def + swc cset (seta) eq {enca} {encb} ifelse + /cset (setc) def + exit + } ifelse + } if + cset (setb) eq msg i get anotb and { + i msglen 1 sub lt { + i 1 add bbeforea { + sft encb + msg i get enca + /i i 1 add def + exit + } if + } if + swa encb + /cset (seta) def + exit + } if + cset (seta) eq msg i get bnota and { + i msglen 1 sub lt { + i 1 add abeforeb { + sft enca + msg i get encb + /i i 1 add def + exit + } if + } if + swb enca + /cset (setb) def + exit + } if + cset (setc) eq nums 2 lt and { + i abeforeb { + swa encc + /cset (seta) def + exit + } if + swb encc + /cset (setb) def + exit + } if + + % No switches or latches so encode + cset (seta) eq { + msg i get enca + /i i 1 add def + exit + } if + cset (setb) eq { + msg i get encb + /i i 1 add def + exit + } if + cset (setc) eq { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + exit + } if + + exit + } loop + + } loop + /cws cws 0 j getinterval def + } if % auto encoding + + % Derive checksum and place stop character + /cws j 2 add array dup 0 cws putinterval def + /csum cws 0 get def + 1 1 j 1 sub { + /i exch def + /csum csum cws i get i mul add def + } for + /csum csum 103 mod def + cws j csum put + cws j 1 add seta stp get put + + % Create an array containing the character mappings + /encs + [ (212222) (222122) (222221) (121223) (121322) (131222) (122213) + (122312) (132212) (221213) (221312) (231212) (112232) (122132) + (122231) (113222) (123122) (123221) (223211) (221132) (221231) + (213212) (223112) (312131) (311222) (321122) (321221) (312212) + (322112) (322211) (212123) (212321) (232121) (111323) (131123) + (131321) (112313) (132113) (132311) (211313) (231113) (231311) + (112133) (112331) (132131) (113123) (113321) (133121) (313121) + (211331) (231131) (213113) (213311) (213131) (311123) (311321) + (331121) (312113) (312311) (332111) (314111) (221411) (431111) + (111224) (111422) (121124) (121421) (141122) (141221) (112214) + (112412) (122114) (122411) (142112) (142211) (241211) (221114) + (413111) (241112) (134111) (111242) (121142) (121241) (114212) + (124112) (124211) (411212) (421112) (421211) (212141) (214121) + (412121) (111143) (111341) (131141) (114113) (114311) (411113) + (411311) (113141) (114131) (311141) (411131) (211412) (211214) + (211232) (2331112) + ] def + + % Derive space bar succession + /sbs cws length 6 mul 1 add string def + 0 1 cws length 1 sub { + /i exch def + sbs i 6 mul encs cws i get get putinterval + } for + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt [ [text textxoffset textyoffset textfont textsize] ] + /textxalign (center) + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code128 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code128-- @@ -903,47 +2879,165 @@ t_O30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB % --EXAM: (01)95012345678903(3103)000123 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp gs1-128 0.0 0 0 0 -%%BeginData: 39 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\\/MT" ?H \`B!23 JD% -DfBf4Df0WZ5*@]T @UX:e De* FB5 *@ ]T A8c @-A 9)+&+D ,% uF(LLj 055 -<6Cis9"FCf]=+D, %uF( LLj 06 Cc MFC oH/ FHO V,1G -Ou "b5A U &< AD eDP! -5%OP!5$bI=%,/FE 2M8Ou %NL< IL$AO rfcH 05k fOBl@m1P!5 $bI?IQJE-,f -4DKC/f1OYEX06Cc MFCoH /F5FCf -]=F(or3OtVtS06C cMFEh_9 AohO*+ EV1>F Eh_ 9AohO*OtVt S06CcMFEqe: -AohO*+EV1>FEqe:AohO*OtVtS05+p2B4uB0BOtmjBQTCjOu"b5AU&;>@UX:eDe*FB1G<!AA -2N5*@^bFcn_?!/L`?9TgrFF``d1C5;nRWKKH.G`k%L@Yb,LWJCY>5*ATfH]g@,F``d1C6CcDH' -2WOOo[4NP!5$bDfp/X!,@ZjP!FGYD!Kr5$G^Y`H>DNZC!JhG:I?I-W(Pj/h!Ji"JI?I-W.:%:V$A\bHV33Nq3+6N5Bm -=3"L]`G6P)#3FI?I/TAo;*5M#WVo04Q^l3$;EJAo;*5+C1-dL]E53@;0eG@Yb&JWI$:4P!5$b0 -4AQ;@;0d*Bp),P1GEV0sI?I0-P'N3M@kf_uP%%j6P%'RTG%#20>EV0sI?I0-P'J]j0et_O5*@^ -9+CSu*P%'4JP,XU]@;0=fG\(D.@;1MtL]W`5P$jGlOp$,A0et_O@Yb&J!KmbP3/@QE0et_OH'1 --s0et_O@V0Lf0p6c7@kf_uP!5$bI?IQXP"768@<,jrA7Zln0et_O@Yb&J!JgoBCm(WX1GOu"b++DQ]5Oo^_%I?J/XBl7]p -B4YKoCh[d&@:s.]P&bnY@<,jrA7Zlu+Dbb0CLLje@=+"FCf]=G].2+F(KG9FCf]=H#I;,F(KG9F -Cf]=AoDR/+EV1>FE;/BAKY8$?'9G@EbBHR$?Tj(FEh51BkM=D#%M4^FCfKUG[YW*F,g?@E--#; -FD5Z2F-:cVEbBG9A8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou"b(F"o7$1,tFVP%64gCG'+ -8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+* -6lBl7R3P#M~> -% uk.co.terryburton.bwipp/gs1-128 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp gs1-128 0.0 2015050900 77611 77161 +%%BeginData: 157 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code128 dup /uk.co.terryburton.bwipp findresource put +begin +/gs1-128 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 0.5 def + /linkagea false def + /linkagec false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /text barcode def + + % Expand ordinals of the form ^NNN to ASCII + /expand { + /in exch def + /out in length string def + /j 0 def + in + { % loop + (^) search { + dup out exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi out exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup out exch j exch putinterval + length j add /j exch def + out 0 j getinterval exit + } ifelse + } loop + } bind def + + % Parse out AIs + /ais [] def + /aival 2 dict def + barcode dup length 1 sub 1 exch getinterval + { % loop + dup () eq {exit} if + (\)) search pop + exch pop + exch (\() search { + exch pop exch 3 1 roll + } { + () 3 1 roll + } ifelse + [ ais aload pop counttomark 2 add index ] /ais exch def + aival 3 1 roll expand put + } loop + pop + + % Pre-defined fixed length data field AIs + % any AI whose prefix is not included in this table must be + % terminated with "FNC1", even if it's fixed length + /aifixed 23 dict def + [ + 0 1 4 {} for + ] { + (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put + } forall + [ + 11 1 20 {} for + 23 + 31 1 36 {} for + 41 + ] { + 10 2 string cvrs dup aifixed 3 1 roll put + } forall + + % Create the code128 data + /fnc1 -1 def + /c128 [ fnc1 ] def + 0 1 ais length 1 sub { + /i exch def + /ai ais i get def + /val aival ai get def + c128 length ai length add val length add array + dup 0 c128 putinterval + dup c128 length ai [ exch {} forall ] putinterval + dup c128 length ai length add val [ exch {} forall ] putinterval + /c128 exch def + i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + c128 length 1 add array + dup 0 c128 putinterval + dup c128 length fnc1 put + /c128 exch def + } if + } for + + % Compose input to code128 + /barcode c128 length 1 add 5 mul string def + /i 0 def /j 0 def { + i c128 length eq {exit} if + c128 i get dup fnc1 eq { + pop barcode j (^FNC1) putinterval + /j j 4 add def + } { + barcode exch j exch put + } ifelse + /i i 1 add def + /j j 1 add def + } loop + linkagea linkagec or { + barcode j linkagea {(^LNKA)} {(^LNKC)} ifelse putinterval + /j j 5 add def + } if + /barcode barcode 0 j getinterval def + + % Get the result of encoding with code128 + options (height) height put + options (dontdraw) true put + options (parsefnc) true put + /args barcode options //code128 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/gs1-128 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER gs1-128-- @@ -951,90 +3045,233 @@ FD5Z2F-:cVEbBG9A8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou"b(F"o7$1,tFVP%64gCG'+ % --BEGIN ENCODER ean14-- % --REQUIRES preamble raiseerror renlinear code128-- % --DESC: GS1-14 -% --EXAM: (01)04601234567893 +% --EXAM: (01) 0 46 01234 56789 3 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean14 0.0 0 0 0 -%%BeginData: 33 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%5 2X= -FD5Z2F-8_M1G<3G Eas#u AWf 6?1 G< 9W DKK E0@ X4aVt -cOu8C3DfBf4Df0W CP,i2' Cia 0 N4aW >WI? IQm 30Ia6V33Qn !BlU*FE2M8P -!+/T/Wr;\FcnqO1 OXV5/T c#U AWei tP#Z pnA We*t3A5;iF D5Z2F-8_M1O -YEcDfBf4Df0WCOu %NL8M >0sG ][P9D KI"C AU& FE;/BAWe^ 01G> #B4uCM09S,# -@<,jrA7^PsL]il7NW^aa0e&9&HS8iPBlJ#DARTI21h'm(5tR(l7oM,o0f1"iF`VXI@V'1dDBO. -;FD)dF0JP"!@;p1%Bk(RnBl@l3Bk1dmFD5?$ATBFWEa`['AS#n&DfV"*I?IQ=@<,jrA7^p5L_5 -ee@UX:eDe*FB@YbY[D3>$K04K->E,[F@@;[eV@UWe@ASu.&BT=-(;_]jY1a$XXF*&O6AKW]`+E -)9C0f1"`BkM.%F"]1e@;0doATDg0EfrY8P#Pn!Eas#uAV^Iu@<,jrA7^p5L]im?P"^4c3/B8OA -s,?63Kd4%EdKHKGA2#8/nJI/0f3?JA4($=Ea`I"ATEeQ7oM,o0f1"iF`VXI@rH7,@;0U%Df0B: -+Co2!BlnDL061K8F(Jp'Ec5u]5CJ\oI?I/T@q]F`CNFW8L]ESoL]E53L^\V`Bp(ZC1G<6OARfL -sF_r72BOt[hF*2=B@UX:eDe*E%BnunT!Kp*30TrDLL]W`SL]ET$H\_ceCjhIGOo^_%I?I,S@q] -F`CNFW8L^IX*ARfLsF_upAP%p/ZL^K;[Ou$QUEas#uAWgMY&s>D)@UX:eDe*F8&X#dsBOt[hF* -2>U0TlI"D0mpFGA2#8/nJI/0f3?JA4($A@r"JHB5)IJ,tVuaDfTl0@rrh`;_]jY1a$:AARfKuA -8,[jF%3/A/VBOt[h -F*2>U0TlI"GV@UX:eDe*FB1G<3 -GEas#uAV_(aV33WD@<,jrA7^PsNX&l[:.$`i0p6fk@<,jrA7^Q%B67j*P'LtbFD5Z2F,gN:Df0 -Z-Eaa06EckrVG].PCBl@m1NX0T4EcYf(DI[d/F_-_\04Am6F!+q#Eas#uAKYo1FD5Z2F"]1VDe -*E61,tF]Ou$NeB60(8FEhn3+Bot1AU&;>FCf]=G].2+F(KG9FCf]=H#I;,F(KG9FCf]=AoDR/+ -EV1>FE;/BAKY8$?'9G@EbBHR$?Tj(FEh51BkM=D#%M4^FCfKUG[YW*F,g?@E--#;FD5Z2F-:cV -EbBG9A8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou"b&@;[eVOuSV806M%_@rEuAATDg:@Wc^ -5Df.1:GA2#8+Co%qBl7L&ATMd4Ear[DFcna -% uk.co.terryburton.bwipp/ean14 0.0 0 -%%EndData -%%EndResource -% --END ENCODER ean14-- +%%BeginResource: uk.co.terryburton.bwipp ean14 0.0 2015050900 69977 69481 +%%BeginData: 105 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code128 dup /uk.co.terryburton.bwipp findresource put +begin +/ean14 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Strip spaces from the given data + /text barcode def + barcode dup length string exch 0 exch + {dup 32 ne {3 copy put pop 1 add} {pop} ifelse} forall + 0 exch getinterval /barcode exch def + /hasspace text length barcode length ne def + + % Validate the input + barcode 0 4 getinterval (\(01\)) ne { + /bwipp.ean14badAI (GS1-14 must begin with (01) application identifier) //raiseerror exec + } if + barcode length 17 ne barcode length 18 ne and { + /bwipp.ean14badLength (GS1-14 must be 13 or 14 digits) //raiseerror exec + } if + barcode 4 barcode length 4 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.ean14badCharacter (GS1-14 must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 18 eq { + barcode 17 get checksum 48 add ne { + /bwipp.ean14badCheckDigit (Incorrect GS1-14 check digit provided) //raiseerror exec + } if + } { + 18 string + dup 0 barcode putinterval + dup 17 checksum 48 add put + /barcode exch def + text length hasspace {2} {1} ifelse add string + dup dup length 2 sub ( ) putinterval + dup dup length 1 sub checksum 48 add put + dup 0 text putinterval + /text exch def + } ifelse + /gtin barcode 4 14 getinterval def + + % Compose input to code128 + /barcode 21 string def + barcode 0 (^FNC101) putinterval + barcode 7 gtin putinterval + + % Get the result of encoding with code128 + options (dontdraw) true put + options (parsefnc) true put + /args barcode options //code128 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/ean14 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER ean14-- % --BEGIN ENCODER sscc18-- % --REQUIRES preamble raiseerror renlinear code128-- % --DESC: SSCC-18 -% --EXAM: (00)006141411234567890 +% --EXAM: (00) 0 0614141 123456789 0 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp sscc18 0.0 0 0 0 -%%BeginData: 34 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\Amo LsAW ei& FC f] =Ao DR/ OiN V@06 -CcMFE;/BAV^\V1G FC f]=AoDR/Ot DhQ06CcMFE; -/BAKZ)+G]\"@H=` 6mOu" b5AU& GhuA8,[jFE9)gEa`['AS#n&DfV"*I?IQ=@<,jrA7^Q"@UX:eDe*FB@Yb/MWKKr% -OuS7OP%Kk@LcLVpP&bn&@WuO*E%Z3Q@q.5Q@UWe7BOPpi@ru:&NZ_8!6UNF[3$<'\F*&O7Df0Z -*Bl5&3DJXS@A8,[jFE9)gEa`['AS#n&DfV"*I?IQXP"@<:BOt[hF*2>U!0T-o!/LZ3&:6'EP!5 -$b04S[,@r$..D'3>%ARfLsF_r71@<,jrA7ZltL]ikAP"UTbP,W/O!g7;S!0TKlL]`fVI?IQm!K -o6eP"769BOt[hF*2>U$=da\@r$..D28O^C6GQP$Bf.e1Lad5@rGmhP%'4_P!+/$@<,jrA7^Q3P -"T:uARfLsF_upgOo^__HS8iPBlJ#DF)ti$0fWWNA4($A@r"JHB5)IJ-:r)bDfTl0@rrhl;aWo( -0fU:cBOt[h+Co2!BlkJ:Ec6,8A7]:)061K8F(Jp'Ec5u]5CJ\oI?IQc(6YMW3/@QD@<,jrA7^p -LOuS74@q]F`CNFW8LbOtmP'AWh@<,jrA7^ofOu"b4F(8]&@UX:eDe*F8"Gd\R9Th1bFCf]=+C\ -c"@rGmhOu"b#@<,jrA7^Q7P,49I,mFCf]=+EV1>FEh_9AohO*+EV1>FEqe:AohO* -+EV1>FCoH/FG]\1=Ch[O"NWs!)DKKH1P'CDUB60(8DfBf -:E-,f4DKCtc@<-"%+CoD.FC]E#GEQnu061WACh[cu@<.N1Ou[rR%[&V$F)ti$0fY=UP%64gCG' -+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+ -*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/sscc18 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp sscc18 0.0 2015050900 69989 69488 +%%BeginData: 105 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code128 dup /uk.co.terryburton.bwipp findresource put +begin +/sscc18 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Strip spaces from the given data + /text barcode def + barcode dup length string exch 0 exch + {dup 32 ne {3 copy put pop 1 add} {pop} ifelse} forall + 0 exch getinterval /barcode exch def + /hasspace text length barcode length ne def + + % Validate the input + barcode 0 4 getinterval (\(00\)) ne { + /bwipp.sscc18badAI (SSCC-18 must begin with (00) application identifier) //raiseerror exec + } if + barcode length 21 ne barcode length 22 ne and { + /bwipp.sscc18badLength (SSCC-18 must be 17 or 18 digits) //raiseerror exec + } if + barcode 4 barcode length 4 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.sscc18badCharacter (SSCC-18 must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 16 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 22 eq { + barcode 21 get checksum 48 add ne { + /bwipp.sscc18badCheckDigit (Incorrect SSCC-18 check digit provided) //raiseerror exec + } if + } { + 22 string + dup 0 barcode putinterval + dup 21 checksum 48 add put + /barcode exch def + text length hasspace {2} {1} ifelse add string + dup dup length 2 sub ( ) putinterval + dup dup length 1 sub checksum 48 add put + dup 0 text putinterval + /text exch def + } ifelse + /sscc barcode 4 18 getinterval def + + % Compose input to code128 + /barcode 25 string def + barcode 0 (^FNC100) putinterval + barcode 7 sscc putinterval + + % Get the result of encoding with code128 + options (dontdraw) true put + options (parsefnc) true put + /args barcode options //code128 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/sscc18 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER sscc18-- @@ -1045,64 +3282,149 @@ c"@rGmhOu"b#@<,jrA7^Q7P,4nL_Q" 0Op -s'_E-,f4DKCt)Ou "b#@< ,jr A7^ o fOu "b% Df0 Z-Eaa/ 7A moLsAW ei& -Bl7EsF_#&nBOt[h +D,%u F(L Lj0 6U c? Bk1 XoA RfCb@r !3 !@;L!r Ou" -b*DI[L*A7]joG]Y '?@; L!r Ou "b *DI [L* A7] 7aAR -fLiDKKH7FFCf ]=AoD R/OtD hQ0 6CcMFE;/BA KZ)+G]\"@H= -`6mOu"b5AU&Z##D09oA+Cf>-FCAm$+E).6Gp$X3B5)I//0JG2E+sE&C`mP*FED)7 -F"AGTE+*6fF!+n/A0>u-AKZ&>D.7F"F!*%e,VLYo0/%?SBldisEcQ)=P!=AX<.0p#04J@1Ch7K -,@UX:eDe*FB@Wl0rBk1XoARfCb@r$FI!KsF1P#RT#04S[,@r$..D281T1Pc$e!FfJXCh7L?!Ks -F/@UX:eDe*FB5)96&9OhaEEctl-F-8_M94MXH@r$..D3=oQ@q]F`CNFW8P!5$bI?I,S@q]F`CN -FW8+Cf(r@r$..D29^*C6CAr@;KXg@_99O.=04K->E,[F>De*E83FZE-6YL%@CIDlLBlo@^8T&$VEcP`$F3?VgF -ARfKuA8,[jFE0%F0ekI?0f(O=0ocSs0ekI=0ekC=0oc -Sq0f(U?0ekC=0ocSs0f(U?0ekC;0ocSq0ekI?0ekC=0ocSs0ekI?0ekC;0ocSq0f(UA0ekC;0o -cSq0ekI=0f(O?0ocSs0ekI=0f(O=0ocSq0f(U?0f(O=0ocSs0ekC;1GLU?0ocSq0f(O=1GLU?0 -ocSs0f(O=1GLU=0ocSq0ekC=1GLU?0ocSs0ekC=1GLU=0ocSq0f(O?1GLU=0ocSq0ekC;1G^aA -0ocSs0ekC;1G^a?0ocSq0f(O=1G^a?0ocSq0ekC=1G^a?0ocSs0ekC;0ekI?0ocSq0f(O=0ekI -?0ocSs0f(O=0ekI=0ocSq0ekC=0ekI?0ocSs0ekC=0ekI=0ocSq0f(O?0ekI=0ocSq0ekC;0f( -UA0ocSs0ekC;0f(U?0ocSq0f(O=0f(U?0ocSq0ekC=0f(U?0ocSs1GLU=0ekC=0ocSq1G^a?0e -kC=0ocSs1G^a?0ekC;0ocSq1GLU?0ekC=0ocSs1GLU?0ekC;0ocSq1G^aA0ekC;0ocSq1GLU=0 -f(O?0ocSs1GLU=0f(O=0ocSq1G^a?0f(O=0ocSq1GL[?1GLU=0ocSq1GL[?0ekI=0ocSq1GLU= -1GL[?0ocSq0ekI=1GL[?0ocSq1GLU?0f(O=0jTqu06:TD+C\c"Ch7K,Bl7EsF_#&nBOt[hH\_c -PH\_`OP#[YGL^K;]P,4E/_6L]DO.G]\4LAnH*qF5?'9G\HZXLSL]CY>!/LVsAU&FCf]=F(or3+C1.TI?ITd! -/LYb@<-0qDMS=VWI$:4P!5$b055<7GT^L0@<-O"Ci^_.@<,jrA7ZltL]NZ4P"UroF(025Bo!+Z -CkrF]!G-.YF!,17A9a81P'M.oF&<^jOAU&FCf]=F(or3+C1.TI?I-8DI[L*A7]7aARfM&+EM"5+C\c"Ch7L?$Bf4]$Bb -F$DI[`1@q]F`CNFW8P"Us`Bl7EsF_#&nBOt[hBl8$(G]\9TFEhmM@UX:nAT!;)Oo\c0@UX:eBO -Pq&+Cf(r@r$..D284U9O_FNCh7L?!KmJ>&<^jOAU&FCf]=F(or3+ -C1.TI=$'\F>E/\m@<-0qDMS=V!Jh;MCij65FEqe:AohO*+EV1>FCoH/FFCoH/FFCf]=F( -or3+C1.TI?ITYHZNY;+C\c"Ch7L?$Bf4]$BbF$DI[aD/!FCoH/F&<^jOAU&FCf]=F(or -3+C1.TI?ITYP#XV,061WA0/%?WDJX$)ARTU4F(025>9IurF*i]sP,Wkm8R3uYBQG;#+EM"5P%' -4JOo^@?P#?X?ASGdjFFB=)>q]YrF!+[0F(03R@Yb&J!Jgf?;L=3"I?K4g+DG_'Cis9"FCf]=HS -9JcF -% uk.co.terryburton.bwipp/code39 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code39 0.0 2015050900 67013 66837 +%%BeginData: 141 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code39 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def + /validatecheck false def + /includetext false def + /includecheckintext false def + /hidestars false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.code39badCharacter (Code 39 must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 0 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.code39badCheckDigit (Incorrect Code 39 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + /includecheck true def + } if + + % Create an array containing the character mappings + /encs + [ (1113313111) (3113111131) (1133111131) (3133111111) (1113311131) + (3113311111) (1133311111) (1113113131) (3113113111) (1133113111) + (3111131131) (1131131131) (3131131111) (1111331131) (3111331111) + (1131331111) (1111133131) (3111133111) (1131133111) (1111333111) + (3111111331) (1131111331) (3131111311) (1111311331) (3111311311) + (1131311311) (1111113331) (3111113311) (1131113311) (1111313311) + (3311111131) (1331111131) (3331111111) (1311311131) (3311311111) + (1331311111) (1311113131) (3311113111) (1331113111) (1313131111) + (1313111311) (1311131311) (1113131311) (1311313111) + ] def + + /sbs barlen includecheck {3} {2} ifelse add 10 mul string def + /txt barlen includecheck {3} {2} ifelse add array def + + % Put the start character + sbs 0 encs 43 get putinterval + hidestars not { + txt 0 [(*) 0 textyoffset textfont textsize] put + } { + txt 0 [() 0 textyoffset textfont textsize] put + } ifelse + + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + sbs i 10 mul 10 add encs indx get putinterval + txt i 1 add [barcode i 1 getinterval i 1 add 16 mul textyoffset textfont textsize] put + } for + + % Put the checksum and end characters + includecheck { + sbs barlen 10 mul 10 add encs checksum get putinterval + includecheckintext { + txt barlen 1 add [barchars checksum 1 getinterval barlen 1 add 16 mul textyoffset textfont textsize] put + } { + txt barlen 1 add [() barlen 1 add 16 mul textyoffset textfont textsize] put + } ifelse + sbs barlen 10 mul 20 add encs 43 get putinterval + hidestars not { + txt barlen 2 add [(*) barlen 2 add 16 mul textyoffset textfont textsize] put + } { + txt barlen 2 add [() barlen 2 add 16 mul textyoffset textfont textsize] put + } ifelse + } { + sbs barlen 10 mul 10 add encs 43 get putinterval + hidestars not { + txt barlen 1 add [(*) barlen 1 add 16 mul textyoffset textfont textsize] put + } { + txt barlen 1 add [() barlen 1 add 16 mul textyoffset textfont textsize] put + } ifelse + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code39 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code39-- @@ -1113,45 +3435,118 @@ Bl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: Code39 Ext! % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code39ext 0.0 0 0 0 -%%BeginData: 37 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ X4a VtcO u8C3D -fBf4Df0WCP,i2'C ia0N4a W>W I ?IQ m3 0Ia6 V33 Qn!BlU*FE2 M8P!+/T/Wr; -\FcnqO1OXV5/Tc# UAWeit P#Z p nAWe *t3A 5;i FD5Z2F-8_M 1OYEcDfBf4D -f0WCOu%NL8T8*YF (K\OD0 '>4 @UX: eDe* FB@ ZmRN1G Oo[ 4NP!5$bP') pIL]E55P"_# -iD0'?Q5&,lSP,XU .P'E- LP%'4 LP,X6 >P! 5%&I=%,:D0 '?Q5&-6EP'N -4"C6ATNC6CcD1G< 3GEas#u AKYi2B 8?P&P "_# pP!FGYXG]Z8\A4($=Ea`I"ATEee6Z6L -H+>Z##7H0NWCkp!A]Z -91QDJmNWD"t!B,r=2i[nuNWD/#!\[`;![UNWD\2!D/:P8r`pFNWDh6!DSRT:6#?NNWDt:!E"jX;N:cVNWE+>!EG-\)iY199''"9TB0#9o]9$:6#B%:Q>K&=,m>46&l!s6B2*t6]M3u7#h=!7?.F"7ZIO#7 -udX$8<*a%8WEj&8r`s'99''(9TB0)9o]9*:6#B+:Q>K,:lYT-;2t].;N:f/;iUo04=H3G5=cNP6>)iY1:lYT';2t](;N:f);iUo*<*bYC05b?F@rGmh+C\c"Ch7L?!g7A -_V33VfDIn$6AU&;>@UX:nAT!;*P&-;XOu"b+L]ESoL]E53@UX:nAT!;)P,Wd]Bp(ZC1G<C*6toEa -s#uAKY]M99OO2G][G/@<.N?L]NZUHZ!D=FCf]=+DQ]5Oo^RD+Hh"uP#O)L+DN$1G][G/@<.N?O -o^_%I?I,SDIn$%De*E%DIn$%De*F8!,@ZjOu"b/ATr6-G]Y'GATr6-G]\`AC6D8R1N.5SBl@m1 -NX006DKKE0@BnueQ9TjXBG]Y'BL]NY>FEhn=DKKoEP'DD<87?OOF, -g?EG]\%PFHUlsP#Pk1B60(8DfBf:E-,f4DKCtc@<-"%+CoD.FC]E#GEQnu061WACh[cu@<.N1O -u[rR%[&V$@rGmh1HB#kFHSVHA1r(@/n8fPFCfK5H"(o:FDl%L@WuO*E$/\&Anc-oEb0<1F`Lu' -P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> -% uk.co.terryburton.bwipp/code39ext 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code39ext 0.0 2015050900 65652 65486 +%%BeginData: 110 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code39 dup /uk.co.terryburton.bwipp findresource put +begin +/code39ext { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given the code39extended text + + /dontdraw false def + /includetext false def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + % Validate the input + barcode 4 barcode length 4 sub getinterval { + 128 ge { + /bwipp.code39extBadCharacter (Code 39 Extended must contain only ASCII characters) //raiseerror exec + } if + } forall + + /barlen barcode length def + + % Extended alphabet to non-extended alphabet + /extencs + [ (%U) ($A) ($B) ($C) ($D) ($E) ($F) ($G) ($H) ($I) ($J) ($K) ($L) ($M) ($N) ($O) + ($P) ($Q) ($R) ($S) ($T) ($U) ($V) ($W) ($X) ($Y) ($Z) (%A) (%B) (%C) (%D) (%E) + ( ) (/A) (/B) (/C) (/D) (/E) (/F) (/G) (/H) (/I) (/J) (/K) (/L) (-) (.) (/O) + (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (/Z) (%F) (%G) (%H) (%I) (%J) + (%V) (A) (B) (C) (D) (E) (F) (G) (H) (I) (J) (K) (L) (M) (N) (O) + (P) (Q) (R) (S) (T) (U) (V) (W) (X) (Y) (Z) (%K) (%L) (%M) (%N) (%O) + (%W) (+A) (+B) (+C) (+D) (+E) (+F) (+G) (+H) (+I) (+J) (+K) (+L) (+M) (+N) (+O) + (+P) (+Q) (+R) (+S) (+T) (+U) (+V) (+W) (+X) (+Y) (+Z) (%P) (%Q) (%R) (%S) (%T) + ] def + + /newcode barlen 2 mul string def + /newtext barlen 2 mul string def + /j 0 def + 0 1 barlen 1 sub { + /i exch def + /extchar extencs barcode i get get def + newcode j extchar putinterval + newtext j barcode i get put + extchar length 1 ne {newtext j 1 add ( ) putinterval} if + /j j extchar length add def + } for + /newcode newcode 0 j getinterval def + /newtext newtext 0 j getinterval def + + % Get the result of encoding with code39 + options (dontdraw) true put + /args newcode options //code39 exec def + + % Replace chars in /txt with chars in newtext + includetext { + /txt args (txt) get def + 0 1 newtext length 1 sub { + /i exch def + /txtentry txt i 1 add get def + txtentry 0 newtext i 1 getinterval put + txt i 1 add txtentry put + } for + args (txt) txt put + } if + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/code39ext dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code39ext-- @@ -1162,41 +3557,107 @@ P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: 01234567 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code32 0.0 0 0 0 -%%BeginData: 33 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%5 2X= -FD5Z2F-8_M1G<3G Eas#u AWf 6?1 G< 9W DKK E0@ X4aVt -cOu8C3DfBf4Df0W CP,i2' Cia 0 N4aW >WI? IQm 30Ia6V33Qn !BlU*FE2M8P -!+/T/Wr;\FcnqO1 OXV5/T c#U AWei tP#Z pnA We*t3A5;iF D5Z2F-8_M1O -YEcDfBf4Df0WCOu %NL8M >0sG ][P9D KI"C AU& FE;/BAWe^ 01G>#B4u CM09S,# @<,jrA 7^p5L ^9/ \@UX:eDe*F B@Yb>RD3>$K -04K->E,[F>De*E811F[&9P&*SFD-[_8T\BWBjkm%:hX9XD.-pmA7Zm#F`VXI@V$ZA+E)9C3?Vj -HB5)I/0/%?SBldisEcQ)=P!=AX<+99V@rGmhH]g@E0Tp%25);4^:m,jG04K->E,[F>De*E811F -[&6YKnK@:OCjEfMYAFCB!"@;[2aBOPpu@:O4dAKYi4F*&O7Df0Z*Bl5&3DJXS@A8,[jFE9)gEa -`['AS#n&DfV"*I?IQXP"@<:BOt[hF*2>U!0T-o!/LZ3#CA+%ARfLsF_upAP%p.9@UX:eDe*FB@Yb>R4aUXHEas#uAV^VT94MXH@r$..D29m/!Kq; -H04K->E,[F>De*E811F[&6YL%@CIDlLBlo@i8T&$VEcP`$FG%kJuA1oTV@;0doATDg0EfrY8P#Qjm9I,mFCf]=+EV1>FEh_9AohO*+EV1>FEqe:AohO*+E -V1>FCoH/FG]\1=Ch[O"NWs!)DKKH1P'CDUB60(8DfBf:E --,f4DKCtc@<-"%+CoD.FC]E#GEQnu061WACh[cu@<.N1Ou[rR%[&V$@rGmh1GY+QP%64gCG'+8 -/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6 -lBl7R3P#M~> -% uk.co.terryburton.bwipp/code32 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code32 0.0 2015050900 63549 63380 +%%BeginData: 99 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code39 dup /uk.co.terryburton.bwipp findresource put +begin +/code32 { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable code32 text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /textxoffset 0 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Validate the input + barcode length 8 ne barcode length 9 ne and { + /bwipp.code32badLength (Italian Pharmacode must be 8 or 9 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.code32badCharacter (Italian Pharmacode must contain only digits) //raiseerror exec + } if + } forall + + % Calculate check digit + /checksum 0 def + 0 1 7 { + /i exch def + barcode i get 48 sub i 2 mod 0 ne {2 mul} if dup 9 gt {9 sub} if + checksum add /checksum exch def + } for + /checksum checksum 10 mod def + barcode length 9 eq { + barcode 8 get checksum 48 add ne { + /bwipp.code32badCheckDigit (Incorrect Italian Pharmacode check digit provided) //raiseerror exec + } if + } if + 10 string + dup 0 barcode putinterval + dup 8 checksum 48 add put + /text exch def + + % convert number from base10 to base32 + /val text cvi 32 barcode cvrs def + /barcode 6 string def + 0 1 5 {barcode exch 48 put} for + barcode 6 val length sub val putinterval + + % convert base32 number to specified character set + 0 1 5 { + dup barcode exch get + dup (AEIO) {ge {1 add} if dup} forall pop + barcode 3 1 roll put + } for + + % format HRI + text 1 text 0 9 getinterval putinterval + text 0 65 put + + % Get the result of encoding with code39 + options (dontdraw) true put + /args barcode options //code39 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/code32 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code32-- @@ -1207,43 +3668,108 @@ lBl7R3P#M~> % --EXAM: 123456 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp pzn 0.0 0 0 0 -%%BeginData: 35 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\AmoLsAWe i&FC f]= Ao DR /Oi NV@ 06C cMFE -;/BAV^\V1GK FD5 Z 2F*j (NAm oLs AWf3'P!FGY <0B5(@ZmRN0 -oc8tP)XR(F_-_!H ]ftD5* C&O 5*@^ MH]f t&E ckrV1OYEdI ?J0)*g/N:Df -Bf4Df0WZ5*@^MP# Q@=FD 5Z2F *j'+I ?I/T FCf ]=AoDR/+EV 1>FCoH/FHS5 -=1G$K04K->E,[FKH>Y]O@:W& -CDJ+')NZ(_t:,jA5F`VXI@V$Z@+E)9C3$;aGB5)I/0/%?SBldisEcQ)=P!=AX<.0+&@<,jrA7^ -p5L^'#Z@UX:eDe*FB@Yb8PD3>$K04K->E,[FKH>YZN@:W&CDJ+')NZ(_t:,a;4F`VXI@V$Z?+E -)9C2]uXFB5)I/0/%?SBldisEcQ)=P!=AX<.0p0@UX:eDe*F+OuS7OP%Kk@LcLVpP&bn&@WuO*E - %Z*UDF.cB6YKnK@:OCjEfM,9>#$2WF`VXI@rH7,@;0U%Df0B:+Co2!BlnDL061K8F(Jp'Ec5u -]5CJ\oI?I/TD0'?+ASrW0H>Y]hL^AKVL^8El_5*@^MP"769BOt[hF*2=B@q]F`CNFW8L^TA\Ou$T]ARfLsF_upAP!+.F@WuO*E%Z*UDF.cB8 -T&KiFAlajF_,H#AWA'.DI[U*Eb/a&+Ac6:+DG_4F`\aIAT;j(DI[6#E,ol?Bk1dc0/%?SBldis -EcQ)=P!=AX<+99V@rGmhP%&9LB5D-sL]N[ -U0TlI"D0mpFGA2#8/oZ,S6=FClBOt[h6tp:JFH.P:DI[U*Eb/a&+Ac6:+Cf(r@r!2tBkM.%+E2 -@>G%kJuA1oTV@;0doATDg0EfrY8P#Qjm<,H\hCh7LIV33fo!/N4iG`k%B!FfJX@rGmhP'N3MD0 -'?+AT!;)P,Vr)ARfLsF_upgOo^_j05YcCP!5$bDfBf4Df0WV#\7jkFC]E#GB@kJAWh9k@<-"%+ -Dl14+E)4@Bl@m10/$gRA7[PWP!>*c06CcMF:g-U:/Kg4% -FCf]=L^%^;B8?S*F(]<#DMS=VWKKr9J$!G]Y'MAU&FCf]=F(or3+C-*qP'CDUB60(?FCf]=G[YE&B5W_6@qBP"ATErY@<- -"%NWX3=FDl,?Bl@m1P'CDUB6,2+Df0Z-Eaa0TE%`kbASu -% uk.co.terryburton.bwipp/pzn 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp pzn 0.0 2015050900 63596 63384 +%%BeginData: 100 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code39 dup /uk.co.terryburton.bwipp findresource put +begin +/pzn { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable code32 text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /textxoffset 0 def + /height 1 def + /pzn8 false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /textxoffset textxoffset cvr def + /height height cvr def + + % Validate the input + pzn8 { + barcode length 7 ne barcode length 8 ne and { + /bwipp.pzn8badLength (PZN8 must be 7 or 8 digits) //raiseerror exec + } if + } { + barcode length 6 ne barcode length 7 ne and { + /bwipp.pzn7badLength (PZN7 must be 6 or 7 digits) //raiseerror exec + } if + } ifelse + barcode { + dup 48 lt exch 57 gt or { + /bwipp.pznBadCharacter (PZN must contain only digits) //raiseerror exec + } if + } forall + + % Calculate check digit + /msglen pzn8 {9} {8} ifelse def + /checksum 0 def + 0 1 msglen 3 sub { + /i exch def + barcode i get 48 sub i pzn8 {1} {2} ifelse add mul + checksum add /checksum exch def + } for + /checksum checksum 11 mod def + checksum 10 eq { + /bwipp.pznBadInputSequence (Incorrect PZN input sequence provided) //raiseerror exec + } if + barcode length msglen 1 sub eq { + barcode msglen 2 sub get checksum 48 add ne { + /bwipp.pznBadCheckDigit (Incorrect PZN check digit provided) //raiseerror exec + } if + } if + msglen string + dup 0 45 put + dup 1 barcode putinterval + dup msglen 1 sub checksum 48 add put + /msg exch def + + % Get the result of encoding with code39 + options (dontdraw) true put + /args msg options //code39 exec def + + % format HRI + /text msglen 5 add string def + text 0 (PZN - ) putinterval + text 6 msg 1 msglen 1 sub getinterval putinterval + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/pzn dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER pzn-- @@ -1254,53 +3780,156 @@ r(@/n8fPFCfK5H"(o:FDl%L@WuO*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F % --EXAM: THIS IS CODE 93 % --EXOP: includetext includecheck % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code93 0.0 0 0 0 -%%BeginData: 45 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\Ou "b5 AU& DP!5%O P!5$bI=%,/F -E2M8Ou%NL5FCf]=F(o r3OtVtS06Cc -MFEqe:AohO*+EV1 >FEqe :AohO *OtVt S05 +p2B4uB0BO tmjBQTCjOu" -b&DI[`1>E/nB1GL U=16)Pn 0ekF<1 QDYo0 ekI =16)Pn0ekL >0ocGm1,1L< -1QDYo1,1O=16)Pn1,1R>0ocGm0ekC;1l_bp1GLX>0ocGm1bg^>0ocGn0ekC;1QDYp0ekF<16)P -o0ekI=0ocGn1,1L<16)Po1,1O=0ocGn1GLU=0ocGm0etI<1QDYo0etL=16)Pn0etO>0ocGm1,: -R=16)Pn1GU[>0ocGm0ekC<1QDYo0ekF=16)Pn0ekI>0ocGm1,1L=16)Pn1GLU>0ocGn0etI<16 -)Po0etL=0ocGn0ekC<16)Po0ekF=0ocGn1,1L=0ocGn1,:R=0ocGm0etI=16)Pn0etL>0ocGm1 -,:R>0ocGm1,CX>0ocGm1,1L>0ocGo0ekC;16)Pp0ekF<0ocGo1,1L<0ocGm0etI>0ocGm0f(O> -0ocGn0ekC=0ocGm1,1O>0ocGo0etI<0ocGo0ekC<0ocGm1,:U>0ocGm0ekC>0ocJn0ekC>0els -s1G<3GEarckEc[6k0JP==1c70M3&s8k6UX@47n?3D92&&T:Jand;cHat='/U//M8.k0.S?31G< -3GEbo<)+C\c"@rGmhP%'S106:`I0o5jm1GA[OOu"b4AoohbrK8riF(TMNM#0ocB87T:[TAooeg"B.ch06:`I1QDT:7T:mZAoojP5!G,c05YcC+C\c"C -h7LI$'I(tBnubP1GP"UU;P&5P!@q]:k+D,M -$G%#3.+C\c"@rGmh+DHW4Oo^@AP"_$3Ou"b*+DHW7Oo^_%I=!V]+DHW4Oo^_%I?ITYP#Q:>B-: -q3@q]:kP'AWo+DHW4Oo^_%05;VEL]NY>Ou%NLAM7nAB-;&4B8?P&P"_#p05YcCCh7K,D0'?Q@Z -iN]DI[L*A7]7aARfM&06:TD+Dl14Ch7L?#*NeY)3P#`V33W_HS9GLF!,=@B5D-sL^'#YL^fLJP -,4FCoH/Fq]Z#F!+[0F(03R@Yb&J!Jgf?;L<(g -BkM+$I?K4g04JC3+Bot0@WR]AL]NY>L]W`;H\_ZMP(R$_Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/code93 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code93 0.0 2015050900 65852 65716 +%%BeginData: 148 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code93-- @@ -1311,50 +3940,122 @@ TVm"@r#drB75qB~> % --EXAM: Code93 Ext! % --EXOP: includetext includecheck % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code93ext 0.0 0 0 0 -%%BeginData: 42 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ X4a VtcO u8C3D -fBf4Df0WCP,i2'C ia0N4a W>W I ?IQ m3 0Ia6 V33 Qn!BlU*FE2 M8P!+/T/Wr; -\FcnqO1OXV5/Tc# UAWeit P#Z p nAWe *t3A 5;i FD5Z2F-8_M 1OYEcDfBf4D -f0WCOu%NL8T8*YF (K\OD0 '>4 @UX: eDe* FB@ ZmRN1G Oo[ 4NP!5$bP') pIL]E55P"_# -iD0'?Q5&,lSP,XU .P'E- LP%'4 LP,X6 >P! 5%&I=%,:D0 '?Q5&-6EP'N -4"C6ATNC6CcD1G< 3GEas#u AKYi2B 8?P&P "_# pP!FGY:Q>H0NWCkp!A]Z91QDJmNWD"t!B, -r=2i[nuNWD/##$t4t<%hF8#$t4t<$b"o#$t4t<$b%p#$t4t<$b(q#$t4t<$b+r#$t4t<$b.s#$ -t4t<$bS*!C;_H6B2(6NWDP.!C`"L7ZIL>NWD\2!D/:P8r`pFNWDh6!DSRT:6#?NNWDt:!E"jX; -N:cVNWE+>!EG-\)ien;as_499'3_;as_49TB<`;as_49o]Ea;as_4:6#Nb -;as_4:Q>Wc;as_4=,mJk;as_:6&l.U;as_:6B27V;as_:6]M@W;as_:7#hIX;as_:7?.RY;as_ -:7ZI[Z;as_:7udd[;as_:8<*m\;as_:8WF!];as_:8ra*^;as_:99'3_;as_:9TB<`;as_:9o] -Ea;as_::6#Nb;as_::Q>Wc;as_::lY`d;as_:;2tie;as_:;N:rf;as_:;iV&g;as_:)ien;as_4:lY`d;as_4; -2tie;as_4;N:rf;as_4;iV&g;as_4<*bYC05b?F@rGmh+C\c"Ch7L?#*NecV33VfDIn$6AU&;> -@UX:nAT!;.P&-;XOu"b+L]ESo05H@DOu%moL]LsnEbo<)L]N[NWC8cH$tiT05;VE+D -#e>Ch7LI!Ko5lCERC8AU&<5AT!;)P!+/J!I]*cBl7EsF_#'*AU&< -D06DG\+CT;'F,g?EG]]*AOu%moL]MC)GB@D@FHU*h!KsF/056S5Ou"b5G][M7FE2XLFEhmMBp) -,P1N[k`ASuU1H&)H -% uk.co.terryburton.bwipp/code93ext 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code93ext 0.0 2015050900 65941 65711 +%%BeginData: 114 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code93 dup /uk.co.terryburton.bwipp findresource put +begin +/code93ext { + + 20 dict begin + + /options exch def % We are given an options string + /barcode exch def % We are given the code39extended text + + /dontdraw false def + /includetext false def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Extended alphabet to non-extended alphabet + /extencs + [ (^SFT%U) (^SFT$A) (^SFT$B) (^SFT$C) (^SFT$D) (^SFT$E) (^SFT$F) (^SFT$G) + (^SFT$H) (^SFT$I) (^SFT$J) (^SFT$K) (^SFT$L) (^SFT$M) (^SFT$N) (^SFT$O) + (^SFT$P) (^SFT$Q) (^SFT$R) (^SFT$S) (^SFT$T) (^SFT$U) (^SFT$V) (^SFT$W) + (^SFT$X) (^SFT$Y) (^SFT$Z) (^SFT%A) (^SFT%B) (^SFT%C) (^SFT%D) (^SFT%E) + ( ) (^SFT/A) (^SFT/B) (^SFT/C) (^SFT/D) (^SFT/E) (^SFT/F) (^SFT/G) + (^SFT/H) (^SFT/I) (^SFT/J) (^SFT/K) (^SFT/L) (-) (.) (^SFT/O) + (0) (1) (2) (3) (4) (5) (6) (7) + (8) (9) (^SFT/Z) (^SFT%F) (^SFT%G) (^SFT%H) (^SFT%I) (^SFT%J) + (^SFT%V) (A) (B) (C) (D) (E) (F) (G) + (H) (I) (J) (K) (L) (M) (N) (O) + (P) (Q) (R) (S) (T) (U) (V) (W) + (X) (Y) (Z) (^SFT%K) (^SFT%L) (^SFT%M) (^SFT%N) (^SFT%O) + (^SFT%W) (^SFT+A) (^SFT+B) (^SFT+C) (^SFT+D) (^SFT+E) (^SFT+F) (^SFT+G) + (^SFT+H) (^SFT+I) (^SFT+J) (^SFT+K) (^SFT+L) (^SFT+M) (^SFT+N) (^SFT+O) + (^SFT+P) (^SFT+Q) (^SFT+R) (^SFT+S) (^SFT+T) (^SFT+U) (^SFT+V) (^SFT+W) + (^SFT+X) (^SFT+Y) (^SFT+Z) (^SFT%P) (^SFT%Q) (^SFT%R) (^SFT%S) (^SFT%T) + ] def + + /newcode barlen 6 mul string def + /newtext barlen 6 mul string def + /j 0 def /k 0 def + 0 1 barlen 1 sub { + /i exch def + /extchar extencs barcode i get get def + /extlen extchar length def + newcode j extchar putinterval + newtext k barcode i get put + extlen 1 ne {newtext k 1 add ( ) putinterval} if + /j j extlen add def + /k k extlen 1 eq {1} {2} ifelse add def + } for + /newcode newcode 0 j getinterval def + /newtext newtext 0 k getinterval def + + % Get the result of encoding with code93 + options (dontdraw) true put + options (parsefnc) true put + /args newcode options //code93 exec def + + % Replace chars in /txt with chars in newtext + includetext { + /txt args (txt) get def + 0 1 newtext length 1 sub { + /i exch def + /txtentry txt i get def + txtentry 0 newtext i 1 getinterval put + txt i txtentry put + } for + args (txt) txt put + } if + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/code93ext dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code93ext-- @@ -1365,51 +4066,158 @@ E+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: 2401234567 % --EXOP: height=0.5 includecheck includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp interleaved2of5 0.0 0 0 0 -%%BeginData: 43 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\O u"b5A -U&KFD5Z 2F*j(N Amo L sAWf 3'P! FGY <0B5(@ZmRN 0oc8tP)XR(F -_-_!H]ftD5*C&O5 *@^MH] ft& Eckr V1OY EdI ?J0)*g/N:D fBf4Df0WZ5* -@^MP#Q@=FD5Z2F* j'+I? I/TF Cf]=A oDR/ +EV 1>FCoH/FHS 5=1G -E,[FDDKKH1Ch7$uARmQ7Ai4%+A4($=Ea`I"ATEe]8T&W]Ebo;qG%G2,1*CLI+>k9YF`VXI@rH7 -,@;0U%Df0B:+Co2!BlnDL061K8F(Jp'Ec5u]5CJ\oI?I/T@UX:nASrW"@<,jrA7^p5Ou$QUEbo -<)L]W`SL]ET$Bl7EsF_#&nBOt[hOp#6&Ebo<)L]W`SL]ETTBl7EsF_#&nBOt[hP&QQeP&bn&E+ -*9"@UX:nAT!;)Oo^`BOu%&cA;C5A0Tp["@:Y/p@UX:eDe*FBGqWW8Eas#uAKYr#ACm"g^1OXU -'@q]F`CNFW8+Cf(r@r$..D'3:rEas#uAKY]M98G9bWKI:F1OYEdI?I,S@q]F`CNFW8L^IX*ARf -LsF_upAP%p/ZL^K;[Ou"b1@:UKi@<-0qDMS=V!Ks:B1N6c5L]CmmEas#uAWh=X@:UKi@<-0qDB -NG&ARfLsF_upgOo^_j04J@1@rGmh+E1b"Ou"b#@<-0qDBNCsEbo<)L]NY>Ou%NL<%hg#@ribsN -Wh-l1,:SE"Yqee0f"am0etI<16)Mn1,1LL]NZ4@UX:eBOPq&P!5%gP')ps055<7G`k7R1QlmDFY@FCoH/F$'K+\"Hie-AU&FCf]=F(or3+C1.TI=$'\FP"]SG!KmJ ->$'K+\"Hie-AU&FCf]=F(or3+C1.TI?ITYP"9Y'F!+q#Ebo<)L]r -rXL]ikAASu"!L^TA=P'K/P061WA0/%?WDJX$)ARTU4F(025>9IurF*i]sP,Wkm8R3uYBQG;#+E -M"5P%'4JOo^@?P#?X?ASGdjFFB=)>q]YrF!+[0F(03R@Yb&J!Jgf?;L=3"I?K4g+DG_'Cis9"F -Cf]=HS9JcF -% uk.co.terryburton.bwipp/interleaved2of5 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp interleaved2of5 0.0 2015050900 65832 65492 +%%BeginData: 150 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/interleaved2of5 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Validate the input + barcode { + dup 48 lt exch 57 gt or { + /bwipp.interleaved2of5badCharacter (Interleaved 2 of 5 must contain only digits) //raiseerror exec + } if + } forall + + /barlen barcode length def % Length of the code + + % Prefix 0 to barcode if length is even and including checkdigit + % or length is odd and not including checkdigit + barlen 2 mod 0 eq includecheck and % even & includecheck + barlen 2 mod 0 ne includecheck not and or { % odd & !includecheck + /pad barlen 1 add string def % Create pad one bigger than barcode + pad 0 48 put % Put ascii 0 at start of pad + pad 1 barcode putinterval % Add barcode to the end of pad + /barcode pad def % barcode=pad + /barlen barlen 1 add def % barlen++ + } if + + % Add checksum to end of barcode + includecheck { + /checksum 0 def + 0 1 barlen 1 sub { + /i exch def + i 2 mod 0 eq { + /checksum checksum barcode i get 48 sub 3 mul add def + } { + /checksum checksum barcode i get 48 sub add def + } ifelse + } for + /checksum 10 checksum 10 mod sub 10 mod def + /pad barlen 1 add string def % Create pad one bigger than barcode + pad 0 barcode putinterval % Add barcode to the start of pad + pad barlen checksum 48 add put % Add checksum to end of pad + /barcode pad def % barcode=pad + /barlen barlen 1 add def % barlen++ + } if + + % Create an array containing the character mappings + /encs + [ (11221) (21112) (12112) (22111) (11212) + (21211) (12211) (11122) (21121) (12121) + (1111) (2111) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + /sbs barlen 5 mul 8 add string def + /txt barlen array def + + % Put the start character + sbs 0 encs 10 get putinterval + + 0 2 barlen 1 sub { + /i exch def + % Lookup the encodings for two consecutive barcode characters + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enca encs indx get def % Get the indxth encoding + + barcode i 1 add 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /encb encs indx get def % Get the indxth encoding + + % Interleave the two character encodings + /intl enca length 2 mul string def + 0 1 enca length 1 sub { + /j exch def + /achar enca j get def + /bchar encb j get def + intl j 2 mul achar put + intl j 2 mul 1 add bchar put + } for + + sbs i 5 mul 4 add intl putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 9 mul 4 add textyoffset textfont textsize] put + includecheck includecheckintext not and barlen 2 sub i eq and { + txt i 1 add [( ) i 1 add 9 mul 4 add textyoffset textfont textsize] put + } { + txt i 1 add [barcode i 1 add 1 getinterval i 1 add 9 mul 4 add textyoffset textfont textsize] put + } ifelse + } for + + % Put the end character + sbs barlen 5 mul 4 add encs 11 get putinterval + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /barratio 2 + /spaceratio 2 + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/interleaved2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER interleaved2of5-- @@ -1417,42 +4225,120 @@ A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou"b*DKKH1Ch7$uARmQ7Ai5`2P%64gCG'+8/p(ZFEd;, % --BEGIN ENCODER itf14-- % --REQUIRES preamble raiseerror renlinear interleaved2of5-- % --DESC: ITF-14 -% --EXAM: 04601234567893 +% --EXAM: 0 46 01234 56789 3 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp itf14 0.0 0 0 0 -%%BeginData: 31 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%52X=FD5Z2 F-8_M 1G< 3GE as #u AWf 6?1 G<9WDK KE 0@X4aVtcOu8C 3DfBf4 Df0 W CP,i 2'Ci a0N 4aW>WI?IQm 30Ia6V33Qn! -BlU*FE2M8P!+/T/ Wr;\Fc nqO 1OXV 5/Tc #UA WeitP#ZpnA We*t3A5;iFD -5Z2F-8_M1OYEcDf Bf4Df 0WCO u%NL8 M>0s G][ P9DKI"CAU& FE;/ BAWe^ 01G># -B4uCM09S,#@<,jrA7^p5L^fMa@UX:eDe*FB@YbMWD3>$K04K->E,[FDFCm6a@UWe@ASu.&BT=- -*<(8Go1a$XXF*&O6AKW]`+E)9C0f1"`BkM.%F"]1e@;0doATDg0EfrY8P#Pn!Eas#uAUBS"LbP -!(P!4[^P#.<^HS8iPBlJ#DBlmrA1h'm(6YKnK@:OCjEfM55<(8Go1a$XXF*&O7Df0Z*Bl5&3DJ -XS@A8,[jFE9)gEa`['AS#n&DfV"*I?IQXP"@<:BOt[hF*2>U!0T-o!/LZ3%!sXAP!5$b04S[,@ -r$..D'3>%ARfLsF_r71@<,jrA7ZltP"UTbP,W/O!g7;S!0TKlL]`fVI?IQm!Ko6eP"769BOt[h -F*2>U$=da\@r$..D28O^C6GQP$Bf.e1Lad5@rGmhP%'4WP!+/$@<,jrA7^Q+P"T:uARfLsF_up -gOo^__HS8iPBlJ#DBlmrA1h'm(6YL%@CIDlLBlo@]8T&$VEcP`$FO+Cf(r@r!2tBkM -.%+E2@>G%kJuA1oTV@;0doATDg0EfrY8P#Qjm*c@<-"%NWX3=FDl,?Bl@m1P'CDUB6,2+Df0Z-Eaa0TE%`kbAS -uD_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F -)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/itf14 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp itf14 0.0 2015050900 65819 65737 +%%BeginData: 109 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/itf14 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def + /includecheckintext true def + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset 3 def + /height 0.5 def + /showborder true def + /borderwidth 4 def + /borderleft 15 def + /borderright 15 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + /borderwidth borderwidth cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + + % Strip spaces from the given data + /text barcode def + barcode dup length string exch 0 exch + {dup 32 ne {3 copy put pop 1 add} {pop} ifelse} forall + 0 exch getinterval /barcode exch def + /hasspace text length barcode length ne def + + % Validate the input + barcode length 13 ne barcode length 14 ne and { + /bwipp.itf14badLength (ITF-14 must be 13 or 14 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.itf14badCharacter (ITF-14 must contain only digits) //raiseerror exec + } if + } forall + + % Calculate ITF checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 14 eq { + barcode 13 get checksum 48 add ne { + /bwipp.itf14badCheckDigit (Incorrect ITF-14 check digit provided) //raiseerror exec + } if + } { + 14 string + dup 0 barcode putinterval + dup 13 checksum 48 add put + /barcode exch def + text length hasspace {2} {1} ifelse add string + dup dup length 2 sub ( ) putinterval + dup dup length 1 sub checksum 48 add put + dup 0 text putinterval + /text exch def + } ifelse + + % Get the result of encoding with interleaved2of5 + options (dontdraw) true put + options (showborder) showborder put + options (borderwidth) borderwidth put + options (borderleft) borderleft put + options (borderright) borderright put + options (height) height put + options (textyoffset) textyoffset put + /args barcode options //interleaved2of5 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/itf14 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER itf14-- @@ -1463,42 +4349,99 @@ uD_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F % --EXAM: 563102430313 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp identcode 0.0 0 0 0 -%%BeginData: 34 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%52X= FD5Z2 F-8 _M1 G< 3G Eas #uA Wf6?1G <9 WDKKE0 @X4aVt cOu8C3 DfB f 4Df0 WCP, i2' Cia0N4aW>W I?IQm30Ia6V -33Qn!BlU*FE2M8P !+/T/W r;\ Fcnq O1OX V5/ Tc#UAWeitP #ZpnAWe*t3A -5;iFD5Z2F-8_M1O YEcDf Bf4D f0WCO u%NL 8M> 0sG][P9DKI "CAU&FE;/ BAWe^ 01G >#B4uCM09S,#@<,jrA7^p5L^TA_@UX:eDe*FB@YbGUD3>$K04K->E,[FDA7]Y#@rGmh6=FC -uASu.&BT=`6AT`*9@q]Er:iCDs+A$*TDKKB,A7Zm#F`VXI@V$Z:0d(CT+>GVoA8,[jFE9)gEa` -['AS#n&DfV"*I?IQ=@<,jrA7^+N3/B8OAs,?63Kd4%EdKHKGA2#8/nnj-DKKB,A7\)9A4($=Ea -`I"ATEeb6tLL_F(8lp+AcutF-FCAm$+E).6Gp$X3B5)I/0/%?SB -ldisEcQ)=P!=AX<.0p$04S[,@r$..D281T1Pc$e!Jh)0056S5Ou"b$BOt[hF*2=B@q]F`CNFW8 -+C\c"@rGmh+DI!3LbP!kBnuhRC5;kQ4aVtfP&,PnL^B5\I?ITn!Ko6eP"769BOt[hF*2>U$=da -\@r$..D28O^C6GQP$Bf.e1Lad5@rGmhP%'4UP!+/$@<,jrA7^Q)P"T:uARfLsF_upgOo^__HS8 -iPBlJ#DBk1dmFCT6"AO9g96YL%@CIDlLBlo@n8T&$VEcP`$F%3/@rPBOt[hF*2>U0TlI"GVB!g66?H$!VBFGL$.@<,jrA7^PuL]`f6P'M.\G]\`H@UX:eDe*F -8"c*8D9Tj[CAU&H#IYDBl@m1NX0 -06DKKE0@FCf]=G].2+F(KG9FCf]=H -#I;,F(KG9FCf]=AoDR/+EV1>FE;/BAKY8$?'9G@EbBHR$?Tj(FEh51BkM=D#%M4^FCfKUG[YW* -F,g?@E--#;FD5Z2F-:cVEbBG9A8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou"b*A7]Y#@rGm -hOuSV806M%_@rEuAATDg:@Wc^5Df.1:GA2#8+Co%qBl7L&ATMd4Ear[DFcna -% uk.co.terryburton.bwipp/identcode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp identcode 0.0 2015050900 62754 62576 +%%BeginData: 91 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/identcode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Validate the input + barcode length 11 ne barcode length 12 ne and { + /bwipp.identcodeBadLength (Deutsche Post Identcode must be 11 or 12 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.identcodeBadCharacter (Deutsche Post Identcode must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 10 { + /i exch def + /checksum checksum barcode i get 48 sub i 2 mod 0 eq {4 mul} {9 mul} ifelse add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 12 eq { + barcode 11 get checksum 48 add ne { + /bwipp.identcodeBadCheckDigit (Incorrect Deutsche Post Identcode check digit provided) //raiseerror exec + } if + } if + 12 string + dup 0 barcode putinterval + dup 11 checksum 48 add put + /barcode exch def + + % Compose the human readable text + /text ( . . ) 16 string copy def + text 0 barcode 0 2 getinterval putinterval + text 3 barcode 2 3 getinterval putinterval + text 7 barcode 5 3 getinterval putinterval + text 11 barcode 8 3 getinterval putinterval + text 15 barcode 11 1 getinterval putinterval + + % Get the result of encoding with interleaved2of5 + options (dontdraw) true put + options (includecheck) false put + /args barcode options //interleaved2of5 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/identcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER identcode-- @@ -1509,42 +4452,99 @@ hOuSV806M%_@rEuAATDg:@Wc^5Df.1:GA2#8+Co%qBl7L&ATMd4Ear[DFcnaDP! 5%O P!5$ bI=% ,/F E2M8Ou%NL< IL$AOrfcH05 -kfOBl@m1P!5$bI? IQJE- ,f4D KC/f1 OYEX 06C cMFCoH/F 5FCf] =F(or 3OtVt S06 CcMFEh_9Ao hO*+EV1>FEh -_9AohO*OtVtS06C cMFEqe: AohO*+ EV1>F Eqe :AohO*OtVt S05+p2B4uB0 -BOtmjBQTCjOu$QUEas#uAWgMY%?bR;@<,jrA7^p5L^oSbOp$+b@WuO*E%YsE,[ -FGASH6rDe*EG@:V`=ARfLDBkM.%N\sCG@rHC.ARfg)6tLL_F(8lp+AcutF+9J$!G]Y'MAU&FCf]=F(or3+C-*qP'CDUB60(?FCf]=G[YE&B5W_6@qBP"ATErY@<-"%NWX3 -=FDl,?Bl@m1P'CDUB6,2+Df0Z-Eaa0TE%`kbASu -% uk.co.terryburton.bwipp/leitcode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp leitcode 0.0 2015050900 62746 62572 +%%BeginData: 91 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/leitcode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Validate the input + barcode length 13 ne barcode length 14 ne and { + /bwipp.leitcodeBadLength (Deutsche Post Leitcode must be 13 or 14 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.leitcodeBadCharacter (Deutsche Post Leitcode must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i get 48 sub i 2 mod 0 eq {4 mul} {9 mul} ifelse add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 14 eq { + barcode 13 get checksum 48 add ne { + /bwipp.leitcodeBadCheckDigit (Incorrect Deutsche Post Leitcode check digit provided) //raiseerror exec + } if + } if + 14 string + dup 0 barcode putinterval + dup 13 checksum 48 add put + /barcode exch def + + % Compose the human readable text + /text ( . . . ) 18 string copy def + text 0 barcode 0 5 getinterval putinterval + text 6 barcode 5 3 getinterval putinterval + text 10 barcode 8 3 getinterval putinterval + text 14 barcode 11 2 getinterval putinterval + text 17 barcode 13 1 getinterval putinterval + + % Get the result of encoding with interleaved2of5 + options (dontdraw) true put + options (includecheck) false put + /args barcode options //interleaved2of5 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/leitcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER leitcode-- @@ -1555,111 +4555,426 @@ V,9E+*6lBl7R3P#M~> % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databaromni 0.0 0 0 0 -%%BeginData: 103 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\e #06 -M%_@rEuAATDg:@W c^5Df .1: GA2 # 8P1 l(D Ops 'T@<>p e@ <-:'DJ =HR -'Tt>:%52X=FD5Z2 F-8_M 1G< 3GE as #u AWf 6?1 G<9WDK KE 0@7 iD fBf 4Df 0WZY :js=E -bTE(FEqh:P!+/J! Ko='%< $3- B l@m 1H ]kFA @;L !rP!+/T5^e epOuSV6P,4< -rNWD;+NHB2`AWf3 'OtDh\ P') p OOu% N5Ot Ccr F_-^lI?ITY P%BdtOuY16E --,f4DKCt)Ou%NL< ,Z_tBl @m1 H]g1 5P"B 8(E c#6,NX9fJF `(\tFCf!G4a -ShqASGdjFGLB^8< Plo1O YEc0 5+p2B 4uB0 BOt mjBQTCjOu$ QUEas#uAV^> -B"HlH="=PrY.?\O p04K- >E,[F ?@<>p e@< -:'DJ;FGA3 ieI7n6K4+@K -X[@7"CC+AZilBk1 puARfgr Df0!"+ Dl7BF pE@<*JdD/O&uBl[cpFD5 -Z2@;I''F`VXI@V$Z:1E^UV+>G\qA8,[jFE9)gEa`['AS#n&DfV"*I?IQ=@<,jrA7^Q"@UX:eDe -*FB@Yb/MWKKr%OuS7OP%Kk@LcLVpP&bn&@WuO*E%Y[0FCAWeEc5f4BgQ6=6YKnK@:OCjEfMtH; -_]C_@<>pE@<*JdD/O&uBl[cpFD5Z2@;I''F`VXI@rH7,@;0U%Df0B:+Co2!BlnDL061K8F(Jp' -Ec5u]5CJ\oI?I/T@q]F`CNFW8L]ESoL]E53L^\V`Bp(ZC1G<6OARfLsF_r72BOt[hF*2=B@UX: -eDe*E%BnunT!Kp*30TrDLL]W`SL]ET$H\_ceCjhIGOo^_%I?I,S@q]F`CNFW8L^IX*ARfLsF_u -pAP%p/ZL^K;[Ou$QUEas#uAWgMY&s>D)@UX:eDe*F8&X#dsBOt[hF*2>U0TlI"D0mpFGA2#8/n -AC4@:EYcDf'B+6=FClBOt[h6tp:JFH/CRDI[U*Eb/a&+@f?b+@KX[@7"CC+AZilBk1puARfgrD -f0!"+Cf(r@r!2tBkM.%+E2@>G%kJuA1oTV@;0doATDg0EfrY8P#Qjm9IB`Eas#uAKY]C!Kp-4!/LW8!/LV\P'DD<82"jjEdNTDOr9 -F^L]W_WP%K'(5(/SnL]N;4L]rS:P)"hoOo^C=P!45UCkr+T=GR'B=H[*>L]NZ@P#@H,L]NY>P! -4;W<.0p#H\_]c=GR'B=HZL-P!FGY/Efr4sAKYhuF)-R3P!+s2DJ^M-GESq:Ckr.UCm(c,@<. -/*P&-9^M#NQ0Op$+bF*:u.+EM^7C`mV4+D#b[WF]n/WFB:VOo]-1+C\c"P,X6=P,W>/Eg!Db1O -YEcAS`Ju@<.O1L]W`9HS92Y@;L`"Ou$um+D#b[WF]n/WFB:VOo^@?Oo^C=D0Ld:Oo]oID3@)GW -F^::WJCSWGZ3d05Pf?Cm$tuG%#3M!Ko6eP"76IG%#20F*:u.+Dc40C`m;* -+C\c"P,X6Ou"b.@<63,D..L$L]LsnEfprrE0:?e1OY -Et06Uc?+Eh10+EM^7Cm"g^1G!g4Fa94DUQG%#20Bp),B!(AsAP%od[P&-9^P'CGM -DK]H)+DDs-Bl8*&C`mGT98!:63q\Y6P'DD<82#!tB4uB0@VK_'@;L`/P"UH.76:+)C6CA^Bl8* -&CkrOV!g4Fa98!:63q\Y6P'AWrAS-%?!0T,kBcqM%B#`&M9!252LL',5G!252UL^&Y>L]`H0L^JkAhM)-K -L^8eBL]iM;L`_EsL'jB(#N(=AL^Jq?L^&YBLdm+,(krBeL]iMBL]N;;L]N<\?'6usFCAW52)HF -[L&k)+!/Lf7$A\b>#D`M=4G#)EJ>",JXe$AJaIL'? -q"$]"qA#`&M;;2>6YOu"b*L]ESoHXniRFCAW52DcOjP"UsHHZW\*0fCj2BnueQ!JguD9RD2N8M -=U/FCgV!Ou"b%0m%>s5*@]TA2.qFAWf6?1G<8nD0Ko]5*@]TA2.Y3AWf6?1G<8nASc:J5*@]TA -2._P!5$bP!FGY<%hr.Bo!%X!Ko6eP%?:\L]ESoHXnrUFCAW52 -)HFiP"UsHHZW\*0f:d1BnueQ!JguD9RD2N8M=U2FCgV!Ou"b%1j!Z!5*@]TA2J.IAWf6?1G<8q -D0Ko]5*@]TA2Ik6AWf6?1G<8qASc:J5*@]TA2Iq?P!5$bP!FGY<%hr.Bo!%X!Ko6eP%?:W0m@O -YA2,3;0kYQjWFR`*AWfr%0kG0>+Cm3DGAi9?AmoLsAKYVsFAc%9GA1T0BQK=m04Ze]AKYM<+Cm -3>F-SL]h?=1M:clWFRf,AWge=1M(B6+Cm9FG@cR -5FE2M8+D58-;H$ML`;-OL^&YJL -c1&MLe*==L^8eWLa7cbL]iN+Lbji!L`hL"Ld?hNL_,A-La%WkLdd+SLd[%OLc\n*1G<6OARfM" -Bk2=!F!+\C",I5=!f-l5!Jgi6"c*>!Jgc4!Jgi6$&AV%ARfLsF_uq1P%p.9@q]F`CNFW8L^9/9HS8lBARfLsF_r72BOt[hF*2>U! -KmJH1OYEc@q]F`CNFW8Le*\$HS8lBARfLsF_r72BOt[hF*2>U!KmJH1OYEc04S[,@r#n&+Cf(r -@r$:&A9;L++Cf(r@r$..D28L];MYL>Ckr7X9Th1b@q]F`CN=N;ATf2+BOt[hGA1T0BQG;+BOt[ -hF*2>U$'K%Z"d3\X"d2QB1G<6OARfLrFGL*`$'I*#!/LZ3"FDe9P!5$b@q]F`CN=M>Bcpo!ARf -LrFE1r9L]hFTWKKo;G^Y`GAoD^,@<@M4Df'B+P!*DqEc#6,NX9fJF`(\tFCf!G4d'i406:TD+B -sX&A2/:TI?I03BOt[hCik#PP"B1>GC+b$8RsZ%H[V&K@q]F`CN=NDI?I041O"1oP"CH1L]LeE1 -H[cQEb0,A061WACh[cu@<+#B@WNZ5@WO23BQG;#+EM"5P%'4JOo^@?P#?X?ASGdjFFB=)>q]Yr -F!+[0F(03R@Yb&J!Jgf?;L=3"I?K4g06DG\+EVjM06CcMFEh51BkM=D#%M4^FCfJGDfBe@DfBf -4Df0V=5!C*"Df0Z-Eaa0TE%`kbASu4aSi'AT/brLba=5!.C#_?'7"""Gd)7/UK-bP!5$bFDl+@Bp)+ -uDfd+9P"Us$HZNb;+DHW4FDl+@Bp),PWKMLSHZNb;+DHW4F(K;5BnueQWKKo;WKMLSP#Zpn82" -prG]P!3L]r-IDfCj@P')29K6(UCOogehL^/99Dfh-DP')29K3aWr05tWMGp%'?G]T$WLbb,kOu - %NL<+^&hD..OH$ZgDu@r#XdDf'B+P!+.FF(K;F+Bot1DfC&Z!KoX0WI9q$?'7!bAT0A[!*b6Z -L]E52L]C_DH#mP90o.GdL]E52L]E52?'9Jh&r6RE*d]PSP!5$bFDl+@Bp),F!0TKlFDl+@Bnue -QWKKo1!KoTmL]MpNF(K;F+DHW4P,XU;L]ET$H\_]NH\_ZMP#ZpnDN98!/LW2!/MA:L]E53I?K5=!/LW2!/LV\Ou"b4AT0FJ>9IBnFF/fEP!5&.I? -I0-Ou%/jE&3:M>DN98!/LW2!*tb5F(K;HLb;nf!/LW2!/LV\P'MisL]N;RHS9)r5*@^2Dfd+9P -"UT2P!+/$Dfd+9L]N[DOGLFDl,]!g7\SP(RgeE&!LWP'(hWE&*RXP'(hWE&3XYP')R(HX -^o8OogehI?K4gOu"b1Bm=nGE+sQ1_dDD*Y`ASu?nFE2)?05tWMF!,F9G -]PNWBm=lY1,!T\G^1ENBm=nVBOtmjBQPA9Bm=oZ8 -% uk.co.terryburton.bwipp/databaromni 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databaromni 0.0 2015050900 112081 118257 +%%BeginData: 418 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databaromni { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /height 33 72 div def + /linkage false def + /format (omni) def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + format (truncated) eq {/height 13 72 div def} if + /height height cvr def + + % Validate the input + barcode 0 4 getinterval (\(01\)) ne { + /bwipp.databaromniBadAI (GS1 DataBar Omnidirectional must begin with (01) application identifier) //raiseerror exec + } if + barcode length 17 ne barcode length 18 ne and { + /bwipp.databaromniBadLength (GS1 DataBar Omnidirectional must be 13 or 14 digits) //raiseerror exec + } if + barcode 4 barcode length 4 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.databaromniBadCharacter (GS1 DataBar Omnidirectional must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 18 eq { + barcode 17 get checksum 48 add ne { + /bwipp.databaromniBadCheckDigit (Incorrect GS1 DataBar Omnidirectional check digit provided) //raiseerror exec + } if + } if + 18 string + dup 0 barcode putinterval + dup 17 checksum 48 add put + /barcode exch def + + % Create the human readable text + /txt barcode length array def + 0 1 barcode length 1 sub { + /i exch def + txt i [barcode i 1 getinterval 0 0 () 0] put + } for + + /ncr { % n r + 2 copy sub 2 copy lt {exch} if % n r maxd mind + 1 1 5 3 roll % mind j=1 v=1 n maxd + 1 add -1 exch { % mind j v n -1 maxd+1 + mul % mind j v*i + 1 index 3 index le { + 1 index idiv exch 1 add exch + } if + } for + { % mind j v + 1 index 3 index gt {exit} if + 1 index idiv exch 1 add exch + } loop + exch pop exch pop + } bind def + + /getRSSwidths { + /oe exch def + /el exch def + /mw exch def + /nm exch def + /val exch def + /out el array def + /mask 0 def + 0 1 el 2 sub { + /bar exch def + /ew 1 def + /mask mask 1 bar bitshift or def { + /sval nm ew sub 1 sub el bar sub 2 sub ncr def + oe mask 0 eq and nm ew sub el 2 mul sub bar 2 mul add -2 ge and { + /sval sval nm ew sub el sub bar add el bar sub 2 sub ncr sub def + } if + el bar sub 2 gt { + /lval 0 def + nm ew sub el sub bar add 2 add -1 mw 1 add { + nm exch sub ew sub 1 sub el bar sub 3 sub ncr + /lval exch lval add def + } for + /sval sval lval el bar sub 1 sub mul sub def + } { + nm ew sub mw gt {/sval sval 1 sub def} if + } ifelse + /val val sval sub def + val 0 lt {exit} if + /ew ew 1 add def + /mask mask 1 bar bitshift not and def + } loop + /val val sval add def + /nm nm ew sub def + out bar ew put + } for + out el 1 sub nm put + out + } bind def + + /binval [ + linkage {1} {0} ifelse + barcode 4 13 getinterval {48 sub} forall + ] def + + 0 1 12 { + /i exch def + binval i 1 add 2 copy get binval i get 4537077 mod 10 mul add put + binval i binval i get 4537077 idiv put + } for + /right binval 13 get 4537077 mod def + binval 13 2 copy get 4537077 idiv put + + /left 0 def + /i true def + 0 1 13 { + /j exch def + binval j get + dup 0 eq i and { + pop + } { + /i false def + /left left 3 -1 roll 10 13 j sub exp cvi mul add def + } ifelse + } for + + /d1 left 1597 idiv def + /d2 left 1597 mod def + /d3 right 1597 idiv def + /d4 right 1597 mod def + + /tab164 [ + 160 0 12 4 8 1 161 1 + 960 161 10 6 6 3 80 10 + 2014 961 8 8 4 5 31 34 + 2714 2015 6 10 3 6 10 70 + 2840 2715 4 12 1 8 1 126 + ] def + + /tab154 [ + 335 0 5 10 2 7 4 84 + 1035 336 7 8 4 5 20 35 + 1515 1036 9 6 6 3 48 10 + 1596 1516 11 4 8 1 81 1 + ] def + + /i 0 def { + d1 tab164 i get le { + tab164 i 1 add 7 getinterval {} forall + /d1te exch def /d1to exch def + /d1mwe exch def /d1mwo exch def + /d1ele exch def /d1elo exch def + /d1gs exch def + exit + } if + /i i 8 add def + } loop + + /i 0 def { + d2 tab154 i get le { + tab154 i 1 add 7 getinterval {} forall + /d2te exch def /d2to exch def + /d2mwe exch def /d2mwo exch def + /d2ele exch def /d2elo exch def + /d2gs exch def + exit + } if + /i i 8 add def + } loop + + /i 0 def { + d3 tab164 i get le { + tab164 i 1 add 7 getinterval {} forall + /d3te exch def /d3to exch def + /d3mwe exch def /d3mwo exch def + /d3ele exch def /d3elo exch def + /d3gs exch def + exit + } if + /i i 8 add def + } loop + + /i 0 def { + d4 tab154 i get le { + tab154 i 1 add 7 getinterval {} forall + /d4te exch def /d4to exch def + /d4mwe exch def /d4mwo exch def + /d4ele exch def /d4elo exch def + /d4gs exch def + exit + } if + /i i 8 add def + } loop + + /d1wo d1 d1gs sub d1te idiv d1elo d1mwo 4 false getRSSwidths def + /d1we d1 d1gs sub d1te mod d1ele d1mwe 4 true getRSSwidths def + /d2wo d2 d2gs sub d2to mod d2elo d2mwo 4 true getRSSwidths def + /d2we d2 d2gs sub d2to idiv d2ele d2mwe 4 false getRSSwidths def + /d3wo d3 d3gs sub d3te idiv d3elo d3mwo 4 false getRSSwidths def + /d3we d3 d3gs sub d3te mod d3ele d3mwe 4 true getRSSwidths def + /d4wo d4 d4gs sub d4to mod d4elo d4mwo 4 true getRSSwidths def + /d4we d4 d4gs sub d4to idiv d4ele d4mwe 4 false getRSSwidths def + + /d1w 8 array def + 0 1 3 { + /i exch def + d1w i 2 mul d1wo i get put + d1w i 2 mul 1 add d1we i get put + } for + + /d2w 8 array def + 0 1 3 { + /i exch def + d2w 7 i 2 mul sub d2wo i get put + d2w 6 i 2 mul sub d2we i get put + } for + + /d3w 8 array def + 0 1 3 { + /i exch def + d3w 7 i 2 mul sub d3wo i get put + d3w 6 i 2 mul sub d3we i get put + } for + + /d4w 8 array def + 0 1 3 { + /i exch def + d4w i 2 mul d4wo i get put + d4w i 2 mul 1 add d4we i get put + } for + + /widths [ + d1w {} forall + d2w {} forall + d3w {} forall + d4w {} forall + ] def + + /checkweights [ + 1 3 9 27 2 6 18 54 + 58 72 24 8 29 36 12 4 + 74 51 17 32 37 65 48 16 + 64 34 23 69 49 68 46 59 + ] def + + /checkwidths [ + 3 8 2 1 1 3 5 5 1 1 3 3 7 1 1 + 3 1 9 1 1 2 7 4 1 1 2 5 6 1 1 + 2 3 8 1 1 1 5 7 1 1 1 3 9 1 1 + ] def + + /checksum 0 def + 0 1 31 { + /i exch def + /checksum checksum widths i get checkweights i get mul add def + } for + /checksum checksum 79 mod def + checksum 8 ge {/checksum checksum 1 add def} if + checksum 72 ge {/checksum checksum 1 add def} if + /checklt checkwidths checksum 9 idiv 5 mul 5 getinterval def + /checkrtrev checkwidths checksum 9 mod 5 mul 5 getinterval def + /checkrt 5 array def + 0 1 4 { + /i exch def + checkrt i checkrtrev 4 i sub get put + } for + + % Stacked format + format (omni) eq format (truncated) eq or { % linear + + /sbs [ + 1 d1w {} forall checklt {} forall d2w {} forall + d4w {} forall checkrt {} forall d3w {} forall 1 1 + ] def + + << + /ren //renlinear + /sbs sbs + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt txt + /textxalign (center) + /opt options + >> + + dontdraw not //renlinear if + + } { % 2D - stacked or stackedomni + + /top [ 1 1 d1w {} forall checklt {} forall d2w {} forall 1 1 0 ] def + /bot [ 1 1 d4w {} forall checkrt {} forall d3w {} forall 1 1 0 ] def + 0 2 24 { + /i exch def + top i get {0} repeat + top i 1 add get {1} repeat + } for + 50 array astore /top exch def + 0 2 24 { + /i exch def + bot i get {1} repeat + bot i 1 add get {0} repeat + } for + 50 array astore /bot exch def + + % Stacked + format (stacked) eq { + /sep [ 50 {0} repeat ] def + 4 1 45 { + /i exch def + top i get bot i get eq { + sep i 1 top i get sub put + } { + sep i 1 sep i 1 sub get sub put + } ifelse + } for + /pixs [ + 5 {top aload pop} repeat + sep aload pop + 7 {bot aload pop} repeat + ] def + /pixy pixs length 50 idiv def + } if + + % Stacked omnidirectional + format (stackedomni) eq { + /sep1 [ top {1 exch sub} forall ] def + sep1 0 [ 0 0 0 0 ] putinterval + sep1 46 [ 0 0 0 0 ] putinterval + 18 1 30 { + /i exch def + top i get 0 eq { + top i 1 sub get 1 eq { + 1 + } { + sep1 i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep1 exch i exch put + } for + /sep2 [ 0 0 0 0 21 { 0 1 } repeat 0 0 0 0 ] def + /sep3 [ bot {1 exch sub} forall ] def + sep3 0 [ 0 0 0 0 ] putinterval + sep3 46 [ 0 0 0 0 ] putinterval + 19 1 31 { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep3 i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep3 exch i exch put + } for + /f3 [1 1 1 1 1 1 1 1 1 0 1 1 1] def + true 0 1 12 {dup bot exch 19 add get exch f3 exch get eq and} for { + % Right shifted module for value 3 finder + sep3 19 [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval + } if + /pixs [ + 33 {top aload pop} repeat + sep1 aload pop + sep2 aload pop + sep3 aload pop + 33 {bot aload pop} repeat + ] def + /pixy pixs length 50 idiv def + } if + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx 50 + /pixy pixy + /height pixy 72 div + /width 50 72 div + /opt options + >> + + dontdraw not //renmatrix if + + } ifelse + + end + +} bind def +/databaromni dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databaromni-- @@ -1670,37 +4985,81 @@ drB75qB~> % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstacked 0.0 0 0 0 -%%BeginData: 29 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4a -VtcOu8C3DfBf4Df 0WCP , i2 'C ia0 N4a W>WI ?IQm3 -0Ia6V33Qn!BlU*F E2M8P! +/T / Wr; \F cnqO 1OX V5/Tc#UAWe itP#ZpnAWe* -t3A5;iFD5Z2F-8_ M1OYEc DfB f 4Df0 WCOu %NL 8Rc+K@rGmh L]E56P"^l=- -nmA)P&5P!@WuO*E %Y[0FC AWe EcZ> 2@r# Xd6 =FCj8WH#*; _]C_@<>pE@< -*JhFCAZpARlp#F` VXI@V '1dD BO.;F D)dF 0JP "!@;p1%Bk( RnBl@l3Bk1d -mFD5?$ATBFWEa`[ 'AS#n &DfV" *I?IQ =@< ,jrA7^p5L_ 5ee@UX:eDe* -FB@YbY[D3>$K04K ->E,[F? @<>pe@ <-F2@ :O( aA3s^89P&* SFD-[b7oM,b -6t(1G6=FmW;flGXCLq$!D09oA+C\n)0f'qjEZd(n+Co2!BlnDL061K8F(Jp'Ec5u]5CJ\o@UX: -eDe*F8"Cbe[@rGmhP%'4MP,XUE,[F?@<>pe@<-F2@:O(aA3s -^86YKnK@:OCjEfM\@;_]C_@<>pE@<*JhFCAZpARlp#F`VXI@rH7,@;0U%Df0B:+Co2!BlnDL06 -1K8F(Jp'Ec5u]5CJ\oI?I/T@q]F`CNFW8L]ESoL]E53L^\V`Bp(ZC1G<6OARfLsF_r72BOt[hF -*2=B@UX:eDe*E%BnunT!Kp*30TrDLL]W`SL]ET$H\_ceCjhIGOo^_%I?I,S@q]F`CNFW8L^IX* -ARfLsF_upAP%p/ZL^K;[Ou$QUEas#uAWgMY&s>D)@UX:eDe*F8&X#dsBOt[hF*2>U0TlI"D0mp -FGA2#8/nAC4@:EYcF*(i#CLq$C@:V`=ARfLDBkM.%N\X1D@rHC.ARfg)7oM,b6t(1G6=FmW;fl -GXCLq$!@q]F`CER/%B5)H1E,ol?Bk1dc0/%?SBldisEcQ)=P!=AX<.0p/L_>lIOuS6t@UX:eDe -*FBH'1.C&S#Kc@r$..D29m/!Kq[\@UX:eDe*FB5*@^?E-,f4DKCgDA8c@-A9)+&FE2M8P'CnaF -D5Z2F,gH:DfT]'FH-TIFCAZpARpsK04Am6F!+q#Eas#uAKYo1FD5Z2F"]1W@<>pe@<-:'DJ>7u -Ou$NeB60(8DfBf:E-,f4DKCtc@<-"%+CoD.FC]E#GEQnu061WAD..O,Bm>e?Ou[rR%[&V$A79R -g@UX:uFCAZpARpr`P%64gCG'+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5 -GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/databarstacked 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarstacked 0.0 2015050900 67872 71029 +%%BeginData: 73 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /databaromni dup /uk.co.terryburton.bwipp findresource put +begin +/databarstacked { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Validate the input + barcode 0 4 getinterval (\(01\)) ne { + /bwipp.databarstackedBadAI (GS1 DataBar Stacked must begin with (01) application identifier) //raiseerror exec + } if + barcode length 17 ne barcode length 18 ne and { + /bwipp.databarstackedBadLength (GS1 DataBar Stacked must be 13 or 14 digits) //raiseerror exec + } if + barcode 4 barcode length 4 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.databarstackedBadCharacter (GS1 DataBar Stacked must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 18 eq { + barcode 17 get checksum 48 add ne { + /bwipp.databarstackedBadCheckDigit (Incorrect GS1 DataBar Stacked check digit provided) //raiseerror exec + } if + } if + 18 string + dup 0 barcode putinterval + dup 17 checksum 48 add put + /barcode exch def + + % Get the result of encoding with databaromni with format=stacked + options (dontdraw) true put + options (format) (stacked) put + + /args barcode options //databaromni exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/databarstacked dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarstacked-- @@ -1711,39 +5070,81 @@ GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstackedomni 0.0 0 0 0 -%%BeginData: 31 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4aVtcOu8C3Df Bf4D f 0W CP ,i2 'Ci a0N4 aW>WI -?IQm30Ia6V33Qn! BlU*FE 2M8 P !+/ T/ Wr;\ Fcn qO1OXV5/Tc #UAWeitP#Zp -nAWe*t3A5;iFD5Z 2F-8_M 1OY E cDfB f4Df 0WC Ou%NL8Rc+K @rGmhL]E56P -"^l=-nmA)P&5P!@ WuO*E% Y[0 FCAW eEcZ >2@ r#XdDf'B+6 =FCj8WHS:;_ -]C_@<>pE@<*JhFC AZpAR loZD /O&uB l[cp FD5 Z2@;I''F`V XI@V'1dDBO. -;FD)dF0JP"!@;p1 %Bk(R nBl@l 3Bk1d mFD 5?$ATBFWEa `['AS#n&DfV -"*I?IQ=@<,jrA7^ p5L_5ee @UX:eD e*FB@ YbY [D3>$K04K- >E,[F?@<>pe -@<-F2@:O(aA8c=&BgQ6=9P&*SFD-[r7oM,b6t(1G6=FmW;flGXCLq$!:Mju`A8-'q@ruF'DII? -(D09oA+C\n)0f'qjEZd(n+Co2!BlnDL061K8F(Jp'Ec5u]5CJ\o@UX:eDe*F8"Cbe[@rGmhP%' -4MP,XUE,[F?@<>pe@<-F2@:O(aA8c=&BgQ6=6YKnK@:OCjEf -N7P;_]C_@<>pE@<*JhFCAZpARloZD/O&uBl[cpFD5Z2@;I''F`VXI@rH7,@;0U%Df0B:+Co2!B -lnDL061K8F(Jp'Ec5u]5CJ\oI?I/T@q]F`CNFW8L]ESoL]E53L^\V`Bp(ZC1G<6OARfLsF_r72 -BOt[hF*2=B@UX:eDe*E%BnunT!Kp*30TrDLL]W`SL]ET$H\_ceCjhIGOo^_%I?I,S@q]F`CNFW -8L^IX*ARfLsF_upAP%p/ZL^K;[Ou$QUEas#uAWgMY&s>D)@UX:eDe*F8&X#dsBOt[hF*2>U0Tl -I"D0mpFGA2#8/nAC4@:EYcF*(i#CLq$pD/O&S@:V`=ARfLDBkM.%N^?lIOuS6t@UX:eDe*FBH'1.C&S#Kc@r$..D29m/!Kq[\@UX:eDe*FB5*@^? -E-,f4DKCgDA8c@-A9)+&FE2M8P'CnaFD5Z2F,gH:DfT]'FH-`MFCAZpARo^rDJ>8Y04Am6F!+q -#Eas#uAKYo1FD5Z2F"]1W@<>pe@<-:'DJ>7uOu$NeB60(8DfBf:E-,f4DKCtc@<-"%+CoD.FC] -E#GEQnu061WAD..O,Bm>e?Ou[rR%[&V$A79Rg@UX:uFCAZpARo^rDJ>7nP%64gCG'+8/p(ZFEd -;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P -#M~> -% uk.co.terryburton.bwipp/databarstackedomni 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarstackedomni 0.0 2015050900 67972 71109 +%%BeginData: 73 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /databaromni dup /uk.co.terryburton.bwipp findresource put +begin +/databarstackedomni { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Validate the input + barcode 0 4 getinterval (\(01\)) ne { + /bwipp.databarstackedomniBadAI (GS1 DataBar Stacked Omnidirectional must begin with (01) application identifier) //raiseerror exec + } if + barcode length 17 ne barcode length 18 ne and { + /bwipp.databarstackedomniBadLength (GS1 DataBar Stacked Omnidirectional must be 13 or 14 digits) //raiseerror exec + } if + barcode 4 barcode length 4 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.databarstackedomniBadCharacter (GS1 DataBar Stacked Omnidirectional must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 18 eq { + barcode 17 get checksum 48 add ne { + /bwipp.databarstackedomniBadCheckDigit (Incorrect GS1 DataBar Stacked Omnidirectional check digit provided) //raiseerror exec + } if + } if + 18 string + dup 0 barcode putinterval + dup 17 checksum 48 add put + /barcode exch def + + % Get the result of encoding with databaromni with format=stackedomni + options (dontdraw) true put + options (format) (stackedomni) put + + /args barcode options //databaromni exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/databarstackedomni dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarstackedomni-- @@ -1754,37 +5155,81 @@ E#GEQnu061WAD..O,Bm>e?Ou[rR%[&V$A79Rg@UX:uFCAZpARo^rDJ>7nP%64gCG'+8/p(ZFEd % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databartruncated 0.0 0 0 0 -%%BeginData: 29 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\KFD 5Z2F * j( NA moL sAW f3'P !FGY< -0B5(@ZmRN0oc8tP )XR(F_ -_! H ]ft D5 *C&O 5*@ ^MH]ft&Eck rV1OYEdI?J0 -)*g/N:DfBf4Df0W Z5*@^M P#Q @ =FD5 Z2F* j'+ I?I02@<,jr A7^PsL]il7N -W^aa0e&9&HS8iPB lJ#DA7 9Rg @UX; !Ecl 80@ pE@<*JiEcl80@< ?'k+D l7BF `3F*&O6AKW]`+E)9C0f1"`BkM.%F"]1e@;0doATD -g0EfrY8P#Pn!Eas#uAV^Iu@<,jrA7^p5L]im?P"^4c3/B8OAs,?63Kd4%EdKHKGA2#8/nAC4@: -EYcFE2MA@psIjA3s^86YKnK@:OCjEfMbB;_]C_@<>pE@<*JiEcl80@E,[F?@<>pe@<-I1F`(\tFCeuL@:V`=ARfLDBkM.%N\j=F@rHC.AR -fg)7oM,b6t(1G6=FmW<-!,!@psIjA0>AqARfKuA8,[jF%3/A/VBOt[hF*2>U0TlI"GVpe@<-:'DJ>7uOu$NeB60(8DfBf:E-,f4DKCtc@<-"%+CoD.FC]E#GEQnu061 -WACh[cu@<.N1Ou[rR%[&V$A79Rg@UX;!Ecl80@ -% uk.co.terryburton.bwipp/databartruncated 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databartruncated 0.0 2015050900 67898 71045 +%%BeginData: 73 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /databaromni dup /uk.co.terryburton.bwipp findresource put +begin +/databartruncated { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Validate the input + barcode 0 4 getinterval (\(01\)) ne { + /bwipp.databartruncatedBadAI (GS1 DataBar Truncated must begin with (01) application identifier) //raiseerror exec + } if + barcode length 17 ne barcode length 18 ne and { + /bwipp.databartruncatedBadLength (GS1 DataBar Truncated must be 13 or 14 digits) //raiseerror exec + } if + barcode 4 barcode length 4 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.databartruncatedBadCharacter (GS1 DataBar Truncated must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 18 eq { + barcode 17 get checksum 48 add ne { + /bwipp.databartruncatedBadCheckDigit (Incorrect GS1 DataBar Truncated check digit provided) //raiseerror exec + } if + } if + 18 string + dup 0 barcode putinterval + dup 17 checksum 48 add put + /barcode exch def + + % Get the result of encoding with databaromni with format=truncated + options (dontdraw) true put + options (format) (truncated) put + + /args barcode options //databaromni exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/databartruncated dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databartruncated-- @@ -1795,82 +5240,284 @@ WACh[cu@<.N1Ou[rR%[&V$A79Rg@UX;!Ecl80@DP!5%OP !5$bI= %,/ F E2M 8O u%NL B" -HlH="=PrY.?\Op0 4K->E, [F? @<>p e@<- 0uD /"*'A3s^85 tR)$7oM,b6t -(1G6=FmW9PJ?XFC eu*D0 9oA+ C\npB l5&; Bln #2-nmA)+CT 5.Ch[BfFD5Z -2+DG@tDKKT)Bk;< <061K 8F(Jp 'Ec5u ]5C J\o@UX:eDe *FB@YbVZD.6 -po@rGmhP%'4[P&6 ?bHS8iP BlJ#DA 79Rg@ UX: nBl.R+ARn, 9A5$QPB67gI -.nGYpDfQsT1a$=CB5)I/0/%?SBldisEcQ)=P!=A -X<+99V@rGmhL]il6OuS7OP%Kk@LbY&hP&bn&@WuO*E%Y[0FCAWeEboH,Blmos6=FD'FCB336tp -:JFH.h@;_]C_@<>pE@<*JaBl.R+ARlp#F`VXI@V'1dDBO.;FD)dN+E)9C0eY2#@;0doATDg0Ef -rY8P#Pn!Eas#uAV^M!@<,jrA7^p5L]rs@P"^4c3/B8OAs,?63Kd4%EdKHKGA2#8/nAC4@:EYcC -h[a#FCeuL@:V`=@<,ddFCfKQ/4WVn+@KX[@7"CC+A?KdBlmos+Dl7BFE,[F?@<>pe@<-:'DJ;FGA4($A@r"JHB5)IJ1.c@nDfTl0@rrh`;_]C_@<>pE@ -<*JaBl.R+ARlonBOt[h+Co2!BlkJ:Ec6,8A7]:)061K8F(Jp'Ec5u]5CJ\oI?IQc&sB)S3/@QD -@<,jrA7^pLOuS70@q]F`CNFW8LbOtmP'AWh@<,jrA7^ofOu"b#Bl8*&C`lq)@UX:eDe*F8"GdM -M9RDRLP,Wkm8R7K8Ch[d&@:s.u05P??CNa-&+BsX'L]E53L]rS8L]`G8L]rS:L]N;3L^AkA?'7 -""!/LYbBl8*&Cm&7`!KsF/056S5Ou$Q]DK]H)+DDs-Bl8*&C`mGT95J<[CNa-&+DI!3Oo^_jI? -I-LP#O)VG]Y';@<,jrA7^p5OpR:-L]E53@UX:eDe*FB@Yb&JWI$:4P!5$bFEhmMBcpV&@UX:eD -e*E%BnueQ9S`\)!0.&8!*tb4I?I,SDI[^6L]W_WP,X6=Or9EpH]gR@P#R5 -M#WW%H]i3$!KpQ@"-QcL@=*e2P$!lFP!4[&Oo^_0I?IQXP"9qU!KpQ@"-QcL:j\?jI?IQc!KpQ -J;Na5"!KmJH5(/T*P!5%OP!5%OI?G)'1G+D#b[WF]n%!g7A_WFB:VL]W`UOo^CHZ!\`5*DmVGESq]!KsEnC`m1qEg!DX"-TX$@ra5=G%# -3M5&>CNCm"g^1OYEW06;;FC`meB@;I'&G%#20AS`Ju@<.O1L]N[MA -Trq2Oo^_%05Y-=CERJ&F)-R4@UX;?&!Cmp"HkQhP%?:i@;I'0@;I'-G%#3M!Ko5lDJ^M6D'3D6 -P,XU#Dfp.E@UX:"ATs;^I?I->F`\a;Ckr+TWGZR9G]._HI?G)'1Pc$e!Jh,1056S5Ou$Q]DK]H -)+DHW4Oo^@?Or9EU@VK_'@;I'#P"UH.*k?odC5<4[Cm"g^G[bB)G%#20Bcpl!DK]H)+DI!3KE* -((K9B,qG^Y`G04Zg\@VK_'@;L`.P"UH.*k?odC6CA^Bl8*&CkrLU!g4Fa98!9d\V$&CP'AWj0o -,gm1GOu"b*L]ESoHXniRFCAW62E)amP"UsHHZW\*1, -_'6BnueQ!JguD9RD2N8M=U/FCgV!Ou"b%0m%>s5*@]TA2.qFAWf6?1G<8nD0Ko]5*@]TA2.Y3A -Wf6?1G<8nASc:J5*@]TA2._+Cm3DGAi9BAmoLsAKYVsFAc%9GA1T0BQK=m04Ze]AKYM<+Cm3>F- -gGASc9-A28"GDhnX1@;L!r+D58-;H$M9IH2GC -+b$8RsT#H[V&K?'6us@q]F`CNj?(B4uC.+BsX&L]`G>L`;.ILd?h/LbjiPL^o4jLa@imLdHn3L -cgIpL^&YJLc1&\Lae-(L^f.fL`D4MLe:s91G<6OARfLsAT8hsL]E53Lb!h#P":B\LbsoJLd-[r -LdHH:P":C#L]N<-H[V&JLf0%XL]N51JpVp/8;7+tL&d3h!JUT;H[V&JL&fYX!JUU-H[V&JL&g" -`!Bc/=L&jPdI?I-U!CDMA6\YV2L&k.WOu"b$BOt[hF*2>U!0T-o!/LZ3)ga5PP!5$b04S[,@r$ -..D'3>%ARfLsF_r7FBk2=!F!,1[94MXH@r$:"BkM+$F!,1[99O+S!Ko6eP"769BOt[hF*2=B@q -]F`CNFW8LfomUOu"b4AT8i&BOt[hF(K>6@q]F`CNFW8P"Uro06;>OA9;L++EM+6L_Z(NL^8e=L -^%I"Cia/1B4Z0_;c@mSA9;L+Ou"b#GA1T0BQG;;ATq]YrF!+[0F -(03R@Yb&J!Jgf?;L=3"I?K4g06DG\+EVjM06CcMFEh51BkM=D#%M4^FCfJGDfBe@DfBf4Df0V= -5!C*"Df0Z-Eaa0TE%`kbASu -% uk.co.terryburton.bwipp/databarlimited 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarlimited 0.0 2015050900 83260 86093 +%%BeginData: 276 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/databarlimited { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /height 10 72 div def + /linkage false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + + % Validate the input + barcode 0 4 getinterval (\(01\)) ne { + /bwipp.databarlimitedBadAI (GS1 DataBar Limited must begin with (01) application identifier) //raiseerror exec + } if + barcode length 17 ne barcode length 18 ne and { + /bwipp.databarlimitedBadLength (GS1 DataBar Limited must be 13 or 14 digits) //raiseerror exec + } if + barcode 4 get dup 48 lt exch 49 gt or { + /bwipp.databarlimitedBadStartDigit (GS1 DataBar Limited must begin with 0 or 1) //raiseerror exec + } if + barcode 5 barcode length 5 sub getinterval { + dup 48 lt exch 57 gt or { + /bwipp.databarlimitedBadCharacter (GS1 DataBar Limited must contain only digits) //raiseerror exec + } if + } forall + + % Calculate checksum and add to end of barcode + /checksum 0 def + 0 1 12 { + /i exch def + /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + barcode length 18 eq { + barcode 17 get checksum 48 add ne { + /bwipp.databaromniBadCheckDigit (Incorrect GS1 DataBar Limited check digit provided) //raiseerror exec + } if + } if + 18 string + dup 0 barcode putinterval + dup 17 checksum 48 add put + /barcode exch def + + % Strip the AI and optional check digit + /binval [ + barcode 4 13 getinterval {48 sub} forall + ] def + linkage { + /linkval [ 2 0 1 5 1 3 3 5 3 1 0 9 6 ] def + 0 1 binval length 1 sub { + /i exch def + binval i binval i get linkval i get add put + } for + } if + + % Create the human readable text + /txt barcode length array def + 0 1 barcode length 1 sub { + /i exch def + txt i [barcode i 1 getinterval 0 0 () 0] put + } for + + /ncr { % n r + 2 copy sub 2 copy lt {exch} if % n r maxd mind + 1 1 5 3 roll % mind j=1 v=1 n maxd + 1 add -1 exch { % mind j v n -1 maxd+1 + mul % mind j v*i + 1 index 3 index le { + 1 index idiv exch 1 add exch + } if + } for + { % mind j v + 1 index 3 index gt {exit} if + 1 index idiv exch 1 add exch + } loop + exch pop exch pop + } bind def + + /getRSSwidths { + /oe exch def + /el exch def + /mw exch def + /nm exch def + /val exch def + /out el array def + /mask 0 def + 0 1 el 2 sub { + /bar exch def + /ew 1 def + /mask mask 1 bar bitshift or def { + /sval nm ew sub 1 sub el bar sub 2 sub ncr def + oe mask 0 eq and nm ew sub el 2 mul sub bar 2 mul add -2 ge and { + /sval sval nm ew sub el sub bar add el bar sub 2 sub ncr sub def + } if + el bar sub 2 gt { + /lval 0 def + nm ew sub el sub bar add 2 add -1 mw 1 add { + nm exch sub ew sub 1 sub el bar sub 3 sub ncr + /lval exch lval add def + } for + /sval sval lval el bar sub 1 sub mul sub def + } { + nm ew sub mw gt {/sval sval 1 sub def} if + } ifelse + /val val sval sub def + val 0 lt {exit} if + /ew ew 1 add def + /mask mask 1 bar bitshift not and def + } loop + /val val sval add def + /nm nm ew sub def + out bar ew put + } for + out el 1 sub nm put + out + } bind def + + 0 1 11 { + /i exch def + binval i 1 add 2 copy get binval i get 2013571 mod 10 mul add put + binval i binval i get 2013571 idiv put + } for + /d2 binval 12 get 2013571 mod def + binval 12 2 copy get 2013571 idiv put + + /d1 0 def + /i true def + 0 1 12 { + /j exch def + binval j get + dup 0 eq i and { + pop + } { + /i false def + /d1 d1 3 -1 roll 10 12 j sub exp cvi mul add def + } ifelse + } for + + /tab267 [ + 183063 0 17 9 6 3 6538 28 + 820063 183064 13 13 5 4 875 728 + 1000775 820064 9 17 3 6 28 6454 + 1491020 1000776 15 11 5 4 2415 203 + 1979844 1491021 11 15 4 5 203 2408 + 1996938 1979845 19 7 8 1 17094 1 + 2013570 1996939 7 19 1 8 1 16632 + ] def + + /i 0 def { + d1 tab267 i get le { + tab267 i 1 add 7 getinterval {} forall + /d1te exch def /d1to exch def + /d1mwe exch def /d1mwo exch def + /d1ele exch def /d1elo exch def + /d1gs exch def + exit + } if + /i i 8 add def + } loop + + /i 0 def { + d2 tab267 i get le { + tab267 i 1 add 7 getinterval {} forall + /d2te exch def /d2to exch def + /d2mwe exch def /d2mwo exch def + /d2ele exch def /d2elo exch def + /d2gs exch def + exit + } if + /i i 8 add def + } loop + + /d1wo d1 d1gs sub d1te idiv d1elo d1mwo 7 false getRSSwidths def + /d1we d1 d1gs sub d1te mod d1ele d1mwe 7 true getRSSwidths def + /d2wo d2 d2gs sub d2te idiv d2elo d2mwo 7 false getRSSwidths def + /d2we d2 d2gs sub d2te mod d2ele d2mwe 7 true getRSSwidths def + + /d1w 14 array def + 0 1 6 { + /i exch def + d1w i 2 mul d1wo i get put + d1w i 2 mul 1 add d1we i get put + } for + + /d2w 14 array def + 0 1 6 { + /i exch def + d2w i 2 mul d2wo i get put + d2w i 2 mul 1 add d2we i get put + } for + + /widths [ + d1w {} forall + d2w {} forall + ] def + + /checkweights [ + 1 3 9 27 81 65 17 51 64 14 42 37 22 66 + 20 60 2 6 18 54 73 41 34 13 39 28 84 74 + ] def + + /checkseq [ + 0 1 43 {} for + 45 52 57 + 63 1 66 {} for + 73 1 79 {} for + 82 + 126 1 130 {} for + 132 + 141 1 146 {} for + 210 1 217 {} for + 220 + 316 1 320 {} for + 322 323 + 326 337 + ] def + + /checksum 0 def + 0 1 27 { + /i exch def + /checksum checksum widths i get checkweights i get mul add def + } for + /checksum checksum 89 mod def + /seq checkseq checksum get def + /swidths seq 21 idiv 8 3 6 false getRSSwidths def + /bwidths seq 21 mod 8 3 6 false getRSSwidths def + + /checkwidths [0 0 0 0 0 0 0 0 0 0 0 0 1 1] def + 0 1 5 { + /i exch def + checkwidths i 2 mul swidths i get put + checkwidths i 2 mul 1 add bwidths i get put + } for + + /sbs [ + 1 d1w {} forall checkwidths {} forall d2w {} forall 1 1 + ] def + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt txt + /textxalign (center) + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/databarlimited dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarlimited-- @@ -1881,327 +5528,1146 @@ drB75qB~> % --EXAM: (01)95012345678903(3103)000123 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarexpanded 0.0 0 0 0 -%%BeginData: 204 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\e #06 -M%_@rEuAATDg:@W c^5Df .1: GA2 # 8P1 l(D Ops 'T@<>p e@ <,q(E+ *Wp -ARp.D'Tt>:%52X= FD5Z2 F-8 _M1 G< 3G Eas #uA Wf6?1G <9 WDKKE0 @KFD5Z2F*j( -NAmoLsAWf3'P!FG Y<0B5( @Zm R N0oc 8tP) XR( F_-_!H]ftD 5*C&O5*@^MH -]ft&EckrV1OYEdI ?J0)*g /N: DfBf 4Df0 WZ5 *@^MP#Q@=F D5Z2F*j'+I? -I/TBOtmjBQPA1AS GdjFH S;?1 GOo[4NP!5$bP')pIL]E55P"_#iDfp/b5&,l -SP,XU.P'E-LP%'4LP,X6>P!5%&I=%,:Dfp/b5&-6EP'N4"C6ATNC6CcD1N.DXL]D1Q9ThYhP#Z -pnAUT^OOu"b"BlbD$+C1-d04AR<@;L`$Ou8CY@UX:eDe*FB30Ia,!KsF5*H] -gXBP#RGB.?][RFcnqOFcnqK!@X+jH]gRUFcnqE",Hu@LOFN0!/L`5!Kr4dP#Y^/@;0eG!g7\h) -i+QY!KpPj04AR9P!5$b@;0mnCkr1L!Kr4LG]7)/A_bd1Qjna"FFQkG%#3I!\c?l98ES(!Kp-:!BH<+@;0mnClSWS0ebDH99Li -\J,b[?Op$,l">DPa0P4a0F(LM"I?IQXP#Qjm<+0K^P%'4KP!+/#Blf(1P"Uf:0JS_R@;0e=!Kp -*9">_ee16Oe`"FFQkG%#3I!\c?l98ES(!Kp-:!BH<+@;0mnClSWS1,(JH99Li\-P)AKOp$,l"> -DPa0kOj1F(LM"I?IQXP#Qjm<+0K^P%'4KP!+/#Blf(1P"Uf:0JS_R@;0e=!Kp*9">_ee1Qjna" -FFQkG%#3I!\c?l98ES(!Kp-:!BH<+@;0mnClSWS1,(MI99Li\=RVD]Op$,l">DPa0kOj1F(LM" -I?IQXP#Qjm<+0K^P%'S6L]W`&P!4[(P!+tKHS8fA1GLS.+D,%uF(L(7*/FWM$mg7V$A\hJV33N -@Blf(2P"Us$P&bu68H\`#b"HoUE0O\[:L]NZ3P!+tKI?I --a1LY!=P%'4LP!+.F@;01ZA0>u7F_)\"NWLpiNWLpkNWLpmNWLpo?$d]&Blf(3P"UsTOp$2r8W -klXHS8fA@UWdiAmoLsAWeitP#Yq)F,0gZ99''-0p4\.BeqItGT^F/1GUY/P&c]g@;01ZA -XAWf<,P#Qjm<.0p/@;0eG@Yb)K8p`4"Beqb*GT^U,Cia0B%pFbiL(@R:L^Jq@P,4XAWf<,P%?:ZE -+WNpCi=N\5*@]TD.Rg&De,"pOu"b$Df0_Q13@Fk0RJg.0JG170JG170JG170JG170JG170JG17 -0JG170JG170JG170JG17La\F_Or9&WOr9&UL^K;=P!4[%L]`f6Ot;CjL^KP,4P"_#iL]WA>P,4/2/b30JG170JG170JG170JG170JG170 -JG170JG170JG170JG170JG170Sh9CV32^P!g4FW!/Lc@9ThSq!/LZ=9Tgr_!f-uBV33Nq30Ia, -"Hks3WKKH.H'1.C",Qu?LPPte%$F:oDf0_Q13@Fk0Sfjp5*C2>Oq*X206D,ABl89\V33g$@Yb& -JWJCP;5)96&5'r(dP$!l2LbP!:I?I-a3/@Zms,r.n!f-o@=H[-VV33Nq30Ia,!g6ZK@Zip9I471GDPa0TnSG04SO)Lc:KnOu$TYAr$Fq -Bm*p$NWLmhP"UT3L^]G?@rH7.0f!ih1bb)<@q92--t-h5@;Lr,1GLR>P"UrhL_"TG@VK_CGqWZ -DPa0p4\H04S -O)Lc:KnOu$TYAr$FqBm*p$NWLmhP"UT3L^]G?@rH7.0f!ih1bb)<@;0e=!Kp*9">_ee16OeI@; -0mnClSWS1,(JH99Li^%s2`!Bl8?G+CSu-@;Lr,1GUX?P"UrhL*mOq!Jh8.DdmEuI?IT?A7gugL -a\EMP'J]jA7crg+CeqoH\aA=WI9q$?'6usB5hH*>9I471G<0NF!+[0?'7!lP#Q:0FD,T'P%'4P -P!+.F@q92-9Tl681Ljs-L]CjtG%#3I!\c?l98EV)%$F:oDf0_Q13@Fk0Tp^;#*PgG3/@QCBlf( -2P"UT5L]NZ4P'N3M@;0mnC`m/#F,0j[99Mr(!JgoB9S`_45*C2S/;P!^DdmEu+CeqoP!4[MP!5 - %S@;0eG@Yb,L4aUUOG%#20@;0e=!g63>99M8j!/L]>9Tgr]!J$>LP!5$gL]WA6P"_#iL]N[9IEdAp]=f -P,Wkm8R7K805#69+BosoOu"b"BlbD$+C1-dI?IQHATVU(A<$gI0ek@9P!+.F@q92-.[$Wk1Ljs --L]CjtG%#3I!\c?l98EV)%$F:oDf0_Q13@Fk0Tp]kA7gWG@;0e=!Kp*3",Hu@9Tgr_!d&?iBl9 -)Z04SO)+BosuA7g1E0TrD`P"ArB1G9I?gG%#2 -0@;0e=!Kp*=99M8t@Yb,LWJCY>5*ATdI?I0-Ou"b"BlbD*Blf(3@;0eG@Yb)KWKKr<1OYEcB5h -HkCi"$6HS9PYAr$MO$'I)mHS9PYAft;#?'7!lP#X/DBkD((ARpT5Ou8CY>DN98!Jgl*I?I-,H] -A.]0SfdnV32^Z30H7W!Jgo8s,r.n0TlI"G[Y;uBm=3"L]`G6P)#3FI?I0+L^T">L_P2aP":BFL -`_ERLa7=qP":BX?$hA7L]Wa9Ot`%Y@;0=fG\(EA",Hu@LQZn1P"@<=DIYDWs,o/kCi4B4ATDKp -M#NPn05P'5E+iZtF_t]1Bk)ttOu"b-Ble2N1cC0fOu"b/F_t]1Bk&8J4GWun!JkrHOuSI'0JJ: -aP,4Fr?H@(f7L^0*BL^/$?@VK_.P":BPNX.?o0eb=90JJ;,NX.?o0eb=90JSA0L]N;bH] -g@C!6(*%L^8*@@VK_.P":BiL]N;rH]g@C!5"BpL^8*@@VK_.P":C9NX.?o0ekC:0enJ,NX.?o0 -ekC;0JI<\F_t]1Bk*/*0JG1s@;Kmr@;^4)ATDKpNWh*j0eb:F5*@^X!/LYaBlfGHL]N[EV0sI?I0-P'N3MB5hIG@UWu6@Zgb8@;I&jP!45@P"ArBGqWfLAs,?@1MI -t?BlfGHL]N[;pL]E54P"_$HP&QQeHY7;0P%'4JOo^^POuS6tB5hIGH'1."E+ -Y8BAo;*5P'AWmE+Y7sOu%NL<.0p#061W@@VKq*H]g@E%$EN3&<\T#%$GF_0Sfdn)3STYP!4;W< -0DBe3/A!+;Na"\AS5jkDKKr_C5;nR4aVtcOo^@IP&-:FP')2"P')29Ou"b&DI[Tq -AUBS"061KFP&5Q/5*AQeH]iN"P#Y_L5'r)>P,Wkm8R7K=P%'S9IQtAs-VML]DjdK89M`s':dD04A[9BOPe$D.Ra%@rc^0F!+ -[0B5hIG@XEn2I?K5=!*taD05b?GFD5f72Dd=1DJXS@>9IQtAs-VML]DjdK8(`a?'7!VE+Y8BL] -N[P"UrtAo;*5P!+/TFbj@PP#RThI?IQIF_t]1Bk*;i -P$iWSF_t]1Bk)1+DK?q7+Du==ATDKpEcl8@+DHW5Oo^_=L]W_?P'DD%DKTf-EbT$(F`)7CBnub -PG^Y`TOuQldE+iZtF_t]1Bk*;iP$iWFCiF&rDKTf-EbT$(F`)7CBcpi#E+iZtF_t]1Bk)1+DK? -q7L]NY>P"UT3Oo^_jI=#C=E+iZtF_t]1Bk)1+DK?q7L]ET_I?ITn3,*GP2Dd=T5*B<:5%/8HBO -Pe$D.Ra%A!0$=@$5Jl"FG#tG][Y@D`0F1Df0B:+DHW3P'DD%DIn'7Ble2N1cB8iCj@.;+Dtb8F -D5f72Dd=1DJXS@BnueQ!Kp*3!KmJHG^Y`TI?I,SB5hHoDI\D$r/qAL1G$t3skBOPe$D.Ra%A!/X2 -5^eep061W@L^](?Oo]E2FD,T'P%'RTG&1cR@Zgb%A7h!6Oo]<\!HMag@VKq*Ou%,iD28=X8oeK -[L^'#NOp$,l"u%_b0JG2:#*PgG)2J95ASmT(OuR)nAftfN98G6aWJCV3"HoUE0TnDY@Yb/M5*D -n.5*C1EEaa/7ASu!rA7[E.+DHW4Oo^_%P!FGBL]Wa9OuS6tB5hH*Bp),PG`k%B!Jk'FG]%Y@AT -DKp+D#G#De*E4Bcq,G!KmJH1Qk"OP#Zpn#B"[$ATDKpOu&7dI?IQP!4;WAWf6?FcnqOFa]D_Ou"b(ATUgK;g2qdFD,`B05kEb5*@]TASdMnOu"b.GEP.Q1 -GDI[]?Cj'6'P -!3]*@;M)-Ou%NL82#%-@;I'-G%#20Cj'6'+D#@3@UX;?WJCS -HS9G`@;I'-G%#3C!KsFF1OYEcI?IS`G%#20G%#20F*:u.P,XU#G%#3C!0Ur@P!FGY<%hg,+D#b -Q!KmJH1G9P'CnfFFB;^Ou"b5@:CrM1a$"W!F(?[L^](CL^ -/_;Lf]B8L';@I!F1EfL^/_>L]iMjL_PROK8'PGL^8eCL]iM;L`V@/L(BK&$\XWM99O+ -S!I^,%Ou"b+L]ESoHXn7@@:CrM1a$Or99N_1FCAW52`)XlL]NY>L^0):H[V&K04]09P!5$b04] -0CP!5$b04\pDAWf6?1G<9UGAiX.Ou"b%ASbq@5*@]TA7]RqP!5$b04\^:P!5$bP!FGY<%hu/C5 -<.Y!Ko6eP%?:WGAeU7+Co,+P,Vu6AWfr%ASc9-A8QO/L]hg?F_)\.ATUgK;g2qdFD,`Y1G<9_A -KYM+A7otHWFU*^P%nN=Ch4`"D0KQI"D2(YF(HJ,ATUgK;g2qdFD,`Y1G<9_L^9.MOu%?=!g7;S -!0TKlL]E53L]_uWC6CcD1Lt]c#AT%rP&-;\A9Vr7C6D5QG[u#S#&8qqP&-;\A9VT-C6D5QG^Y` -GI=$bML]N;6HS9,s5*@^4G9CXV!g7A1GAeU=P"Us_A9T/2L]W`UL]NY>A9VT-C6D5QG^Y`GI?I -T@G]t9T+Co\ZG^Y`G04np9A7]e*Bk2=!F!+\C!Jh#;"Gd)7!Jgc4!Jgl7#`&M;",I/;"Gd)7!J -gc4!Jgl7#)EA;",I)9#)E;9!Jgc4!Jgr9"Gd/9",I#7#`&M;!Jgc4!Jh#;!f-r7!f.&:"c*28! -Jgc4!Jgo8#)E>:!f-o6$&AVp*@-!/L`5 -!aQpQL]E57L]WA;>p*@-!/Lr;!f.);"C3-SL]E5;L]WA;L^&YC>p*@-!/Lr;!f.);#`&kE$=+c -YL]E53L]WA7L]iM;L^&Y?>p*@-!/LZ3!f-r7"Gd5;#)ESA#[JQWL]E53L]WA7L]iM;L^&YAL^J -qG>p*@-!/LZ3!f-r7"Gd;=#)ESA#`&kE$=+c[Ou"b4AT8i)Bl7HmEcYf3+Cno&@;KLmL]Wa=L] -W`;P"Uro04oHQ+E M+6P% 'R\Ou %moL] MR .EK Xde!Ks F/06iXD -Ou$]pG9D,QAnc-n ATE !/A9; L++EM +6 +F' &BL ]rrX -L]rr8P'DD<82"Id ARfM" AS GdjFE 8R/M #W ;2M #W;2M #W; 2M#W; 2LeW -\5L`hLNL`;-VL]` G6L_P Y-L &eT :G(p !X L^/ _NLd-U oc %Z5GL& d0g -FbhE$%>FkFL&eoA !5XBi SVT "T! 0 `3P LcL 1iX ,'u7!/ -. ZLfK00 WJ1 -DlL&d$a!4mtML&e c=!/6 .-] S6E HL ]i MBL a7d mLbacf L` M:JLgc # K[L& e<2? AM+ -!f/7Z!1JW B^kb71!2>9- -L_>LJLj4XSQ&$<6 98F(6 .YrP .!2kP OYD* %tL &fPU7>Mb9: 5BgE:P`Y>@Y -ds=-AZ\s!/$"+[Y TGL]N[P%nN9FCAusDMSCXWJ1E%P&-9^Ou"b*L]ESoHXg`#@r$..D'3q/@PKeu+DI! -3P$r]Z@:CrM1a$Lg!KmJ>#Ehc-I?I/T@ru:F5*@]T@ruXP5*@]T@r6F$P!5$b04SjCDj!;I1G< -6LCh8bnOu"b$ASc:J5*@]T@qTkG5*@^b5^eep052PCL^9.EOu%NLAM7P;D]iP'ARfLsF_r72B6 -068@ru:F;Ia9SD]iP,GAi9?FE2M8+D58-;H$MpoASrW3AS5jkDKK -r_2NeW7/D0mpW@WNZ4Dg-8Y!0U!<30Ia,!KsFDN<9!/LYd@<>poAT! -;)P,Wd]Bp(ZC1Lt`S+DI!3H[V&KBnuhRC5;kQ4aUdcG9CUU!g6HE97))M8UZb$I?I-W!Jgb^Ou -#3_061WA0/%?WDJX$)ARTU4F(025F(02D@VBg*>9IurF-:!g!KmJ>!g6H.BOtmjBQSZcK3^->@ -WNYr+EM"5P%'4JOo^@?P#?X_!.C#_>q^,8FP"U.X!I^,`I?IQXP":`TOpR9Z061uTP!5$bP'&F!AT/br+EDCEH\_]c5*DmnP"ArB1NR,HL] -CY8!/LW2!/LV\P'M+[E$01>GEQEk"Ho`gL]E52L]E52?'9IdAnc-nATDa.F!+\C'8U+G^G5HI?K4gOuS6tF(K<3+Du==Ec6/CL]N[H\_ZX!I^,`?&/K"Bm=lc9Th2QAT3G*>DN98!/LW2!*tb5F( -K;5E+sQAL]im?>DN98!/LW2!*tb505tWMF!+\C!/LYnF_u/;GB8Q@P,Wd]EfrVL1NJ9OP&5PeA -T2]5Efs(Y!g7\SP#R5]HZF%KF!,Ld99K@>Fa]F*EZf7BD/sQ=F,0j[WKM+FF(K<3+EEWGV=#MG^1E -NBm=]^@W6%+G`krXBOtmjBQPA9Bm=]^@W6%+G`ks\8D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP -'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/databarexpanded 0.0 0 -%%EndData -%%EndResource -% --END ENCODER databarexpanded-- +%%BeginResource: uk.co.terryburton.bwipp databarexpanded 0.0 2015050900 197224 210202 +%%BeginData: 871 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databarexpanded { -% --BEGIN ENCODER databarexpandedstacked-- -% --REQUIRES preamble raiseerror renlinear renmatrix databarexpanded-- -% --DESC: GS1 DataBar Expanded Stacked -% --EXAM: (01)95012345678903(3103)000123 -% --EXOP: segments=4 -% --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarexpandedstacked 0.0 0 0 0 -%%BeginData: 18 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4a VtcO u 8C 3D fBf 4Df 0WCP ,i2'C -ia0N4aW>WI?IQm3 0Ia6V3 3Qn ! BlU *F E2M8 P!+ /T/Wr;\Fcn qO1OXV5/Tc# -UAWeitP#ZpnAWe* t3A5;i FD5 Z 2F-8 _M1O YEc DfBf4Df0WC Ou%NL8T/QiB -l@m1NX006DKKE0@ *c@<-"%NWX3 =FDl, ?Bl@m 1P'CD UB6 ,2+Df0Z-Ea a0TE%`kbASu -?nFE2)?P#RT)I?G )'1G<9I FCAWeE b0K7@ ;]U eA92j$@r#X dOuSV806M%_ -@rEuAATDg:@Wc^5Df.1:GA2#8+Co%qBl7L&ATMd4Ear[DFcna -% uk.co.terryburton.bwipp/databarexpandedstacked 0.0 0 -%%EndData -%%EndResource -% --END ENCODER databarexpandedstacked-- + 20 dict begin % Confine variables to local scope -% --BEGIN ENCODER pharmacode-- -% --REQUIRES preamble raiseerror renlinear-- -% --DESC: Pharmaceutical Binary Code -% --EXAM: 117480 -% --EXOP: showborder -% --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp pharmacode 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\/FD --OrJ,fS,5W*MVP& -:;D f Bf 4D f0W ZY: js=E bTE(F -Eqh:P!+/J!Ko='% <$3-Bl @m1 H ]kF A@ ;L!r P!+ /T5^eepOuS V6P,4OA9; K-F*D>/FD-g -jOu$QUEas#uAWgM Y!Kq& (@<,j rA7^p 5L^ '#=P&bn&@W uO*E%Z*C@<- -3n@rGmh6=FCuASu .&BT=33 BOPpu@ :O4dA KYi 4F*&O6AKW] MFDi9[+Co2! -BlnDL061K8F(Jp'Ec5u]5CJ\o@UX:eDe*F+OuS7OP%Kk@LcLVpP&bn&@WuO*E%Z*C@<-3n@rGm -h6=FClBOPpi@ru:&N[%A6@<-3n@rGmh+Dl7BFE,[FKBOPpu@:O4dAO9g9L]WAEP,4L]W`;H\_ZMP(R$nFEhmMFEhm\FCf]=G[YE&B5W_6@qBP"ATBG -BE-*4@E-,f4DK?pa4s4BSDKKE0@<[lR0/%?WDJX$)ARTVB<0B7iOq*X205tT5Ec#5pDe*FB30I -f*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP' -(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/pharmacode 0.0 0 -%%EndData -%%EndResource -% --END ENCODER pharmacode-- + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string -% --BEGIN ENCODER pharmacode2-- -% --REQUIRES preamble raiseerror renlinear-- -% --DESC: Two-track Pharmacode -% --EXAM: 117480 -% --EXOP: includetext showborder -% --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp pharmacode2 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4a Vtc Ou 8C 3Df Bf4 Df0 WCP, -i2'Cia0N4aW>WI? IQm3 0 Ia 6V 33Q n!B lU*F E2M8P -!+/T/Wr;\FcnqO1 OXV5/T c#U A Wei tP #Zpn AWe *t3A5;iFD5 Z2F-8_M1OYE -cDfBf4Df0WCOu%N L8M=ag BkM + $+D> >#B4 uCM 09S,#@<,jr A7^p5L]NZN@ -UX:eDe*FB@Yb;Q: m,jG04 K-> E,[F KBOP pu@ :O4dAMQS\A 5$QPB67gI.T -CV1/Tc#A@r!2`BO Ppu@: O4dA KYi4F *&O6 AKW ]MFDi9[+Co 2!BlnDL061K -8F(Jp'Ec5u]5CJ\ o@UX: eDe*F +OuS7 OP% Kk@LcLVpP& bn&@WuO*E%Z -*C@<-3n@rGmh11F [&6YKnK @:OCjE fM_NG Af' TEa`Hn+Ac` [Ec#5pDe*E% -D09oA+Cf>-FCAm$+E).6Gp$X3B5)I/0/%?SBldisEcQ)=P!=AX<.0p$@UX:eDe*FB/WI?IQQ@;L`%P%p.>>DNB;!Jge_P!5%%G%#3M5*Dn$"-QP8G%#3M5*@^5DI[ -a0EZf'=>DN?:!/LY]L]iP6P)#2nP'AWo+DHW4P,XU#I?J.pASu"!FE/L8DI[a0EZf(P!KmJ>%r - %3+P"_#pL]E53ASu"!FE3ORL]N[q^;EF%`IG]\1=Ch[ -O"NWs!)DKKH106CcMFEqe:AohO*L]fALE-*4@E-,f4DK?pa4s4BSDKKE0@<[lR0/%?WDJX$)AR -TVB<0B7iOq*X205tT5Ec#5pDe*E7OuSV806M%_@rEuAATDg:@Wc^5Df.1:GA2#8+Co%qBl7L&A -TMd4Ear[DFcna -% uk.co.terryburton.bwipp/pharmacode2 0.0 0 -%%EndData + /dontdraw false def + /height 34 72 div def + /format (expanded) def + /segments -1 def + /linkage false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + /segments segments cvi def + + segments -1 eq { + /segments format (expandedstacked) eq {4} {22} ifelse def + } if + + % Expand ordinals of the form ^NNN to ASCII + /expand { + /in exch def + /out in length string def + /j 0 def + in + { % loop + (^) search { + dup out exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi out exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup out exch j exch putinterval + length j add /j exch def + out 0 j getinterval exit + } ifelse + } loop + } bind def + + % Parse out AIs + /ais [] def + /aival 2 dict def + barcode dup length 1 sub 1 exch getinterval + { % loop + dup () eq {exit} if + (\)) search pop + exch pop + exch (\() search { + exch pop exch 3 1 roll + } { + () 3 1 roll + } ifelse + [ ais aload pop counttomark 2 add index ] /ais exch def + aival 3 1 roll expand put + } loop + pop + + % Method selection + { % common exit + + % (01)9...(3103)... + ais length 2 eq { + ais 0 get (01) eq ais 1 get (3103) eq and { + aival (01) get 0 1 getinterval (9) eq aival (3103) get cvi 32767 le and { + (0100) false exit + } if + } if + } if + + % (01)9...(3202)... + ais length 2 eq { + ais 0 get (01) eq ais 1 get (3202) eq and { + aival (01) get 0 1 getinterval (9) eq aival (3202) get cvi 9999 le and { + (0101) false exit + } if + } if + } if + + % (01)9...(3203)... + ais length 2 eq { + ais 0 get (01) eq ais 1 get (3203) eq and { + aival (01) get 0 1 getinterval (9) eq aival (3203) get cvi 22767 le and { + (0101) false exit + } if + } if + } if + + % (01)9...(310x/320x)...[(11/13/15/17)...] + ais length dup 2 eq exch 3 eq or { + /ai310x false 3100 1 3109 {10 4 string cvrs ais 1 get eq or} for def + /ai320x false 3200 1 3209 {10 4 string cvrs ais 1 get eq or} for def + ais length 3 eq { + /aibad true [ (11) (13) (15) (17) ] {ais 2 get ne and} forall def + } { + /aibad false def + } ifelse + ais 0 get (01) eq ai310x ai320x or and aibad not and { + ais length 3 eq { + aival (01) get 0 1 getinterval (9) eq + aival ais 1 get get cvi 99999 le and + aival ais 2 get get cvi 999999 le and { + ai310x ais 2 get (11) eq and { (0111000) false exit } if + ai320x ais 2 get (11) eq and { (0111001) false exit } if + ai310x ais 2 get (13) eq and { (0111010) false exit } if + ai320x ais 2 get (13) eq and { (0111011) false exit } if + ai310x ais 2 get (15) eq and { (0111100) false exit } if + ai320x ais 2 get (15) eq and { (0111101) false exit } if + ai310x ais 2 get (17) eq and { (0111110) false exit } if + ai320x ais 2 get (17) eq and { (0111111) false exit } if + } if + } { + aival (01) get 0 1 getinterval (9) eq + aival ais 1 get get cvi 99999 le and { + ai310x { (0111000) false exit } if + ai320x { (0111001) false exit } if + } if + } ifelse + } if + } if + + % (01)9...(392x)... + ais length 2 ge { + /ai392x false 3920 1 3923 {10 4 string cvrs ais 1 get eq or} for def + ais 0 get (01) eq ai392x and { + aival (01) get 0 1 getinterval (9) eq { (01100) true exit } if + } if + } if + + % (01)9...(393x)... + ais length 2 ge { + /ai393x false 3930 1 3933 {10 4 string cvrs ais 1 get eq or} for def + ais 0 get (01) eq ai393x and { + aival (01) get 0 1 getinterval (9) eq { (01101) true exit } if + } if + } if + + % (01)... + ais 0 get (01) eq { (1) true exit } if + + % Freeform + (00) true exit + + } loop + /gpfallow exch def + /method exch def + + /conv12to40 { + (0000000000000000000000000000000000000000) 40 string copy + 2 copy 0 10 getinterval exch 0 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval + 2 copy 10 10 getinterval exch 3 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval + 2 copy 20 10 getinterval exch 6 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval + 2 copy 30 10 getinterval exch 9 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval + exch pop + } bind def + + /conv13to44 { + (00000000000000000000000000000000000000000000) 44 string copy + 2 copy 0 4 getinterval exch 0 1 getinterval cvi 2 4 string cvrs dup length 4 exch sub exch putinterval + dup 3 -1 roll 1 12 getinterval conv12to40 4 exch putinterval + } bind def + + /tobin { + string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } bind def + + method (00) eq { + /cdf [] def + /gpf [] def + } if + + method (1) eq { + /cdf aival (01) get 0 13 getinterval conv13to44 def + /cdf [ cdf {48 sub} forall ] def + /gpf [] def + /ais ais 1 ais length 1 sub getinterval def + } if + + method (0100) eq { + /cdf 55 string def + cdf 0 aival (01) get 1 12 getinterval conv12to40 putinterval + cdf 40 aival (3103) get cvi 15 tobin putinterval + /cdf [ cdf {48 sub} forall ] def + /gpf [] def + /ais [] def + } if + + method (0101) eq { + /cdf 55 string def + cdf 0 aival (01) get 1 12 getinterval conv12to40 putinterval + ais 1 get (3202) eq { + aival (3202) get cvi 15 tobin + } { + aival (3203) get cvi 10000 add 15 tobin + } ifelse + cdf exch 40 exch putinterval + /cdf [ cdf {48 sub} forall ] def + /gpf [] def + /ais [] def + } if + + method length 7 eq { + /cdf 76 string def + cdf 0 aival (01) get 1 12 getinterval conv12to40 putinterval + 6 string dup 0 ais 1 get 3 1 getinterval putinterval + dup aival ais 1 get get 1 5 getinterval 1 exch putinterval cvi 20 tobin + cdf exch 40 exch putinterval + ais length 3 eq { + aival ais 2 get get + dup 0 2 getinterval cvi 384 mul exch + dup 2 2 getinterval cvi 1 sub 32 mul exch + 4 2 getinterval cvi add add + } { + 38400 + } ifelse + 16 tobin cdf exch 60 exch putinterval + /cdf [ cdf {48 sub} forall ] def + /gpf [] def + /ais [] def + } if + + method (01100) eq { + /cdf 42 string def + cdf 0 aival (01) get 1 12 getinterval conv12to40 putinterval + cdf 40 ais 1 get 3 1 getinterval cvi 2 tobin putinterval + /cdf [ cdf {48 sub} forall ] def + /gpf [ aival ais 1 get get {} forall ] def + /ais ais 2 ais length 2 sub getinterval def + } if + + method (01101) eq { + /cdf 52 string def + cdf 0 aival (01) get 1 12 getinterval conv12to40 putinterval + cdf 40 ais 1 get 3 1 getinterval cvi 2 tobin putinterval + cdf 42 aival ais 1 get get 0 3 getinterval cvi 10 tobin putinterval + /cdf [ cdf {48 sub} forall ] def + /gpf [ aival ais 1 get get dup length 3 sub 3 exch getinterval {} forall ] def + /ais ais 2 ais length 2 sub getinterval def + } if + + % Variable length symbol field + gpfallow { + /vlf 2 array def + } { + /vlf [] def + } ifelse + + % Pre-defined fixed length data field AIs + % any AI whose prefix is not included in this table must be + % terminated with "FNC1", even if it's fixed length + /aifixed 23 dict def + [ + 0 1 4 {} for + ] { + (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put + } forall + [ + 11 1 20 {} for + 23 + 31 1 36 {} for + 41 + ] { + 10 2 string cvrs dup aifixed 3 1 roll put + } forall + + /fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def + + /numeric << + 0 1 119 { + dup (00) 2 string copy dup 3 -1 roll 11 2 string cvrs + dup length 2 exch sub exch putinterval + dup 0 get 65 eq {dup 0 94 put} if + dup 1 get 65 eq {dup 1 94 put} if + exch 8 add + (0000000) 7 string copy dup 3 -1 roll 2 7 string cvrs + dup length 7 exch sub exch putinterval + } for + lalphanumeric (0000) + >> def + + /alphanumeric << + 48 1 57 {dup 43 sub 5 tobin} for + fnc1 (01111) + 65 1 90 {dup 33 sub 6 tobin} for + 42 (111010) + 44 1 47 {dup 15 add 6 tobin} for + lnumeric (000) + liso646 (00100) + >> def + + /iso646 << + 48 1 57 {dup 43 sub 5 tobin} for + fnc1 (01111) + 65 1 90 {dup 1 sub 7 tobin} for + 97 1 122 {dup 7 sub 7 tobin} for + 33 (11101000) + 34 (11101001) + 37 1 47 {dup 197 add 8 tobin} for + 58 1 63 {dup 187 add 8 tobin} for + 95 (11111011) + 32 (11111100) + lnumeric (000) + lalphanumeric (00100) + >> def + + % Append the remaining AI data + 0 1 ais length 1 sub { + /i exch def + /ai ais i get def + /val aival ai get def + gpf length ai length add val length add array + dup 0 gpf putinterval + dup gpf length ai [ exch {} forall ] putinterval + dup gpf length ai length add val [ exch {} forall ] putinterval + /gpf exch def + i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + gpf length 1 add array + dup 0 gpf putinterval + dup gpf length fnc1 put + /gpf exch def + } if + } for + + % Calculate the number of bits remaining to the next valid symbol size + /rembits { + dup + 12 div ceiling cvi 12 mul % Round up to multiple of 12 + 48 2 copy lt {exch} if pop % At least 4 symbols + dup 12 idiv dup segments mod 1 eq { % At least 2 symbols on last row of stacked symbol + 1 add 12 mul exch pop + } { + pop + } ifelse + exch sub + } bind def + + /encode { + dup /raw ne {exch get} {pop} ifelse + [ exch {48 sub} forall ] + dup length exch + gpfenc exch j exch putinterval + /j exch j add def + } bind def + + % Pre-compute alphanumeric and numeric runlengths and position of next ISO646-only characters + /numericruns [ gpf length {0} repeat 0 -1 ] def + /alphanumericruns [ gpf length {0} repeat 0 ] def + /nextiso646only [ gpf length {0} repeat 9999 ] def + gpf length 1 sub -1 0 { + /i exch def + gpf i get + (00) 2 string copy + dup 0 gpf i get dup fnc1 eq {pop 94} if put + i gpf length 1 sub lt {dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put} if + numeric exch known { + numericruns i numericruns i 2 add get 2 add put + } { + numericruns i 0 put + } ifelse + dup alphanumeric exch known { + alphanumericruns i alphanumericruns i 1 add get 1 add put + } { + alphanumericruns i 0 put + } ifelse + dup iso646 exch known exch alphanumeric exch known not and { + nextiso646only i 0 put + } { + nextiso646only i nextiso646only i 1 add get 1 add put + } ifelse + } for + + % Encode the general purpose field + /gpfenc 252 array def + /i 0 def /j 0 def /mode (numeric) def + { % loop + i gpf length eq {exit} if + { % not a loop but common exit point + + mode (numeric) eq { + i gpf length 2 sub le { + 2 string + dup 0 gpf i get dup fnc1 eq {pop 94} if put + dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put + dup numeric exch known { + numeric encode + /i i 2 add def + exit + } if + pop + lalphanumeric numeric encode + /mode (alphanumeric) def + exit + } { + gpf i get dup 48 lt exch 57 gt or { + lalphanumeric numeric encode + /mode (alphanumeric) def + exit + } if + /rem 12 1 add method length add vlf length add cdf length add j add rembits def + rem 4 ge rem 6 le and { % C1 + 1 into 4 to 6 bits + (000000) 6 string copy 0 rem getinterval + dup gpf i get 47 sub 2 4 string cvrs + dup length 4 exch sub exch putinterval /raw encode + /i i 1 add def + exit + } { % C1.FNC1 + 2 string dup 0 gpf i get put dup 1 94 put numeric encode + /i i 1 add def + exit + } ifelse + } ifelse + } if + + mode (alphanumeric) eq { + gpf i get fnc1 eq { + fnc1 alphanumeric encode + /mode (numeric) def + /i i 1 add def + exit + } if + gpf i get dup iso646 exch known exch alphanumeric exch known not and { + liso646 alphanumeric encode + /mode (iso646) def + exit + } if + numericruns i get 6 ge { + lnumeric alphanumeric encode + /mode (numeric) def + exit + } if + numericruns i get dup 4 ge exch i add gpf length eq and { + lnumeric alphanumeric encode + /mode (numeric) def + exit + } if + gpf i get alphanumeric encode + /i i 1 add def + exit + } if + + mode (iso646) eq { + gpf i get fnc1 eq { + fnc1 iso646 encode + /mode (numeric) def + /i i 1 add def + exit + } if + numericruns i get 4 ge nextiso646only i get 10 ge and { + lnumeric iso646 encode + /mode (numeric) def + exit + } if + alphanumericruns i get 5 ge nextiso646only i get 10 ge and { + lalphanumeric iso646 encode + /mode (alphanumeric) def + exit + } if + gpf i get iso646 encode + /i i 1 add def + exit + } if + + } loop + } loop + /gpf gpfenc 0 j getinterval def + + % Complete the variable length field and create pad + 1 12 add method length add vlf length add cdf length add gpf length add + dup rembits dup array /pad exch def + vlf length 0 ne { + add 12 idiv + dup 2 mod vlf exch 0 exch put + 14 le {0} {1} ifelse vlf exch 1 exch put + } { + pop pop + } ifelse + pad length 0 gt { + 0 5 pad length 1 sub { % Fill with 00100 + /i exch def + pad i [ 0 0 1 0 0 ] 0 pad length i sub 5 2 copy gt {exch} if pop getinterval putinterval + } for + mode (numeric) eq { % Prefix shift from numeric to ASCII + /pad [ 0 0 0 0 pad aload pop ] 0 pad length getinterval def + } if + } if + + % Concatinate fields + /binval [ + linkage {1} {0} ifelse + method {48 sub} forall + vlf aload pop + cdf aload pop + gpf aload pop + pad aload pop + ] def + /datalen binval length 12 idiv def + + /ncr { % n r + 2 copy sub 2 copy lt {exch} if % n r maxd mind + 1 1 5 3 roll % mind j=1 v=1 n maxd + 1 add -1 exch { % mind j v n -1 maxd+1 + mul % mind j v*i + 1 index 3 index le { + 1 index idiv exch 1 add exch + } if + } for + { % mind j v + 1 index 3 index gt {exit} if + 1 index idiv exch 1 add exch + } loop + exch pop exch pop + } bind def + + /getRSSwidths { + /oe exch def + /el exch def + /mw exch def + /nm exch def + /val exch def + /out el array def + /mask 0 def + 0 1 el 2 sub { + /bar exch def + /ew 1 def + /mask mask 1 bar bitshift or def { + /sval nm ew sub 1 sub el bar sub 2 sub ncr def + oe mask 0 eq and nm ew sub el 2 mul sub bar 2 mul add -2 ge and { + /sval sval nm ew sub el sub bar add el bar sub 2 sub ncr sub def + } if + el bar sub 2 gt { + /lval 0 def + nm ew sub el sub bar add 2 add -1 mw 1 add { + nm exch sub ew sub 1 sub el bar sub 3 sub ncr + /lval exch lval add def + } for + /sval sval lval el bar sub 1 sub mul sub def + } { + nm ew sub mw gt {/sval sval 1 sub def} if + } ifelse + /val val sval sub def + val 0 lt {exit} if + /ew ew 1 add def + /mask mask 1 bar bitshift not and def + } loop + /val val sval add def + /nm nm ew sub def + out bar ew put + } for + out el 1 sub nm put + out + } bind def + + /tab174 [ + 347 0 12 5 7 2 87 4 + 1387 348 10 7 5 4 52 20 + 2947 1388 8 9 4 5 30 52 + 3987 2948 6 11 3 6 10 104 + 4191 3988 4 13 1 8 1 204 + ] def + + /dxw datalen array def + + 0 1 datalen 1 sub { + + /x exch def + + /d binval x 12 mul 12 getinterval def + /d 0 0 1 11 {/j exch def 2 11 j sub exp cvi d j get mul add} for def + + /j 0 def { + d tab174 j get le { + tab174 j 1 add 7 getinterval {} forall + /dte exch def /dto exch def + /dmwe exch def /dmwo exch def + /dele exch def /delo exch def + /dgs exch def + exit + } if + /j j 8 add def + } loop + + /dwo d dgs sub dte idiv delo dmwo 4 true getRSSwidths def + /dwe d dgs sub dte mod dele dmwe 4 false getRSSwidths def + + /dw 8 array def + x 2 mod 0 eq { + 0 1 3 { + /j exch def + dw 7 j 2 mul sub dwo j get put + dw 6 j 2 mul sub dwe j get put + } for + } { + 0 1 3 { + /j exch def + dw j 2 mul dwo j get put + dw j 2 mul 1 add dwe j get put + } for + } ifelse + + dxw x dw put + + } for + + /finderwidths [ + 1 8 4 1 1 1 1 4 8 1 + 3 6 4 1 1 1 1 4 6 3 + 3 4 6 1 1 1 1 6 4 3 + 3 2 8 1 1 1 1 8 2 3 + 2 6 5 1 1 1 1 5 6 2 + 2 2 9 1 1 1 1 9 2 2 + ] def + + /finderseq [ + [0 1] + [0 3 2] + [0 5 2 7] + [0 9 2 7 4] + [0 9 2 7 6 11] + [0 9 2 7 8 11 10] + [0 1 2 3 4 5 6 7] + [0 1 2 3 4 5 6 9 8] + [0 1 2 3 4 5 6 9 10 11] + [0 1 2 3 4 7 6 9 8 11 10] + ] def + + /seq finderseq datalen 2 sub 2 idiv get def + /fxw seq length array def + 0 1 seq length 1 sub { + /x exch def + fxw x finderwidths seq x get 5 mul 5 getinterval put + } for + + /checkweights [ + -1 -1 -1 -1 -1 -1 -1 -1 % A1L + 77 96 32 81 27 9 3 1 % A1R + 20 60 180 118 143 7 21 63 % A2L + 205 209 140 117 39 13 145 189 % A2R + 193 157 49 147 19 57 171 91 % B1L + 132 44 85 169 197 136 186 62 % B1R + 185 133 188 142 4 12 36 108 % B2L + 50 87 29 80 97 173 128 113 % B2R + 150 28 84 41 123 158 52 156 % C1L + 166 196 206 139 187 203 138 46 % C1R + 76 17 51 153 37 111 122 155 % C2L + 146 119 110 107 106 176 129 43 % C2R + 16 48 144 10 30 90 59 177 % D1L + 164 125 112 178 200 137 116 109 % D1R + 70 210 208 202 184 130 179 115 % D2L + 190 204 68 93 31 151 191 134 % D2R + 148 22 66 198 172 94 71 2 % E1L + 40 154 192 64 162 54 18 6 % E1R + 120 149 25 75 14 42 126 167 % E2L + 175 199 207 69 23 78 26 79 % E2R + 103 98 83 38 114 131 182 124 % F1L + 159 53 88 170 127 183 61 161 % F1R + 55 165 73 8 24 72 5 15 % F2L + 89 100 174 58 160 194 135 45 % F2R + ] def + + /checkweightseq [ + seq {16 mul checkweights exch 16 getinterval aload pop} forall + ] dup length 8 sub 8 exch getinterval def + + /widths [ + dxw {{} forall} forall + ] def + + /checksum 0 def + 0 1 widths length 1 sub { + /i exch def + /checksum checksum widths i get checkweightseq i get mul add def + } for + /checksum checksum 211 mod datalen 3 sub 211 mul add def + + /i 0 def { + checksum tab174 i get le { + tab174 i 1 add 7 getinterval {} forall + /cte exch def /cto exch def + /cmwe exch def /cmwo exch def + /cele exch def /celo exch def + /cgs exch def + exit + } if + /i i 8 add def + } loop + + /cwo checksum cgs sub cte idiv celo cmwo 4 true getRSSwidths def + /cwe checksum cgs sub cte mod cele cmwe 4 false getRSSwidths def + + /cw 8 array def + 0 1 3 { + /i exch def + cw i 2 mul cwo i get put + cw i 2 mul 1 add cwe i get put + } for + + 22 array dup dup + 0 cw put 1 dxw putinterval 0 datalen 1 add getinterval + /dxw exch def + /datalen dxw length def + + % Encode row runlengths + /rows datalen segments div ceiling cvi array def + /numrows rows length def + 0 1 numrows 1 sub { + /r exch def + mark + segments 4 mod 0 ne r 2 mod 1 eq and {0} if + 1 1 + 0 1 segments 1 sub { + /pos exch r segments mul add def + pos datalen lt { + dxw pos get {} forall + pos 2 mod 0 eq {fxw pos 2 idiv get {} forall} if + } if + } for + 1 1 + counttomark array astore rows exch r exch put pop + } for + + format (expandedstacked) ne { % Linear + + % Remove leading space + /sbs rows 0 get dup length 1 sub 1 exch getinterval def + + /sbs [ + 1 + 0 1 datalen 1 sub { + /i exch def + dxw i get {} forall + i 2 mod 0 eq {fxw i 2 idiv get {} forall} if + } for + 1 1 + ] def + + << + /ren //renlinear + /sbs sbs + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /opt options + >> + + dontdraw not //renlinear if + + } { % expandedstacked + + /seps numrows array def + 0 1 numrows 1 sub { + + /r exch def + /row rows r get def + + % Sample runlengths into bitmap + mark + 0 2 row length 1 sub { + /i exch def + row i get {0} repeat + i row length 1 sub lt {row i 1 add get {1} repeat} if + } for + counttomark array astore /row exch def pop + + % Derive the separator pattern + /sep [ row {1 exch sub} forall ] def + sep 0 [ 0 0 0 0 ] putinterval + sep row length 4 sub [ 0 0 0 0 ] putinterval + /finderpos [ % Finder pattern module positions + 19 98 row length 13 sub {} for + 68 98 row length 13 sub {} for + ] def + finderpos { + dup 14 add 1 exch { + /i exch def + row i get 0 eq { + row i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + } forall + + % For even segment-pair symbols reverse alternate rows + segments 4 mod 0 eq r 2 mod 1 eq and { + rows r get length rows 0 get length ne % Except partial width last row + finderpos length 2 mod 1 eq and { % with odd finders + /row [ 0 row aload pop ] def + /sep [ 0 sep aload pop ] def + } { + row length 1 sub -1 0 {row exch get} for + row astore pop + sep length 1 sub -1 0 {sep exch get} for + sep astore pop + } ifelse + } if + + rows r row put + seps r sep put + + } for + + % Extend last row and separator to fill width of symbol + /pixx rows 0 get length def + [ pixx {0} repeat ] dup 0 rows numrows 1 sub get putinterval + rows exch numrows 1 sub exch put + [ pixx {0} repeat ] dup 0 seps numrows 1 sub get putinterval + seps exch numrows 1 sub exch put + + % Middle separator pattern + /sep [ pixx 2 idiv 1 add { 0 1 } repeat ] 0 pixx getinterval def + sep 0 [0 0 0 0] putinterval + sep pixx 4 sub [0 0 0 0] putinterval + + % Compose the symbol + /pixs [ + 0 1 numrows 1 sub { + /r exch def + r 0 ne { + seps r get aload pop + } if + 34 {rows r get aload pop} repeat + r numrows 1 sub ne { + seps r get aload pop + sep aload pop + } if + } for + ] def + + << + /ren //renmatrix + /pixs pixs + /pixx pixx + /pixy pixs length pixx idiv + /height pixs length pixx idiv 72 div + /width pixx 72 div + /opt options + >> + + dontdraw not //renmatrix if + + } ifelse + + end + +} bind def +/databarexpanded dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER databarexpanded-- + +% --BEGIN ENCODER databarexpandedstacked-- +% --REQUIRES preamble raiseerror renlinear renmatrix databarexpanded-- +% --DESC: GS1 DataBar Expanded Stacked +% --EXAM: (01)95012345678903(3103)000123 +% --EXOP: segments=4 +% --RNDR: renlinear renmatrix +%%BeginResource: uk.co.terryburton.bwipp databarexpandedstacked 0.0 2015050900 63589 66857 +%%BeginData: 43 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /databarexpanded dup /uk.co.terryburton.bwipp findresource put +begin +/databarexpandedstacked { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Get the result of encoding with databarexpanded with format=expandedstacked + options (dontdraw) true put + options (format) (expandedstacked) put + + /args barcode options //databarexpanded exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/databarexpandedstacked dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER databarexpandedstacked-- + +% --BEGIN ENCODER pharmacode-- +% --REQUIRES preamble raiseerror renlinear-- +% --DESC: Pharmaceutical Binary Code +% --EXAM: 117480 +% --EXOP: showborder +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp pharmacode 0.0 2015050900 60269 60124 +%%BeginData: 91 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/pharmacode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /height 8 2.835 mul 72 div def + /nwidth 0.5 2.835 mul def + /wwidth 1.5 2.835 mul def + /swidth 1.0 2.835 mul def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + /nwidth nwidth cvr def + /wwidth wwidth cvr def + /swidth swidth cvr def + + % Validate the input + barcode length 1 lt barcode length 6 gt or { + /bwipp.pharmacodeBadLength (Pharmacode must be 1 to 6 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.pharmacodeBadCharacter (Pharmacode must contain only digits) //raiseerror exec + } if + } forall + barcode cvi dup 3 lt exch 131070 gt or { + /bwipp.pharmacodeBadValue (Pharmacode value must be between 3 and 131070) //raiseerror exec + } if + + % Create the human readable text + /txt barcode length array def + 0 1 barcode length 1 sub { + /i exch def + txt i [barcode i 1 getinterval 0 0 () 0] put + } for + + % Convert the integer into the paramacode string + /barcode barcode cvi 1 add 2 17 string cvrs def + /barcode barcode 1 barcode length 1 sub getinterval def + + /barlen barcode length def % Length of the code + /sbs barlen 2 mul array def + + 0 1 barlen 1 sub { + /i exch def + /enc barcode i 1 getinterval def + enc (0) eq { + sbs i 2 mul nwidth put + } { + sbs i 2 mul wwidth put + } ifelse + sbs i 2 mul 1 add swidth put + } for + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt txt + /textxalign (center) + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/pharmacode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER pharmacode-- + +% --BEGIN ENCODER pharmacode2-- +% --REQUIRES preamble raiseerror renlinear-- +% --DESC: Two-track Pharmacode +% --EXAM: 117480 +% --EXOP: includetext showborder +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp pharmacode2 0.0 2015050900 60956 60646 +%%BeginData: 96 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/pharmacode2 { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /height 4 def % Height of short bars in millimetres + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + + % Validate the input + barcode length 1 lt barcode length 8 gt or { + /bwipp.pharmacode2BadLength (Two-track Pharmacode must be 1 to 6 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.pharmacode2badCharacter (Two-track Pharmacode must contain only digits) //raiseerror exec + } if + } forall + barcode cvi dup 4 lt exch 64570080 gt or { + /bwipp.pharmacode2badValue (Two-track Pharmacode value must be between 4 and 64570080) //raiseerror exec + } if + + % Create the human readable text + /txt barcode length array def + 0 1 barcode length 1 sub { + /i exch def + txt i [barcode i 1 getinterval 0 0 () 0] put + } for + + /encstr 16 string def + /bhs 16 array def + /bbs 16 array def + /sbs 32 array def + /bar 1 25.4 div height mul def % bar height (mm) + /spc 1 25.4 div 72 mul def % bar width & spacing (1mm) + + % Convert number into a base3 representation + /i 15 def + /val barcode cvi def + { % loop + val 0 eq {exit} if + val 3 mod dup + [3 1 2] exch get val exch sub 3 idiv /val exch def + encstr i [2 0 1] 4 -1 roll get put + /i i 1 sub def + } loop + /encstr encstr i 1 add 15 i sub getinterval def + + % Generate the bar pattern + 0 1 encstr length 1 sub { + /i exch def + encstr i get dup + bhs i bar [1 1 2] 5 -1 roll get mul put + bbs i [0 bar 0] 4 -1 roll get put + } for + + % Return the arguments + << + /ren //renlinear + /bhs bhs + /bbs bbs + /sbs [encstr length 2 mul {spc} repeat] + /txt txt + /textxalign (center) + /textyoffset 4 + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/pharmacode2 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData %%EndResource % --END ENCODER pharmacode2-- @@ -2209,131 +6675,665 @@ TMd4Ear[DFcna % --REQUIRES preamble raiseerror renlinear-- % --DESC: Code 25 % --EXAM: 01234567 -% --EXOP: version=iata includetext includecheck includecheckintext +% --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code2of5 0.0 0 0 0 -%%BeginData: 52 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\Am oLsA W ei &F Cf] =Ao DR/O iNV@0 -6CcMFE;/BAV^\V1 GDP! -5%OP!5$bI=%,/FE 2M8Ou %NL< IL$AO rfcH 05k fOBl@m1P!5 $bI?IQJE-,f -4DKC/f1OYEX06Cc MFCoH /F5FCf -]=F(or3OtVtS06C cMFEqe: AohO*+ EV1>F Eqe :AohO*OtVt S05+p2B4uB0 -BOtmjBQTCjOu$QUEas#uAUBS"LbP!(P!4[^P#.<^HS8iPBlJ#D@rGmh12gb^@UWe7BOPpi@ru: -&NZ^]-A7Zl=2'?aYF*&O7Df0Z*Bl5&3DJXS@A8,[jFE9)gEa`['AS#n&DfV"*I?IQXP"@<9@<- -0qDBNCsEas#uAWgMG@;KXg@U!0T-o!/LYb@<-0qDM -S=VWI$:4P!5$b04S[,@r$..D'3>%ARfLsF_r71@<,jrA7ZltP"UTbP,Vo!Ebo<)+DI"E,[F>De*E7De:k9@:V`=ARfL -DBkM.%N[@>8@rHC.ARfg)6Z6LH+>Pes@q]F`CER/%B5)H1E,ol?Bk1dc0/%?SBldisEcQ)=P!= -AX<%h]hEas#uAKYGjEas#uAV^=q@<-0qDN[\V1GE0%F0ekC=0f(O=0ocSs0ekC;0ekC=0ocSq0f(O=0ekC=0ocSs0 -f(O=0ekC;0ocSq0ekC=0ekC=0ocSs0ekC=0ekC;0ocSq0f(O?0ekC;0ocSq0ekC;0f(O?0ocSs -0ekC;0f(O=0ocSq0f(O=0f(O=0ocGo0f(O=0ocDn0ekC=>q]o#FC?:rNX@Kq0ekI=1GLU=NX@Q -s0ekC;0ekI=NX@Kq1GLU=0ekI=NX@Qs1GLU=0ekC;NX@Kq0ekI=0ekI=NX@Qs0ekI=0ekC;NX@ -Kq1GL[?0ekC;NX@Kq0ekC;1GL[?NX@Qs0ekC;1GLU=NX@Kq1GLU=1GLU=NW_'k0en[j1GLUiO_ -@sZ"u.hg1GLVE"u@tg0f(PE"u.ng0f(PE"uA%i0ekDC"u.hg0f(PE"u@ti0ekDC"u.ni0ekDC" -u.he1G^bG"u@tg1GLVE"u.ng1GLVE"u@tg0ekDC"Z%kf0elre@rH:)+Bsj11G^a?0en[m0ekC= -1GOmo0ekI=1GOmo0ekI?0en[m0f(O=1GOmo0f(O?0en[m0f(U?0en[m1GLU=1GOmo1GLU?0en[ -m1GL[?0en[k1GL[?NWV!l1L2YE@<>poDeEco+Bsj10ekI?0en[m1GLU=1GOmo0f(O=1GOmo1G^ -a?0en[m0ekI=1GOmo1GL[?0en[m0f(U?0en[m0ekC=1GOmo1GLU?0en[m0f(O?0en[k0ekC;NW -V'l0jPnc5*@^FATDj+Df0V=G%G]8Bl@mP@$5JU04K->E,[F>De*E7De:k9@:WDMEcYr5DN5]:D -K9;uDeEs%F(Jl)6Z6LH+>PesG%G]8Bl@lB061K8F(Jp'Ec5u]5CJ\o04f$2F!,X;EcYr5DK?qD -ATDj+Df1_2Ou"b$F!,%3@rmG+P"UsIOu"b$GDH61DI[aD!0U!%LbP!kOo]uo8Wkk_F)rI8DI[a -N30Ia,!g9OG99NbI1GI?IQ>F-:?\F-6QFF-6QeV33VfFE -hmM@UX:nASrW)DI[L*A7]7aARfM&L]NY>I?IQm$'I)c@WR>*ASu"!L^K;9IB`Eas#uAKY]C!Kp,j+CfVYCiaf -`!H_mtFEqe:AohO*+EV1>FCoH/F_99ORA@WNZ$@<-0qDBNG1P&+WLOo]WFOo]-3@rmG6P" -Us`Bl7EsF_#&nBOt[hBl8$(G]\9TFEhmM@UX:nASrVp+C\c"@q]:kF!+t+ARfLsF_up8P"]=nE -bo<)+CfVYCiaf`!H_mtFEqe:AohO*+EV1>FCoH/F5?'9G\P#ZpWF(02 -5@UX:nASrW#F-:?\F-6Q8DI[aD$^+/GH$tiU4?P9;ASs.SEb0-)Bl7KjE\DKCF!+[0F(03;LbP -!kI?I0-04JU9+Bot0@WR]AL]NY>L]W`;HY?u)B4uC8P(R$n@UaC$>9IurF-:!g!KmJ>!g6H.L] -DjdK3]U6DI[L*A7]joG]\9cFEhmMFEhnUP#O)QE-*4@E-,f4DK?pa4s4BSDKKE0@<[lR0/%?WD -JX$)ARTVB<0B7iOq*X204Sp2AMS1923Kq^A1r(@/n8fPFCfK5H"(o:FDl%L@WuO*E$/\&Anc-o -Eb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> -% uk.co.terryburton.bwipp/code2of5 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code2of5 0.0 2015050900 67430 67109 +%%BeginData: 150 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code2of5 { + + 20 dict begin % Confine variable to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def + /validatecheck false def + /includetext false def % Enable/disable text + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /version (industrial) def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Validate input + barcode { + dup 48 lt exch 57 gt or { + /bwipp.code2of5badCharacter (Code 25 must contain only digits) //raiseerror exec + } if + } forall + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 0 def + 0 1 barlen 1 sub { + /i exch def + /checksum checksum barcode i get 48 sub barlen i sub 2 mod 0 ne {3 mul} if add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + validatecheck { + barcode barlen get checksum 48 add ne { + /bwipp.code2of5badCheckDigit (Incorrect Code 25 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + /includecheck true def + } if + + % Create an array containing the character mappings + /versions << + /industrial + [ (1111313111) (3111111131) (1131111131) (3131111111) + (1111311131) (3111311111) (1131311111) (1111113131) + (3111113111) (1131113111) (313111) (31113) + ] + /iata + [ (1111313111) (3111111131) (1131111131) (3131111111) + (1111311131) (3111311111) (1131311111) (1111113131) + (3111113111) (1131113111) (1111) (311) + ] + /matrix + [ (113311) (311131) (131131) (331111) (113131) (313111) + (133111) (111331) (311311) (131311) (311111) (31111) + ] + /coop + [ (331111) (111331) (113131) (113311) (131131) (131311) + (133111) (311131) (311311) (313111) (3131) (133) + ] + /datalogic + [ (113311) (311131) (131131) (331111) (113131) (313111) + (133111) (111331) (311311) (131311) (1111) (311) + ] + >> def + versions version known not { + /bwipp.code2of5badVersion (Unrecognised Code 25 version) //raiseerror exec + } if + /encs versions version get def + + /cs encs 0 get length def + /cw 0 encs 0 get {48 sub add} forall def + /ss encs dup length 2 sub get length def + /sw 0 encs dup length 2 sub get {48 sub add} forall def + + % Create a string of the available characters + /barchars (0123456789) def + + /sbs barlen includecheck {1 add} if cs mul ss add ss add string def + /txt barlen includecheck {1 add} if array def + + % Put the start character + sbs 0 encs 10 get putinterval + 0 1 barlen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i cs mul ss add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i cw mul sw add textyoffset textfont textsize] put + } for + + % Put the checksum and end characters + includecheck { + sbs barlen cs mul ss add encs checksum get putinterval + sbs barlen cs mul cs add ss add encs 11 get putinterval + includecheckintext { + txt barlen [barchars checksum 1 getinterval barlen cw mul sw add textyoffset textfont textsize] put + } { + txt barlen [( ) barlen cw mul sw add textyoffset textfont textsize] put + } ifelse + } { + sbs barlen cs mul ss add encs 11 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code2of5-- +% --BEGIN ENCODER industrial2of5-- +% --REQUIRES preamble raiseerror renlinear code2of5-- +% --DESC: Industrial 2 of 5 +% --EXAM: 01234567 +% --EXOP: includetext includecheck includecheckintext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp industrial2of5 0.0 2015050900 57882 57606 +%%BeginData: 55 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/industrial2of5 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Get the result of encoding with code2of5 with version=industrial + options (dontdraw) true put + options (version) (industrial) put + + /args barcode options //code2of5 exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/industrial2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER industrial2of5-- + +% --BEGIN ENCODER iata2of5-- +% --REQUIRES preamble raiseerror renlinear code2of5-- +% --DESC: IATA 2 of 5 +% --EXAM: 01234567 +% --EXOP: includetext includecheck includecheckintext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp iata2of5 0.0 2015050900 57852 57582 +%%BeginData: 55 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/iata2of5 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Get the result of encoding with code2of5 with version=iata + options (dontdraw) true put + options (version) (iata) put + + /args barcode options //code2of5 exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/iata2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER iata2of5-- + +% --BEGIN ENCODER matrix2of5-- +% --REQUIRES preamble raiseerror renlinear code2of5-- +% --DESC: Matrix 2 of 5 +% --EXAM: 01234567 +% --EXOP: includetext includecheck includecheckintext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp matrix2of5 0.0 2015050900 57862 57590 +%%BeginData: 55 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/matrix2of5 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Get the result of encoding with code2of5 with version=matrix + options (dontdraw) true put + options (version) (matrix) put + + /args barcode options //code2of5 exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/matrix2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER matrix2of5-- + +% --BEGIN ENCODER coop2of5-- +% --REQUIRES preamble raiseerror renlinear code2of5-- +% --DESC: COOP 2 of 5 +% --EXAM: 01234567 +% --EXOP: includetext includecheck includecheckintext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp coop2of5 0.0 2015050900 57852 57582 +%%BeginData: 55 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/coop2of5 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Get the result of encoding with code2of5 with version=coop + options (dontdraw) true put + options (version) (coop) put + + /args barcode options //code2of5 exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/coop2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER coop2of5-- + +% --BEGIN ENCODER datalogic2of5-- +% --REQUIRES preamble raiseerror renlinear code2of5-- +% --DESC: Datalogic 2 of 5 +% --EXAM: 01234567 +% --EXOP: includetext includecheck includecheckintext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp datalogic2of5 0.0 2015050900 57877 57602 +%%BeginData: 55 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code2of5 dup /uk.co.terryburton.bwipp findresource put +begin +/datalogic2of5 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Get the result of encoding with code2of5 with version=datalogic + options (dontdraw) true put + options (version) (datalogic) put + + /args barcode options //code2of5 exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/datalogic2of5 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER datalogic2of5-- + % --BEGIN ENCODER code11-- % --REQUIRES preamble raiseerror renlinear-- % --DESC: Code 11 % --EXAM: 0123456789 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code11 0.0 0 0 0 -%%BeginData: 57 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ DP!5 %OP! 5$b I=%,/FE2M8 Ou%NL5FCf ]=F(o r3O tVtS06CcMF Eqe:AohO*+E -V1>FEqe:AohO*Ot VtS05+p 2B4uB0 BOtmj BQT CjOu"b&DI[ `1>E/nB0ekC -=0ocGo0ekC=0ocGm1GLU?0ocGo1GLU=0ocGm0f(O?0ocGo0f(O=0ocGm1G^a?0ocGm0ekI?0oc -Go0ekI=0ocGo0ekC;0ocGm0f(O=0ocGm0f(U?0jTqu04J@1@q]:kF,gV^0etOA2)[BQ3A$CM04 -S[(Ectl-F,13e23KbO!/LZ3$@?8r@<-O"Cibb'OuQoZEarckEc[C-L]NZ4P!5%RI?I-W!/LYb@ -<,jrA7^p5L]N[GSnD09oA+Cf>-FCAm$+E).6Gp$X3B5)I/+CT.u+Cno%BOu6<061K8F(Jp -'Ec5u]5CJ\oI?I,S@UX:nASrW"@<,jrA7^p5Ou%8iCh[EgFCerqARfM&+C\c"Ch7L?$^*Z"04K -->E,[F>De*E60k+R%9P&*SFD-[i6Z6LH+>GSn@ps7mDfd+2AKW]^+Cf(nEa`I"ATDi7F`V87B- -:\tARfKuA8,[jFE9)gEa`['AS#n&DfV"*I?IP_@UX:nASrW"@<-0qDBNCsEbo<)L^K;RH\_]NH -\_`OP#[[EOu%NL<%i-3D.@6j@r$-.Bl7EsF_#&nBOt[h+Eh10Bk1XoARfCb@r%6JHX^E(Ch7L? -$Be#.L]W!OL]Mpe99M(a@q]F`CNFW80d't>ARf -LsF_riU@UX:nASrW)P,X6E,[F>De*E60k+R - %6YL%@CIDlLBlo@^8T&$VEcP`$FARfKuA8,[jFE,[F>De*E60k+R%6YL%@CIDlL -BlnEV-V82cDfTl0@rrh\De*E%0eje\BOt[h+Co2!BlnD=E,ol?Bk1dc0/%?SBldisEcQ)=P!=A -X<.0p004J@1@rGmh+C\c"@rGmhL]CmmEbo<)P"_#p055<6Cis9"@q]F`CER_>F_-^lI?IP_F(0 -25@UX:nASrW.F_tW%ARfLsOo^@CP&,p_Oo^`BOu"b5G]Y';@<-0qDBNh>D.@6j@r$.K!KmbP1N -R#HL]D"(@rmG6P"Us`06hGSF,1*b1Pc$e!FfJXCh7L?!KsF/056S5Ou"b*DIdu7@q]:kG%#3.+ -C\c"@rGmh+DHW4P"_$3Ou"b&DIXf#DI[`1Bl7I+P"UroF(025BnutVCkr:Y!G-.YP'M.oF9IB`Eas#uAKY]C!Kp-$E,Te?FCf]=H#I;,F(KG9FCf]=AoDR/+EV1>FE;/BAKY9AG_c?U!Jgo -+06hGSF-8^uDI\hnP"UTbP,W\FDf_'BOu%NL8:?XlBl7EsF_#&nBOt[hHQZd+Ebo<)L^K;;HZN -Y;+C\c"Ch7L?#*NeY#*K!uDI[`1@q]F`CNFW80p51mH#mG9+C\c"Ch7L?#*NeY%$CX&DI[`1@q -]F`CNFW816P:nH"h/+Cis9"@q]F`CM@[.AU&9IB`EarckEcW@5BOt[hF -*2=SL]NZ4G]7SB+EV1>FEqe:AohO*+EV1>FCoH/FFE;/BAKY -9AG^Xp\G]Y';@<-0qDBN/D!-iI$F!,R9G]\4LAnH*qF5?'9GSG] -Y';@<-0qDMS=V!F(QaG]7SB+EV1>FEqe:AohO*+EV1>FCoH/FDf[%CAU&FCf]=F(or3+C1.TI=$'\FFEqe:AohO*+EV1>FCoH/Fq]Z#F!+[0F(03R@Yb&J!Jgf?;L<(gBkM+$I?K4g04JC3+Bot0@WR]A -L]NY>L]W`;H\_ZMP(R$_Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/code11 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code11 0.0 2015050900 69086 68582 +%%BeginData: 158 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code11 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def + /validatecheck false def + /includetext false def + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create an array containing the character mappings + /encs + [ (111131) (311131) (131131) (331111) (113131) + (313111) (133111) (111331) (311311) (311111) + (113111) (113311) + ] def + + % Create a string of the available characters + /barchars (0123456789-) def + /charvals 11 dict def + 0 1 10 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.code11badCharacter (Code 11 must contain only digits and dashes) //raiseerror exec + } if + } for + + /barlen barcode length def + validatecheck { + barlen 11 eq { + /bwipp.code11badLength (Code 11 cannot be 11 characters using check digits) //raiseerror exec + } if + /barlen barlen barlen 10 le {1} {2} ifelse sub def + } if + + /numchecks includecheck validatecheck or {barlen 10 ge {2} {1} ifelse} {0} ifelse def + /checksum1 0 def /checksum2 0 def + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + /checksum1 checksum1 barlen i sub 1 sub 10 mod 1 add indx mul add def + /checksum2 checksum2 barlen i sub 9 mod 1 add indx mul add def + } for + /checksum1 checksum1 11 mod def + /checksum2 checksum2 checksum1 add 11 mod def + validatecheck { + numchecks 1 eq { + barcode barlen get barchars checksum1 get ne { + /bwipp.code11badCheckDigit (Incorrect Code 11 check digit provided) //raiseerror exec + } if + } { + barcode barlen get barchars checksum1 get ne + barcode barlen 1 add get barchars checksum2 get ne or { + /bwipp.code11badCheckDigits (Incorrect Code 11 check digits provided) //raiseerror exec + } if + } ifelse + /barcode barcode 0 barlen getinterval def + /includecheck true def + } if + + /sbs barlen numchecks add 6 mul 12 add string def + /txt barlen numchecks add array def + + % Put the start character + sbs 0 encs 11 get putinterval + + /xpos 8 def + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + /enc encs indx get def + sbs i 6 mul 6 add enc putinterval + txt i [barcode i 1 getinterval xpos textyoffset textfont textsize] put + 0 1 5 { % xpos+=width of the character + /xpos exch enc exch get 48 sub xpos add def + } for + } for + + % Put the checksum and end characters + includecheck { + barlen 10 ge { + sbs barlen 6 mul 6 add encs checksum1 get putinterval + sbs barlen 6 mul 12 add encs checksum2 get putinterval + includecheckintext { + txt barlen [barchars checksum1 1 getinterval xpos textyoffset textfont textsize] put + /enc encs checksum1 get def + 0 1 5 { % xpos+=width of the character + /xpos exch enc exch get 48 sub xpos add def + } for + txt barlen 1 add [barchars checksum2 1 getinterval xpos textyoffset textfont textsize] put + } { + txt barlen [() xpos textyoffset textfont textsize] put + txt barlen 1 add [() xpos textyoffset textfont textsize] put + } ifelse + sbs barlen 6 mul 18 add encs 11 get putinterval + } { + sbs barlen 6 mul 6 add encs checksum1 get putinterval + includecheckintext { + txt barlen [barchars checksum1 1 getinterval xpos textyoffset textfont textsize] put + } { + txt barlen [() xpos textyoffset textfont textsize] put + } ifelse + sbs barlen 6 mul 12 add encs 11 get putinterval + } ifelse + } { + sbs barlen 6 mul 6 add encs 11 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code11 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code11-- @@ -2344,56 +7344,156 @@ L]NY>L]W`;H\_ZMP(R$_Bl7EsF_#'*AU& :%5 -2X=FD5Z2F-8_M1G <3GEa s#u AWf 6 ?1G <9W DKK E0@X4aVtcOu8C3D fBf4Df 0WC P,i2 'Cia 0N4 aW>WI?IQm3 0Ia6V33Qn!B -lU*FE2M8P!+/T/W r;\Fc nqO1 OXV5/ Tc#U AWe itP#ZpnAWe *t3A5;iFD5Z -2F-8_M1OYEcDfBf 4Df0W COu%N L8M>0 sG] [P9DKI"CAU &FE;/B AWe^01 G>#B4uCM09S,4ASl..055<6Cis9"@q]F`CER_>F_-^l055<6Cis9"F*(i -2FE;PBE$07CF_-^lI?IP_@UX:eBOPq&N[$5U3CcbD83o4(=u8uR;_^m";)Ud#6s3/L5*C/=P" -:B/L]LsnEas#uAWgMY!KsF/@UX:eDe*FB5)96&9OhaEEctl-F-8_M@$5JU04K->E,[F=@l,nq@ -UWe7BOPpi@ru:&N]TQp1bga.D09oA+Cf>-FCAm$+E).6Gp$X3B5)I/+CT.u+Cei!Blmd"+DbV2 -FCfK6+D#e-AT2`6:G4AA@;0doATDg0EfrY8P#Qjm82"F\Ebo<)+C\c"@rGmhP%&TCCh[EgFCer -qARfM&L]N[%ARfLsF_upZP%p.9G% -#3$A79Rk@q]F`CO715@<,jrA7Zlm@<-0qDN[Y%@<,jk@<-E3@q]F`CNFW8P"UsTHS8iPBlJ#D@ -Uh5L11F[&6YL%@CIDlLBlo@\8T&$VEcP`$F0ocMo1GL[?0ekDC#Ve(h0ekI=16)Vp0ekI=1,1PE#Ve%g1,1U?0ocMo0ekO?0ekDC#Ve1k0e -kC;0ocMo0ekC;2)-hG#Ve(h1GLX>0ocMo1GLX>0ekGD#Ve+i0ekF<16)Vp0ekC;1,1VG#Ve(h1 -,1L<1QD_q0ekC;1GL\G#Ve+i0ekC;1QD_q0ekF<1,1SF#Ve%g1bg^>16)Vp0ekF<1GLYF#Ve%g -1bga?0ocMo1bga?0ekDC#Ve(h1,1O=16)Vp0ekI=1GLVE#Ve+i1,1O=0ocMo1,1L<1bg_F#Ve. -j0ekF<0ocMo0ekC;1bgbG#Ve(h0ekC;1l_hr1bg^>0ekGD#Ve(h1bg^>0ocMo0ekF<0ekMF#Ve -(h1GLU=16)Dj16)Gk0elss1GL^9/[L]rqBP,4OpR:-I=!VhG]Y';@<-0qDNY>HQ[B=F -,0g-DI[aD,Eb]_GqX,TF,0m\1GL]`erI=!VdDf^^7Ou"b5G][nCF,0gZ1OYEdL]E53 -@UX:nAT!;)P,Wd]Bp(ZC1G9IB`Eas#uAKY]C!Kp,jL^]G_FEhnHDf_'BFCf]=H#I;,F(KG9FCf -]=AoDR/+EV1>FE;/BAKY9AGV=#SF!,F?F,1*b!Ko6eP"9;)@r-9uARfCb@r$E6F(025E,Te?AS -u"!+Cf(r@r$..D3@PTH"h/+Cis9"@q]F`CM@[.AU&9IB`EarckEcW@5B -Ot[hF*2>U!Kp,c@<-0qDMS^aCijoDE,Tf\!H_mtFEqe:AohO*+EV1>FCoH/FFE;/BAKY9AG^Y`T05tiN+E27?L^9.EOu%NL<,$5[Cis9"F*(i2FE;PBE-i^K@WNZ2Df[%4DI[ -aD,a(f`GqX,TF!,F?F,0m\!Ko6eP#O)U@WNZ5@WR>*E,Tf\9Th1o4>1_dDD*Y`ASu9IurF-:!g!KmJ>!g6H.BOtmjBQSZcK3^->@WNYr+EM"5P - %'4JOo^@?P#?X_!.C#_>p*j!@r-9uATVL.FF,Z_G]Y'MG]\@s<%i0/F -% uk.co.terryburton.bwipp/bc412 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp bc412 0.0 2015050900 64995 64541 +%%BeginData: 148 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/bc412 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def + /validatecheck false def + /includetext false def + /includecheckintext false def + /includestartstop false def + /semi false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + semi { + /includecheck true def + /includestartstop true def + } if + + % Create a string of the available characters + /barchars (0R9GLVHA8EZ4NTS1J2Q6C7DYKBUIX3FWP5M) def + /charvals 35 dict def + 0 1 34 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.bc412badCharacter (BC412 must contain only digits and capital letters except O) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 0 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 35 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.bc412badCheckDigit (Incorrect BC412 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + /includecheck true def + } if + + % Create an array containing the character mappings + /encs + [ (11111115) (13111212) (11131113) (12111213) (12121311) + (13131111) (12111312) (11131212) (11121411) (11151111) + (15111111) (11111511) (12131211) (13121112) (13111212) + (11111214) (12121113) (11111313) (13111113) (11121213) + (11141112) (11121312) (11141211) (14121111) (12121212) + (11131311) (13121211) (12111411) (14111211) (11111412) + (12111114) (14111112) (12141111) (11121114) (12131112) + (12) (111) + ] def + + /sbs barlen 1 add 8 mul 5 add string def + includecheck { + /txt barlen 1 add array def + } { + /txt barlen array def + } ifelse + + % Put the start character + includestartstop { + sbs 0 encs 35 get putinterval + /pos 2 def + /txtpos 3 def + } { + /pos 0 def + /txtpos 0 def + } ifelse + + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + sbs pos encs indx get putinterval + txt i [barcode i 1 getinterval i 12 mul txtpos add textyoffset textfont textsize] put + /pos pos 8 add def + } for + + % Put the checksum + includecheck { + sbs pos encs checksum get putinterval + includecheckintext { + txt barlen [barchars checksum 1 getinterval barlen 12 mul txtpos add textyoffset textfont textsize] put + } { + txt barlen [() barlen 12 mul txtpos add textyoffset textfont textsize] put + } ifelse + /pos pos 8 add def + } if + + % Put the stop character + includestartstop { + sbs pos encs 36 get putinterval + /pos pos 2 add def + } if + + % Return the arguments + /sbs sbs 0 pos getinterval def + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/bc412 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER bc412-- @@ -2404,67 +7504,164 @@ O*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: A0123456789B % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp rationalizedCodabar 0.0 0 0 0 -%%BeginData: 59 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\A moLsAW ei& F Cf] =A oDR/ OiN V@06CcMFE; /BAV^\V1GFCf]=Ao DR/OtDhQ06C -cMFE;/BAKZ)+G]\ "@H=`6m Ou"b5A U&:1Pc$e!JhD9@q]:kG%#3.P!5$g@UX:eBOPq -&P!4[&P"_$&P'DD<82"FjA9i?,CibCDOu8CYL]E53L_"iADe+-:@;L"J5*@m7@<,jk@<-FP5)9 -6&9ThT&G^Y`G06;2X@;L"@"HkX*1PcTu!JhD9F)uM5Cibb'OuQoZEarckEc[C-L]NZ4P!5%RI? -I-1@<,jrA7^PsL]NZ4F)uM5Cibb'P$jGl@UX:eDe*E%@UX:eDe*FB@Yb&JWJCS<9QP8u@;L"J5 -*B<:E0>6g@;L%,FCB33F*)>>HS8iPBlJ#DEaa'(Df0!"BmO?$6Z6LD@UX:D@:VZ?FAm9iEcb6% -DfC^u6Z6LD@UX:"F*(i2Fr8Df?h/BOPpi@ru:&F!,=BF*&O6AKYo/AKYo'+@RDJ+B0J - %EZchb061K8F(Jp'Ec5u]5CIl3@WuO*E%Z0>FD5Z2@;KY(ARn/HA78qUE^F2F;flGgFAm:"E/ -m"IDe*9c@<*K3FCB33+CT.u+EMXCE$/Y(@<,ddFCfK6+Dl7BFE,[FM@r=D.7F"F!*%W,To,j0-Dki.k`Pr@;0doATD -g0EfrY8P#Qjm82"F\Ebo<)+C\c"@rGmhP%&TCCh[EgFCerqARfM&L]N[U&<^dkWJD+KC6CAr@;KXg@_99O.=04K->E,[FM@5?'9Gg!/LZ3# -CA+KE,Tf\5%SVAP!5%%LbP!kG]7SBOo^_%I?I-LP"9;)@r-9uARfCb@r$E6F(025@UX:nAT!;0 -P&,p[P,W#1@ric&BOt[hF*2>_99OR7DI[L*A7]7aARfLiDKKH7FF,-PG]Y';@<-0qDMS=VWEUK -S@<,jk@<-E3@q]F`CNFW8L]NZ4G]7SB+EV1>FEqe:AohO*+EV1>FCoH/FFCf]=F(or3+C1.TI? -ITd!/LZ3#CA+KE,Tf\5%SVAF!+t+ARfLsF`!:7P!5%%LbP!kG]7SBOo^_%I?I,SBl7I++Cf(nE -ctl-F!+q#Eas#uAKYGjEbo<)L]N[9IB`Eas#uAKYGjEbo<)L]N[FEqe:AohO -*+EV1>FCoH/F9IB`Eas#uAKYGjEbo<)L]N[FEqe:AohO*+EV1>FCoH/Fq]Z#F!+[0F(03R@Yb&J -!Jgf?;L<(gBkM+$I?K4g04JC3+Bot0@WR]AL]NY>L]W`;H\_ZMP(R$_Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/rationalizedCodabar 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp rationalizedCodabar 0.0 2015050900 69398 68906 +%%BeginData: 156 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/rationalizedCodabar { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /altstartstop false def + /includecheck false def % Enable/disable checkdigit + /validatecheck false def + /includetext false def % Enable/disable text + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create an array containing the character mappings + /encs + [ (11111331) (11113311) (11131131) (33111111) (11311311) + (31111311) (13111131) (13113111) (13311111) (31131111) + (11133111) (11331111) (31113131) (31311131) (31313111) + (11313131) (11331311) (13131131) (11131331) (11133311) + ] def + + % Create a string of the available characters + altstartstop { + /barchars (0123456789-$:/.+TN*E) def + } { + /barchars (0123456789-$:/.+ABCD) def + } ifelse + /charvals 20 dict def + 0 1 19 {charvals exch dup barchars exch 1 getinterval exch put} for + /bodyvals 16 dict def + 0 1 15 {bodyvals exch dup barchars exch 1 getinterval exch put} for + /ssvals 4 dict def + 16 1 19 {ssvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + barcode 0 1 getinterval ssvals exch known not + barcode barcode length 1 sub 1 getinterval ssvals exch known not or { + altstartstop { + /bwipp.rationalizedCodabarBadAltStartStop (Codabar start and stop characters must be one of E N T or *) //raiseerror exec + } { + /bwipp.rationalizedCodabarBadStartStop (Codabar start and stop characters must be one of A B C or D) //raiseerror exec + } ifelse + } if + 1 1 barcode length 2 sub { + barcode exch 1 getinterval bodyvals exch known not { + /bwipp.rationalizedCodabarBadCharacter (Codabar body must contain only digits and symbols - $ : / . +) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 0 def + 0 1 barlen 2 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + barcode barcode length 1 sub 1 getinterval charvals exch get + checksum add /checksum exch def + /checksum 16 checksum 16 mod sub 16 mod def + validatecheck { + barcode barlen 1 sub get barchars checksum get ne { + /bwipp.rationalizedCodabarBadCheckDigit (Incorrect Codabar check digit provided) //raiseerror exec + } if + barlen string + dup 0 barcode 0 barlen 1 sub getinterval putinterval + dup barlen 1 sub barcode barlen 1 getinterval putinterval + /barcode exch def + /includecheck true def + } if + + /sbs barlen includecheck {1 add} if 8 mul string def + /txt barlen includecheck {1 add} if array def + + /xpos 0 def + 0 1 barlen 2 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + /enc encs indx get def + sbs i 8 mul enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval xpos textyoffset textfont textsize] put + 0 1 7 { % xpos+=width of the character + /xpos exch enc exch get 48 sub xpos add def + } for + } for + + % Put the checksum character and stop character + includecheck { + % Put the checksum character + sbs barlen 8 mul 8 sub encs checksum get putinterval + includecheckintext { + txt barlen 1 sub [barchars checksum 1 getinterval xpos textyoffset textfont textsize] put + } { + txt barlen 1 sub [( ) xpos textyoffset textfont textsize] put + } ifelse + 0 1 7 { % xpos+=width of the character + /xpos exch encs checksum get exch get 48 sub xpos add def + } for + % Put the end character + /indx charvals barcode barlen 1 sub 1 getinterval get def + /enc encs indx get def % Get the indxth encoding + sbs barlen 8 mul enc putinterval % Put encoded digit into sbs + txt barlen [barcode barlen 1 sub 1 getinterval xpos textyoffset textfont textsize] put + } { + % Put the end character + /indx charvals barcode barlen 1 sub 1 getinterval get def + /enc encs indx get def % Get the indxth encoding + sbs barlen 8 mul 8 sub enc putinterval % Put encoded digit into sbs + txt barlen 1 sub [barcode barlen 1 sub 1 getinterval xpos textyoffset textfont textsize] put + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/rationalizedCodabar dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER rationalizedCodabar-- @@ -2475,141 +7672,343 @@ Z2@;KY(ARn/HA78qUEfrDFA1r(@/n8fPFCfK5H"(o:FDl%L@WuO*E$/\&Anc-oEb0<1F`Lu'P' % --EXAM: 0123456709498765432101234567891 % --EXOP: barcolor=FF0000 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp onecode 0.0 0 0 0 -%%BeginData: 133 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\@ rG mhH\`B !23 -JD%DfBf4Df0WZ5* @]T@U X:e De* F B5* @]T A8c @-A9)+ &+ D,%uF( LLj -05+p2B4uCE4rKcW Ou%#q FD5 Z2F -< ^[ F*) G:D J+':E+ P1 qH\_]c 23J -DeE-,f4DKC/fX(G dVF( LLt H] gX BP# RT( P%' TNOt -hst4d(eHEckrV4a W>DP ! 5% OP !5$ bI= %,/F E2M8O -u%NLOu%N L<-3A,+DDs> -E+*6f@r?CO!F$[U@<,jrA7ZltL]NZ4L]E52NW=k8?'9G\P"76JG]Y'MG]\`A@UX:eDe*FB@WQK -s@qB.fFHQZf9Th1bDJsQ4@;KY(AU?(>@<6"C5*@]TDKTfZ5*@^>F`!:NL]N[F_r78L]N[DN8sF_uJRP"ArB1N%>PL]D=8D281T95\lhL]NZ3@UX=hP -#@GDP'CkeD2841F_up8P"T7mF(LMLP'DDPP%'4IP!+.FDKTe=>DN8bOu%NL<,QhqI?G)'1G<3OB45= -]H\_`d)3SHl5*BB2!g4FaWKI67DeDN;cI?IQ=@<-0qDMT9IB`Eas#uAV_%0@<-0qDMT!iWKKr% -LbP!kI?I0-+C]%t@:Wo31G<3ODK]H)+BostBl8*&CjUSn8Rc+K@rGmhL]ET2LbP!k?'6us@VK_ -'@;I&j+C]&&G%#36L]rrXI?I0-+Bost@<,jrA7^PtP"UTbP,V_0@VKI`A7UK'DJsQ4@;KY(AWe -i&@VK_'@;I&j+C]&&G%#36I?I02@<,jrA7^PuL_>kEH\aA=WI9q$?'6us@X3',F,19g$'I(t@V -K_%D/^V%+C]&&G%#36I?I0-Ou%n&M#W82HS9)r5*@^X!/LYbBl8$0E0=[d!g9O005?Y6Ou$Q]D -KK`7+DQ]5Oo^@?Or9EU@VK_%D/^V4P"UN1!0V)Q$Bf4g!Kq\:Bl8$0E$/m<@VK_%D/^V4P"UN1 -!0U6CG^Y`G@X3',F!,0>@VK_%D/^V,Bl8$0E0=[d!KsFF983HIP%p/)@VK_%D/^V,Bl8$0E0=[ -d!KsF"Gd&@D0mpJ@ric)@rmG,Oq39X23Pe=1OXU'An,m)An,nH$!V=P!5%%L]`eN04\L5P!5$bL^8?>@ric'@ -<@[KL'.L>"Gd&@D0mpJ@ric)@rmG,Oq39X23Pe=1OXU'An,m)An,nL]W -_WP"T7uDK]H)+DR'4@ZkJ^$Bf4g!Kq\:Bl8*&C`mI8@VK_'@;I'$P"T8I;Nc9QP"9)$A7]t'Eb -'56Bcpl!DK]H)+C]&&G%#3M@Yb&JWKKn`P%p/)@VK_'@;I&qBl8*&Cm&7`!KsFD=(^Lg>`O5_ra$%mYq`L)e!bCPEbCLi%k^^kcl_%`!mAL)Id_FbUXHLj" -L^^kd8j'>TEML'teQI"hmAL&d9h*[$1;Q\HM'L&d]t)^'k8SV@q'L&dg"%j6T,VhQ1aL&e9/)P -DfbXbIUaL&eB2%\SOVZ\B?jL&eW9'qg9][Y>6aL&ec=';1'[\qUTcL&el@#G?eOa+bRAL&fDO) -IS:"c%[!AL&fMR%Ub"kdtS`JL&fbY'juareqOWAL&fn]'4?Opg4fuCL&g"`#@N8dj+\E/L&g=i -']=]Gk(X<&L&gIm'&\KEl@oZ(L&gRp#2k49nV.Y6L&ge!$/gO!r+)ho:CL&imU.u"t(L&il\(6F7O/qsjtL&j)b)3BRR222j-L&j -2e%?Q;F3JJ3/L&j>i$]p)D4GF*&L&jf!*)M@j984?]L&k#'(/T_d:506TL&k5-),Q%g0%8_c[=b[SdL&kJ4$W)QY>_WJ[L&ke=(sn!)A/L&m`t$S[;9S;%8&L&n'((pJ_qV1o\gL&n0+%'YHeWJ2%iL&n)!DUL&tV7#=sRN@tkiAL&tq@'Zc"1Aqg`8L&u(D'$,e/C5*):L&u1G#0;N -#EJ>(HL&uCM$-7i&FG9t?L&uUS"3?2uLP?csL'!9f)CU=ANJ82sL'!Bi%Od&5PD0r'L'!Wp'e" -e"/pqU_hK"AL'#>K'PN4&`eFn8L'#JO&nm"$b(^7:L'#SR# -&&_md=r6HL'#eX$##%pe:n-?L'$"^")*DjiJ%p-L'$@h#j@!EjG!g$L'%[8*#OD4$\fQ:L'%m> -()Vc.%YbH1L'&*D)&S)1'o!G?L'&3G%2ag%)28eAL'&?K$Q+U#*/4\8L'&ZT(mp$[-&*,$L'&c -W%%)bO.>AJ&L'&o[$CHPM/;=@rL''/b&X\:T156+&L''8e"dk#H3/.O&L''et(g)Lp7>;LYL'' -o"$s85d8VRj[L'(&&$5?GL'(n>#hXk6A;16>L' -*'_(c[6PKn^:$L'*0b$oitDM1uX&L'*@L',AK"F,Y(%u),.L'/9H=3JJ3#L'0Pl$\X6;4GF) -oL'1#$*(5Ma984?QL'15*(._W -JOL'2"@(rV.3AVLo;L'2+C%)dl'Bnd8=L'27G$H.Z%Ck`/4L'2LN&]BD,EeXn=L'2UQ"iQ,uLP -?coL'3Eh)C1%?NJ82oL'3Nk%O?c3PD0r#L'3cr'dSM:QA,hoL'3p!'-r;8RYD1qL'4$$#:,$,U -P9V]L'4?-'VpHdVM5MTL'4K1&u:6bWeLkVL'4T4#,HtVZ%`jdL'4f:$)E:Y["\a[L'5DK(hA@( -`J,(;L'5MN$tP(qabCF=L'5YR$=nkob_?=4L'5nY&S-V!dY8'=L'6"\"_<>jiJ%p)L'6Lj#ip^ -D#DO34L'7s>)AIo0%>GW4L'8'A%MXX$'8@A=L'8e$'^/J1kl0uL'9r!(f -Z4n7>;LUL':&$$rhrb8VRjWL':2($<2``9SNaNL':G/&QFJg;MGKWL';"?&CcF<@YP0DJ -&9NX1_M/>p%%YbH%L'AAIoL'B,^$B0]D/;=@fL'BAe&WDGK156*oL'C -#"(efYg7>;LML'C,%$quB[8VRjOL'C8)$;?0Y;2,ZVL'CP1#u$'X@>5?;L'D+A#gA#-K8(3oL' -E?d'J+tCL5$*fL'EKh&hJbAMM;HhL'Ecp&M/Y@P(j8oL'F?+&?LTjU4rrTL'GJK&8[(*_M/>4L -'Ig8(`\88"bm^2L'Ip;$lk!,$&0'4L'J'?$64d*&V^l;L'J?G#on[)+bgPuL'JoW#b6VS6&#qU -L'L&"#[E)hJVF^uL'N')!DOL'V:D(rD"5AVLo9L'VCG%)R`)Bn -d8;L'VOK$GqN'EJ>(BL'VgS$,VE&LP?cmL'W]l)BsnANJ82mL'Wfo%O-W5PD0r!L'X'!'dAA$)3.[ -_hK";L'YbQ'Ole&`eFn2L'YnU&n6S$b(^74L'Z1]&RpJ#dY8';L'Zam&E8EN#DO32L'\6B)A7c -2%>GW2L'\?E%MFL&'8@A;L'\TL'bZ6-(5<82L'\`P',$$+)MSV4L'])Z(m9U[-&*+sL']2]%$H ->O.>AIuL']>a$Bg,M0np:'L']Vi$'L#L6\ZFUL'^;''N0Yl7YV=LL'^G+&lOGj8qm[NL'^_3&Q -4>i@>5?AL'`Ke(c$gPKn^9sL'`Th$o3PDM1uWuL'``l$8R>BObOH'L'aQ.&@.#s_1iMAL'e0?* -"%E-$\fQ,L'eBE((,d'%YbH#L'eTK)%)**'o!G1L'e]N%17gs)28e3L'eiR$OVUq,DI%mL'f5] -'T.VP-ADqdL'fAa&rMDN.Y\:fL'fYi&W2;M6\ZFML'gA('M=)e7YV=DL'gM,&k[lc;2,ZTL'h@ -D&B]_7K8(3mL'iWh'InhEL5$*dL'icl&h8VCObOGtL'jW/&?:Hl_1iM9L'n*<(`J,:"bm^0L'n -3?$lXj.$&0'2L'nTJ&K6B3+bgPsL'p;%&6aerJVF^sL("AIiL(#ek&Vc#K6\ZFIL -($M*'Lmfc8VRjIL($q6&OqK`@>5?5L(&]h(aatGKn^9gL(&on&gi>AObOGpL('c1&>k0j_1iM5 -L(+6>(`%i8"bm^,L(+HD&f-32&V^l5L(,;\&=/%[6&#qOL(/]g&2o7Q",7X&L(4BA'Foj-$&0' -&L(4fM&IsO*+bgPgL(6M(&5IriJVF^gL(=<>&0?Q;%u),+L(G/U*GW1L(P)R)%hT8'o!G8L(P;X'+os2,DI%tL(P_d'Tn+^.>AItL(Q.p&Wq -e[6\ZFTL(Qk/'N'Ss8VRjTL(T&m(bpaWKn^9rL(T8s&i#+R#DO3)L(XlK)@;-2%>GW)L(Y/S)$ -u$1'o!G0L(YAY'+'C+,DI%lL(Yee'T%PW.>AIlL(Zk.(eKGp7>;LJL(],n(b(1PKn^9jL(aZD( -`A&A"bm^/L(jlI*!M'2$\fQ'L(k)O('TF,'8@A.L(kAW'a9=+,DI%hL(kqg'SV8U6\ZFHL(o8p -(aXnO",7X-L)'lG(_)3:#DO3#L):;Q)?Y^2'8@A,L);.i(k[P[6\Z:DL([(4&Q+8oiJ%b1L'gP --#uZK`ie@Y2L':P2"QY:>=G?n@L&pdLOu"b5@:CuH1E]nX",7WmL]rMI!/Li6$il(iL(XKB$AJ -lfL^]"B!/M5A&HIV"L'[j9'SZbkL_tjK!/MeQ&:fQ\L'Wn6!J#tlL(HV+6A ->b2LdZt#5_qsc!^MQP!5$b@rGmhGAhM4F!,1[99M8h"U:, -uHZW\*2)-nM5*AQeHZW\*1,1SJ5)'4GP,XU;I?IT?BOPq&+DHW6M#WWnP'DD<8;IS.s+gZ%056 -S5Ou%mqBcpu3E0;ba@rme9L]ETTHXg_tEcW@;+Cf(nEcW@;P"UNOs,t3]G^Y`SI?I,S@UX:o@; -m>nL^/_;L]iM9L]N;=L]E52L^AkGL]WAL^/_?L]rSBL]N;7L^8e?L]WA@L^AkEL]E54L^/_:L^&Y?L]`G; -L]iM?L]E55L^8e@L^&YL]` -G9L]E57L^8e>L]rS>L^/_DL]N;L]WA5L]`G7L]rS@L^8eFL]iMAL^ -&Y9L^Ak@L^/_=L]`G8L]N;5L]E59L]WA4L]N;6L]iM7L^&YBL]`G:L^8eAL^Ak?L]WA?L]rS=L -]E5:L^/_EL]iM8L^8e;L]rSAL]`G5L^Ak>L]E5;L^&Y=L]WA8L^/_AL]N;:L]rS7L]iM;L]WA7 -L]E5L^/_9L]`GL]E5>L]N;>L]WA=L^Ak;L^&Y@L]rS:L]`G?L^8eF(:@9HX^H*+DHW6BOtmjBQTDRL^9/ - %P'CGLF!,1Q"__I]B4uCMCkr@[2Ni<5P#Pt'@j#3$A!1eo"FFTeF!,1Q!,,qXB4uCMCkr@[2N -i;oBQG;1L]qI'BkM+$P&,p[OuAJJI?IQ?ARcikF(:@9HX^H*+DHW3BOtmjBQTDRL^9/%P'CGLF -!,1Q#\[d`B4uCMCkr@[2Ni<5P#Qjm83B!fEb0,A061WACh[cu@<+#1@WNZ$@WO23BQG;*BQGhJ -@WNYr+C]#*P%'4JP,Wec5IaSWMEgR#Z@.mgMEeUJls28dG]Y'MG]YT\AU&LHRP/SuFD_?-CEcQG7F`MSBDD -#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/onecode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp onecode 0.0 2015050900 101896 104906 +%%BeginData: 335 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/onecode { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /height 0.15 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + + /barlen barcode length def + + % Create the human readable text + /txtdict << + 2 dup + 5 dup + barcode 5 1 getinterval (9) eq {14} {11} ifelse dup + 20 dup + 25 dup + 29 dup + >> def + /txt barlen 6 add array def + /spacecnt 0 def + 0 1 barlen 1 sub { + /i exch def + txtdict i known { + txt i spacecnt add [( ) 0 0 () 0] put + /spacecnt spacecnt 1 add def + } if + txt i spacecnt add [barcode i 1 getinterval 0 0 () 0] put + } for + /txt txt 0 barcode length spacecnt add getinterval def + + /normalize { + /base exch def + /num exch def + num length 1 sub -1 1 { + /i exch def + num i 1 sub 2 copy get num i get base idiv add put + num i num i get base mod put + } for + { %loop - extend input as necessary + num 0 get base lt {exit} if + /num [0 num {} forall] def + num 0 num 0 get num 1 get base idiv add put + num 1 num 1 get base mod put + } loop + % Trim leading zeros + /num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def + num length 0 eq {/num [0] def} if + num + } bind def + + /bigadd { + 2 copy length exch length + 2 copy sub abs /offset exch def + lt {exch} if + /a exch def /b exch def + 0 1 b length 1 sub { + dup a exch offset add 2 copy get b 5 -1 roll get add put + } for + a + } bind def + + % Conversion of data fields into binary data + barlen 20 eq {[0]} if + barlen 25 eq {[1]} if + barlen 29 eq {[1 0 0 0 0 1]} if + barlen 31 eq {[1 0 0 0 1 0 0 0 0 1]} if + /binval exch [barcode 20 barlen 20 sub getinterval {48 sub} forall] bigadd def + /binval [binval {} forall barcode 0 get 48 sub] def + /binval [binval {5 mul} forall] [barcode 1 get 48 sub] bigadd 10 normalize def + /binval [binval {} forall barcode 2 18 getinterval {48 sub} forall] def + + % Conversion of binary data into byte array + /bytes 13 array def + /bintmp [binval {} forall] def + 12 -1 0 { + /i exch def + 0 1 bintmp length 2 sub { + /j exch def + bintmp j 1 add 2 copy get bintmp j get 256 mod 10 mul add put + bintmp j bintmp j get 256 idiv put + } for + bytes i bintmp bintmp length 1 sub get 256 mod put + bintmp bintmp length 1 sub 2 copy get 256 idiv put + } for + + % Generation of 11-bit CRC on byte array + /fcs 2047 def + /dat bytes 0 get 5 bitshift def + 6 { + fcs dat xor 1024 and 0 ne { + /fcs fcs 1 bitshift 3893 xor def + } { + /fcs fcs 1 bitshift def + } ifelse + /fcs fcs 2047 and def + /dat dat 1 bitshift def + } repeat + 1 1 12 { + bytes exch get 3 bitshift /dat exch def + 8 { + fcs dat xor 1024 and 0 ne { + /fcs fcs 1 bitshift 3893 xor def + } { + /fcs fcs 1 bitshift def + } ifelse + /fcs fcs 2047 and def + /dat dat 1 bitshift def + } repeat + } for + + % Conversion from binary data to codewords + /codewords 10 array def + 9 -1 0 { + /i exch def + i 9 eq { + /b 636 def + } { + /b 1365 def + } ifelse + 0 1 binval length 2 sub { + /j exch def + binval j 1 add 2 copy get binval j get b mod 10 mul add put + binval j binval j get b idiv put + } for + codewords i binval binval length 1 sub get b mod put + binval binval length 1 sub 2 copy get b idiv put + } for + + % Inserting additional information into codewords + codewords 9 codewords 9 get 2 mul put + fcs 1024 and 0 ne { + codewords 0 codewords 0 get 659 add put + } if + + % Conversion from codewords to characters + /tab513 [ + 31 7936 47 7808 55 7552 59 7040 61 6016 62 3968 79 7744 87 + 7488 91 6976 93 5952 94 3904 103 7360 107 6848 109 5824 110 3776 + 115 6592 117 5568 118 3520 121 5056 122 3008 124 1984 143 7712 151 + 7456 155 6944 157 5920 158 3872 167 7328 171 6816 173 5792 174 3744 + 179 6560 181 5536 182 3488 185 5024 186 2976 188 1952 199 7264 203 + 6752 205 5728 206 3680 211 6496 213 5472 214 3424 217 4960 218 2912 + 220 1888 227 6368 229 5344 230 3296 233 4832 234 2784 236 1760 241 + 4576 242 2528 244 1504 248 992 271 7696 279 7440 283 6928 285 5904 + 286 3856 295 7312 299 6800 301 5776 302 3728 307 6544 309 5520 310 + 3472 313 5008 314 2960 316 1936 327 7248 331 6736 333 5712 334 3664 + 339 6480 341 5456 342 3408 345 4944 346 2896 348 1872 355 6352 357 + 5328 358 3280 361 4816 362 2768 364 1744 369 4560 370 2512 372 1488 + 376 976 391 7216 395 6704 397 5680 398 3632 403 6448 405 5424 406 + 3376 409 4912 410 2864 412 1840 419 6320 421 5296 422 3248 425 4784 + 426 2736 428 1712 433 4528 434 2480 436 1456 440 944 451 6256 453 + 5232 454 3184 457 4720 458 2672 460 1648 465 4464 466 2416 468 1392 + 472 880 481 4336 482 2288 484 1264 488 752 527 7688 535 7432 539 + 6920 541 5896 542 3848 551 7304 555 6792 557 5768 558 3720 563 6536 + 565 5512 566 3464 569 5000 570 2952 572 1928 583 7240 587 6728 589 + 5704 590 3656 595 6472 597 5448 598 3400 601 4936 602 2888 604 1864 + 611 6344 613 5320 614 3272 617 4808 618 2760 620 1736 625 4552 626 + 2504 628 1480 632 968 647 7208 651 6696 653 5672 654 3624 659 6440 + 661 5416 662 3368 665 4904 666 2856 668 1832 675 6312 677 5288 678 + 3240 681 4776 682 2728 684 1704 689 4520 690 2472 692 1448 696 936 + 707 6248 709 5224 710 3176 713 4712 714 2664 716 1640 721 4456 722 + 2408 724 1384 728 872 737 4328 738 2280 740 1256 775 7192 779 6680 + 781 5656 782 3608 787 6424 789 5400 790 3352 793 4888 794 2840 796 + 1816 803 6296 805 5272 806 3224 809 4760 810 2712 812 1688 817 4504 + 818 2456 820 1432 824 920 835 6232 837 5208 838 3160 841 4696 842 + 2648 844 1624 849 4440 850 2392 852 1368 865 4312 866 2264 868 1240 + 899 6200 901 5176 902 3128 905 4664 906 2616 908 1592 913 4408 914 + 2360 916 1336 929 4280 930 2232 932 1208 961 4216 962 2168 964 1144 + 1039 7684 1047 7428 1051 6916 1053 5892 1054 3844 1063 7300 1067 6788 1069 + 5764 1070 3716 1075 6532 1077 5508 1078 3460 1081 4996 1082 2948 1084 1924 + 1095 7236 1099 6724 1101 5700 1102 3652 1107 6468 1109 5444 1110 3396 1113 + 4932 1114 2884 1116 1860 1123 6340 1125 5316 1126 3268 1129 4804 1130 2756 + 1132 1732 1137 4548 1138 2500 1140 1476 1159 7204 1163 6692 1165 5668 1166 + 3620 1171 6436 1173 5412 1174 3364 1177 4900 1178 2852 1180 1828 1187 6308 + 1189 5284 1190 3236 1193 4772 1194 2724 1196 1700 1201 4516 1202 2468 1204 + 1444 1219 6244 1221 5220 1222 3172 1225 4708 1226 2660 1228 1636 1233 4452 + 1234 2404 1236 1380 1249 4324 1250 2276 1287 7188 1291 6676 1293 5652 1294 + 3604 1299 6420 1301 5396 1302 3348 1305 4884 1306 2836 1308 1812 1315 6292 + 1317 5268 1318 3220 1321 4756 1322 2708 1324 1684 1329 4500 1330 2452 1332 + 1428 1347 6228 1349 5204 1350 3156 1353 4692 1354 2644 1356 1620 1361 4436 + 1362 2388 1377 4308 1378 2260 1411 6196 1413 5172 1414 3124 1417 4660 1418 + 2612 1420 1588 1425 4404 1426 2356 1441 4276 1442 2228 1473 4212 1474 2164 + 1543 7180 1547 6668 1549 5644 1550 3596 1555 6412 1557 5388 1558 3340 1561 + 4876 1562 2828 1564 1804 1571 6284 1573 5260 1574 3212 1577 4748 1578 2700 + 1580 1676 1585 4492 1586 2444 1603 6220 1605 5196 1606 3148 1609 4684 1610 + 2636 1617 4428 1618 2380 1633 4300 1634 2252 1667 6188 1669 5164 1670 3116 + 1673 4652 1674 2604 1681 4396 1682 2348 1697 4268 1698 2220 1729 4204 1730 + 2156 1795 6172 1797 5148 1798 3100 1801 4636 1802 2588 1809 4380 1810 2332 + 1825 4252 1826 2204 1857 4188 1858 2140 1921 4156 1922 2108 2063 7682 2071 + 7426 2075 6914 2077 5890 2078 3842 2087 7298 2091 6786 2093 5762 2094 3714 + 2099 6530 2101 5506 2102 3458 2105 4994 2106 2946 2119 7234 2123 6722 2125 + 5698 2126 3650 2131 6466 2133 5442 2134 3394 2137 4930 2138 2882 2147 6338 + 2149 5314 2150 3266 2153 4802 2154 2754 2161 4546 2162 2498 2183 7202 2187 + 6690 2189 5666 2190 3618 2195 6434 2197 5410 2198 3362 2201 4898 2202 2850 + 2211 6306 2213 5282 2214 3234 2217 4770 2218 2722 2225 4514 2226 2466 2243 + 6242 2245 5218 2246 3170 2249 4706 2250 2658 2257 4450 2258 2402 2273 4322 + 2311 7186 2315 6674 2317 5650 2318 3602 2323 6418 2325 5394 2326 3346 2329 + 4882 2330 2834 2339 6290 2341 5266 2342 3218 2345 4754 2346 2706 2353 4498 + 2354 2450 2371 6226 2373 5202 2374 3154 2377 4690 2378 2642 2385 4434 2401 + 4306 2435 6194 2437 5170 2438 3122 2441 4658 2442 2610 2449 4402 2465 4274 + 2497 4210 2567 7178 2571 6666 2573 5642 2574 3594 2579 6410 2581 5386 2582 + 3338 2585 4874 2586 2826 2595 6282 2597 5258 2598 3210 2601 4746 2602 2698 + 2609 4490 2627 6218 2629 5194 2630 3146 2633 4682 2641 4426 2657 4298 2691 + 6186 2693 5162 2694 3114 2697 4650 2705 4394 2721 4266 2753 4202 2819 6170 + 2821 5146 2822 3098 2825 4634 2833 4378 2849 4250 2881 4186 2945 4154 3079 + 7174 3083 6662 3085 5638 3086 3590 3091 6406 3093 5382 3094 3334 3097 4870 + 3107 6278 3109 5254 3110 3206 3113 4742 3121 4486 3139 6214 3141 5190 3145 + 4678 3153 4422 3169 4294 3203 6182 3205 5158 3209 4646 3217 4390 3233 4262 + 3265 4198 3331 6166 3333 5142 3337 4630 3345 4374 3361 4246 3393 4182 3457 + 4150 3587 6158 3589 5134 3593 4622 3601 4366 3617 4238 3649 4174 3713 4142 + 3841 4126 4111 7681 4119 7425 4123 6913 4125 5889 4135 7297 4139 6785 4141 + 5761 4147 6529 4149 5505 4153 4993 4167 7233 4171 6721 4173 5697 4179 6465 + 4181 5441 4185 4929 4195 6337 4197 5313 4201 4801 4209 4545 4231 7201 4235 + 6689 4237 5665 4243 6433 4245 5409 4249 4897 4259 6305 4261 5281 4265 4769 + 4273 4513 4291 6241 4293 5217 4297 4705 4305 4449 4359 7185 4363 6673 4365 + 5649 4371 6417 4373 5393 4377 4881 4387 6289 4389 5265 4393 4753 4401 4497 + 4419 6225 4421 5201 4425 4689 4483 6193 4485 5169 4489 4657 4615 7177 4619 + 6665 4621 5641 4627 6409 4629 5385 4633 4873 4643 6281 4645 5257 4649 4745 + 4675 6217 4677 5193 4739 6185 4741 5161 4867 6169 4869 5145 5127 7173 5131 + 6661 5133 5637 5139 6405 5141 5381 5155 6277 5157 5253 5187 6213 5251 6181 + 5379 6165 5635 6157 6151 7171 6155 6659 6163 6403 6179 6275 6211 5189 4681 + 4433 4321 3142 2634 2386 2274 1612 1364 1252 856 744 496 + ] def + + /tab213 [ + 3 6144 5 5120 6 3072 9 4608 10 2560 12 1536 17 4352 18 + 2304 20 1280 24 768 33 4224 34 2176 36 1152 40 640 48 384 + 65 4160 66 2112 68 1088 72 576 80 320 96 192 129 4128 130 + 2080 132 1056 136 544 144 288 257 4112 258 2064 260 1040 264 528 + 513 4104 514 2056 516 1032 1025 4100 1026 2052 2049 4098 4097 2050 1028 + 520 272 160 + ] def + + /chars 10 array def + 0 1 9 { + /i exch def + codewords i get dup 1286 le { + tab513 exch get + } { + tab213 exch 1287 sub get + } ifelse + chars i 3 -1 roll put + } for + + 9 -1 0 { + /i exch def + 2 i exp cvi fcs and 0 ne { + chars i chars i get 8191 xor put + } if + } for + + % Conversion from characters to the OneCode encoding + /barmap [ + 7 2 4 3 1 10 0 0 9 12 2 8 5 5 6 11 8 9 3 1 + 0 1 5 12 2 5 1 8 4 4 9 11 6 3 8 10 3 9 7 6 + 5 11 1 4 8 5 2 12 9 10 0 2 7 1 6 7 3 6 4 9 + 0 3 8 6 6 4 2 7 1 1 9 9 7 10 5 2 4 0 3 8 + 6 2 0 4 8 11 1 0 9 8 3 12 2 6 7 7 5 1 4 10 + 1 12 6 9 7 3 8 0 5 8 9 7 4 6 2 10 3 4 0 5 + 8 4 5 7 7 11 1 9 6 0 9 6 0 6 4 8 2 1 3 2 + 5 9 8 12 4 11 6 1 9 5 7 4 3 3 1 2 0 7 2 0 + 1 3 4 1 6 10 3 5 8 7 9 4 2 11 5 6 0 8 7 12 + 4 2 8 1 5 10 3 0 9 3 0 9 6 5 2 4 7 8 1 7 + 5 0 4 5 2 3 0 10 6 12 9 2 3 11 1 6 8 8 7 9 + 5 4 0 11 1 5 2 2 9 1 4 12 8 3 6 6 7 0 3 7 + 4 7 7 5 0 12 1 11 2 9 9 0 6 8 5 3 3 10 8 2 + ] def + + /bbs 65 array def + /bhs 65 array def + 0 1 64 { + /i exch def + /dec chars barmap i 4 mul get get 2 barmap i 4 mul 1 add get exp cvi and 0 ne def + /asc chars barmap i 4 mul 2 add get get 2 barmap i 4 mul 3 add get exp cvi and 0 ne def + dec not asc not and { + bbs i 3 height mul 8 div put + bhs i 2 height mul 8 div put + } if + dec not asc and { + bbs i 3 height mul 8 div put + bhs i 5 height mul 8 div put + } if + dec asc not and { + bbs i 0 height mul 8 div put + bhs i 5 height mul 8 div put + } if + dec asc and { + bbs i 0 height mul 8 div put + bhs i 8 height mul 8 div put + } if + } for + + % Return the arguments + << + /ren //renlinear + /bbs bbs + /bhs bhs + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + /txt txt + /textxalign (left) + /textfont /Helvetica + /textyoffset 1 + /textxoffset -0.3 + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/onecode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER onecode-- @@ -2620,53 +8019,148 @@ D.FC]E#GEQnu061WACh[cu@<.N1Ou[rR%[&V$Df0,rDe*FB30If*F_`U>D_?-CEcQG7F`MSBDD % --EXAM: 01234 % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp postnet 0.0 0 0 0 -%%BeginData: 45 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\KFD5Z2F*j( NAmoLs AWf 3 'P!F GY<0 B5( @ZmRN0oc8t P)XR(F_-_!H -]ftD5*C&O5*@^MH ]ft&Ec krV 1OYE dI?J 0)* g/N:DfBf4D f0WZ5*@^MP# -Q@=FD5Z2F*j'+I? I/TFC f]=A oDR/+ EV1> FCo H/FHS5=1G< i]G]\"@H=\4 -@AU&<$2@<-0qDMS[`D3>$K04K->E,[FKDf^##:f@;0doATDg0EfrY8P#Pn!Eas#uAUBS"LbP!(P!4[^P#.<^HS8iPBlJ#DE, -Tf>DImoV@:V`=@<,ddFCfKQ,uml?;]nn4;cHL\<$6%#F*&O7Df0Z*Bl5&3DJXS@A8,[jFE9)gE -a`['AS#n&DfV"*I?IQXP"@<9@<,jk@<-FL$8=1i1GgsI2`Ng\1G<6OARfLsF_up7Ou%moL]Lsn -Ebo<)L]N[U$Bf.eWJCnEC6CAr@;KXg@_99O.=04K->E,[FKDf^#OpR:-04f$2+D#G#F,10d99M(aBOtmjBQS;BOtmjBQS5?'9 -G\P"76;DIXf#DI[`1@q]F`CNFW8P"Uro05+p2B4uC.+D#G#P%'R\Ou%moL]M()A!1;W!KsF/05 -?Y6Ou$c_BkM+$F!,3?ASu!#C5;nR9Tgr?ASGdjFHUHr"d1d,G^Y`G@VBg*@UX:nAT!;-P&,pTO -o]6-BkM+$F-:f_DI[L*A7]7aARfLiDKKH7FF,-PG]Y';@<-0qDBN.+@UX:eBOPq&+Cf(r@r$.. -D284U9O_FNCh7L?"d3\X!KmJ@5Z@F'P&,5OG]\4LAnH*qF5?'9G -\HZXLS+C\c"Ch7K,>E/_,@UX:nAT!;-P&,pTOo^A0P&,plOu@DnG]\4LAnH*qF5?'9G\P#X/HDIXf#DI[aD$^+/G1G+D#G#+DQ]5P"_#iBOtmjBQTDRL]rr"P'DD<87H7R+C\c"Ch7L?" -d3\X#*K"#ASGdjFEGL]N[ -% uk.co.terryburton.bwipp/postnet 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp postnet 0.0 2015050900 65689 65439 +%%BeginData: 140 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/postnet { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /validatecheck false def + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.125 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /barlen barcode length validatecheck {1 sub} if def + + % Validate the input + barlen 5 ne barlen 9 ne and barlen 11 ne and { + /bwipp.postnetBadLength (USPS POSTNET must be 5, 9 or 11 digits excluding check digit) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.postnetBadCharacter (USPS POSTNET must contain only digits) //raiseerror exec + } if + } forall + + % Create a string of the available characters + /barchars (0123456789) def + + /checksum 0 def + 0 1 barlen 1 sub { + /i exch def + /checksum checksum barcode i get 48 sub add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.postnetBadCheckDigit (Incorrect USPS POSTNET check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + % Create an array containing the character mappings + /encs + [ (55222) (22255) (22525) (22552) (25225) + (25252) (25522) (52225) (52252) (52522) + (5) (5) + ] def + + /bhs barlen 5 mul 7 add array def + /txt barlen 1 add array def + + % Put start character + /enc encs 10 get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs 0 heights putinterval % Put encoded digit into sbs + + 0 1 barlen 1 sub { + /i exch def + /enc encs barcode i get 48 sub get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs i 5 mul 1 add heights putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 5 mul 1 add 3.312 mul textyoffset textfont textsize] put + } for + + % Put the checksum character + /enc encs checksum get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs barlen 5 mul 1 add heights putinterval + + includecheckintext { + txt barlen [barchars checksum 1 getinterval barlen 5 mul 1 add 3.312 mul textyoffset textfont textsize] put + } { + txt barlen [( ) barlen 5 mul 1 add 72 mul 25 div textyoffset textfont textsize] put + } ifelse + + % Put end character + /enc encs 11 get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs barlen 5 mul 6 add heights putinterval + + % Return the arguments + << + /ren //renlinear + /bhs bhs + /bbs [bhs length {0} repeat] + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/postnet dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER postnet-- @@ -2677,52 +8171,149 @@ V,9E+*6lBl7R3P#M~> % --EXAM: 01234567890 % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp planet 0.0 0 0 0 -%%BeginData: 44 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ AmoLs AWe i&G %# 3$ A79 Rk@ q]F`CE R4 tCia0N 1G< -H[@r-9uARfCb@r# drFC f]= +D ,% uF( LLj 06C cMFC -oH/FHOV,1GO u"b 5AU &F Cf]= AoD R/OtDhQ06C cMFE;/BAKZ) -+G]\"@H=`6mOu"b 5AU&< BDe)Q;c$C -8:eX/M78tCHF`VXI@V$Z:0d(CT+>GYpA8,[jFE8R9G[kQ4A8,po+Cf(r@r!2tBkM.%0/%?SBld -isEcQ)=P!=AX<+99V@rGmhH]g@E0Tp%25);4^:m,jG04K->E,[FKCgh3mF@'DH6YKnK@:OCjEf -MDF;c$C8:eX/M78tCHF`VXI@rH7,@;0U%Df0B:+Co2!BlnDL061K8F(Jp'Ec5u]5CJ\oI?I/T@ -UX:eBOPq&NX@Hp1,CaE2E*TUOu"b$BOt[hF*2>U!0T-o!/LYb@<-0qDMS=VWI$:4P!5$b04S[, -@r$..D'3>%ARfLsF_r71@<,jrA7ZltP"UTbP,XTFOu%NL82"IdARfLsF_upA@q]F`CNFW8L^K; -[P,X6EP%p.9G%#3$A79Rk@q]F`CO715@<,jrA7Zlm@<-0qDN[Y%@<,jk@<-E3@q]F`CNFW8P"U -sTHS8iPBlJ#DE,8s#ATU7IA4($A@r"JHB5)IJ.S4MfDfTl0@rrhn;c$C8:eX/M78tC>BOt[h+C -o2!BlkJ:Ec6,8A7]:)061K8F(Jp'Ec5u]5CJ\o04J@1@rGmh+C\c"@rGmhL]CmmEbo<)P"_#pI -?IP_ASu"!+Bsj01,:^E23%ht2)R-ENWh9t1,UhI"Z8.m1,Y'q2)7$H16)Mq1,UgENWh9q1,UqL -"Yqqm2):0q1,UpE23%hq2)7$HNWD"t!B"/G1G<3NF!+q#Ebo<)L]rrXL^0(DOpR:-06DG\+C\c -"Ch7L?!KmJH$'I(tASu!#ASu"!L^K;/8/U/B4uCMCkr7X2Ni<5P"9%qF,0g0ASGdjFE/8/U/B4uCMCkr7X -2Ni<5P"9%qF!,1Q"d3\X!KmIsASGdjFEFCoH/F_99M(aBOtmjBQS;FCoH/FFCoH/F1_dD -D*Y`ASuGH\_ZMP(R$nF(025>9IBgF-:!g!KsF/MEeUJ -m#"$rS[*[,K8Mn';=%R2Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/planet 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp planet 0.0 2015050900 65565 65215 +%%BeginData: 141 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/planet { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /validatecheck false def + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.125 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /barlen barcode length validatecheck {1 sub} if def + + % Validate the input + barlen 11 ne barlen 13 ne and { + /bwipp.planetBadLength (USPS PLANET must be 11 or 13 digits excluding check digit) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.planetBadCharacter (USPS PLANET must contain only digits) //raiseerror exec + } if + } forall + + % Create a string of the available characters + /barchars (0123456789) def + + % Calculate the checksum + /checksum 0 def + 0 1 barlen 1 sub { + /i exch def + /checksum checksum barcode i get 48 sub add def + } for + /checksum 10 checksum 10 mod sub 10 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.planetBadCheckDigit (Incorrect USPS PLANET check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + % Create an array containing the character mappings + /encs + [ (22555) (55522) (55252) (55225) (52552) + (52525) (52255) (25552) (25525) (25255) + (5) (5) + ] def + + /bhs barlen 5 mul 7 add array def + /txt barlen 1 add array def + + % Put start character + /enc encs 10 get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs 0 heights putinterval % Put encoded digit into sbs + + 0 1 barlen 1 sub { + /i exch def + /enc encs barcode i get 48 sub get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs i 5 mul 1 add heights putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 5 mul 1 add 3.312 mul textyoffset textfont textsize] put + } for + + % Put the checksum character + /enc encs checksum get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs barlen 5 mul 1 add heights putinterval + + includecheckintext { + txt barlen [barchars checksum 1 getinterval barlen 5 mul 1 add 3.312 mul textyoffset textfont textsize] put + } { + txt barlen [( ) barlen 5 mul 1 add 72 mul 25 div textyoffset textfont textsize] put + } ifelse + + % Put end character + /enc encs 11 get def + /heights enc length array def + 0 1 enc length 1 sub { + /j exch def + heights j enc j 1 getinterval cvi height mul 5 div put + } for + bhs barlen 5 mul 6 add heights putinterval + + % Return the arguments + << + /ren //renlinear + /bhs bhs + /bbs [bhs length {0} repeat] + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/planet dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER planet-- @@ -2733,56 +8324,153 @@ m#"$rS[*[,K8Mn';=%R2Bl7EsF_#'*AU&:%52X=FD5Z2F- 8_M1G <3G Eas # uAW f6? 1G< 9WDKKE 0@ Am oLs AWe i&FC -f]=AoDR/OiNV@06 CcMF E ;/ BA V^\ V1G X4aVt -cOu8C3DfBf4Df0W CP,i2' Cia 0 N4aW >WI? IQm 30Ia6V33Qn !BlU*FE2M8P -!+/T/Wr;\FcnqO1 OXV5/T c#U AWei tP#Z pnA We*t3A5;iF D5Z2F-8_M1O -YEcDfBf4Df0WCOu %NL8M >0sG ][P9D KI"C AU& FE;/BAWe^ 01G>#B4u CM09S+E @UX:eB OPq&N [.e .<``C+2)$a ?1GhEV2`Nf` -84,d67Rp3F8kViP<)6=f;H&`704S[(Ectl-F,2*)23KbO!/LZ3,C?Dg.!;Ou"b$BOt[hF*2>0Det40Ou%mo -L]LsnEbo<)L]N[99M(a@q]F`CNFW -8Ec6.E@q]F`CNFW8Ec6.EBl7I+L^'#?Oo^_%04S[,@r$..D.@L#+Cf(r@r$..D.@L#+DG_(G_c -QeC6AU\1OYEW04S[,@r$..D'3>%ARfLsF_u/;GDHHdC5<(WCh%-i@r$..D.@L#L^'#WOo^_%G% -#3$A79Rk@q]F`CO715@<,jrA7Zlm@<-0qDN[Y%@<,jk@<-E3@q]F`CNFW8P"UsTHS8iPBlJ#DE -c653Ci*TpCdMQ@6YL%@CIDlLBlo@]8T&$VEcP`$FG%kJu -A1oTV@;0doATDg0EfrY8P#O)D@<,jrA7Zlm@<,jrA7^Ps@UX:nAT!Z)Ou%NL<%hg#@ribsNW_- -o0JJLi1,:R=NW_*n0JSRj1,CX=NW_-n0JSRj1GU[=NW_'k1,=jm0JG:=NW_$j1,Fpn0JP@=NW_ -'j1,Fpn0ebC=NW_'m0J\Xk0JY@=NW_$l0Je^l0JbF=NW_'l0Je^l0etI=NW_'m1,+^k0JYF=NW -_$l1,4dl0JbL=NW_'l1,4dl0etO=NW_-m0J\Xk1,(F=NW_*l0Je^l1,1L=NW_-l0Je^l1GCO=N -W_-m1,+^k1,(L=NW_*l1,4dl1,1R=NW_-l1,4dl1GCU=NWCnq!Ae#E1G<9IB`Eas#uAKY]C!Kp,jL]ilWL]NY>MEk,7c]W*dAU&FCf]=F(or3+C1.TI?I-4DI[a0EZeh"Ebo<)L]ilWL]NY>ASu"!+Cf(r@r$..D -3@PTH"h/+Cis9"@q]F`CM@[.AU&9IB`EarckEcW@5BOt[hF*2>U!Kp,c -@<-0qDMSFYCkr+T!K'-@pWo"=FCf]=H#I;,F(KG9FCf]=AoDR/+EV1>FE;/BAKY9AG^Xp\G]Y' -;@<-0qDBN/D!?bi[Ebo<)L]ilWL]NY>MEk,7c]W*dAU&FCf]=F(o -r3+C1.TI?ITADI[a0EZeh"Ebo<)L]ilWL]rqBASu"!LaA3WP'J]i@WNZ'DI[a0Efsmp$'I(t@V -Bg*ASu"!FE3OROpR:-L]E53ASu"!FE3ORL]N[ -% uk.co.terryburton.bwipp/royalmail 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp royalmail 0.0 2015050900 66136 65853 +%%BeginData: 145 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/royalmail { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /validatecheck false def + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.175 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create a string of the available characters + /barchars (ZUVWXY501234B6789AHCDEFGNIJKLMTOPQRS) def + /charvals 36 dict def + 0 1 35 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.royalmailBadCharacter (RM4SCC must contain only capital letters and digits) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksumrow 0 def + /checksumcol 0 def + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + /checksumrow checksumrow indx 6 idiv add def + /checksumcol checksumcol indx 6 mod add def + } for + /checksum checksumrow 6 mod 6 mul checksumcol 6 mod add def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.royalmailBadCheckDigit (Incorrect RM4SCC check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + % Create an array containing the character mappings + /encs + [ (3300) (2211) (2301) (2310) (3201) (3210) + (1122) (0033) (0123) (0132) (1023) (1032) + (1302) (0213) (0303) (0312) (1203) (1212) + (1320) (0231) (0321) (0330) (1221) (1230) + (3102) (2013) (2103) (2112) (3003) (3012) + (3120) (2031) (2121) (2130) (3021) (3030) + (2) (3) + ] def + + /encstr barlen 4 mul 6 add string def + /txt barlen 1 add array def + + % Put start character + encstr 0 encs 36 get putinterval + + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + encstr i 4 mul 1 add encs indx get putinterval + txt i [barcode i 1 getinterval i 4 mul 1 add 3.312 mul textyoffset textfont textsize] put + } for + + % Put the checksum character + encstr barlen 4 mul 1 add encs checksum get putinterval + includecheckintext { + txt barlen [barchars checksum 1 getinterval barlen 4 mul 1 add 3.312 mul textyoffset textfont textsize] put + } { + txt barlen [( ) barlen 4 mul 1 add 3.312 mul textyoffset textfont textsize] put + } ifelse + + % Put end character + encstr barlen 4 mul 5 add encs 37 get putinterval + + /bbs encstr length array def + /bhs encstr length array def + 0 1 encstr length 1 sub { + /i exch def + /enc encstr i 1 getinterval def + enc (0) eq { + bbs i 3 height mul 8 div put + bhs i 2 height mul 8 div put + } if + enc (1) eq { + bbs i 0 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (2) eq { + bbs i 3 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (3) eq { + bbs i 0 height mul 8 div put + bhs i 8 height mul 8 div put + } if + } for + + % Return the arguments + << + /ren //renlinear + /bbs bbs + /bhs bhs + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/royalmail dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER royalmail-- @@ -2793,67 +8481,210 @@ bFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> % --EXAM: 5956439111ABA 9 % --EXOP: includetext custinfoenc=character % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp auspost 0.0 0 0 0 -%%BeginData: 59 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\H\`B !23 -JD%DfBf4Df0WZ5* @]T@U X:e De* F B5* @]T A8c @-A9)+ &+ D,%uF( LLj -055<6Cis9"FCf]= +D,%u F(L Lj0 6C cM FCo H/F HOV,1G Ou"b5AU&K FD5 Z2F*j(NAmo LsAWf3'P!FG -Y<0B5(@ZmRN0oc8 tP)XR( F_- _ !H]f tD5* C&O 5*@^MH]ft& EckrV1OYEdI -?J0)*g/N:DfBf4D f0WZ5* @^M P#Q@ =FD5 Z2F *j'+I?I/TF Cf]=AoDR/+E -V1>FCoH/FHS5=1G i0 f"a k0JY>B"#)J bNWUsj16)Gk -0JJLh0eb>B"#2JbNWV!j0TH5i0en[j0ekGD"#2PbNWV!k0oc>j1,=jl1,(DB"#;PbNWV$j16)G -l0eeUi1,1MD"#;SdNWV$l0TH5j1,4dk1,:VF"#DVbNWV'k0oc>l0J\Xj1GLSD"#DYdNWV'l16) -Gm1,+^j1GU\F"#D\fNWUsj1QDPk1GFgk0JbGD"#)MdNWUsk1QDPl0Je^k0ekJE"#2PeNWV!l0T -H5i1GOml0f(SF"#2SfNWV$j1QDPm0f+gl1,:YG"#;YdNWV$m0oc>k1GXsm1,C_H"#DVeNWV'l1 -QDPn1,Fpm1G^_F"#D_fNWV'n16)Gm1Gb$n0JG;C"#)GcNWLmgNWLmhNWLmiNWLphNWLpiNWLpj -NWLsiNWLsjNWLskNWM!jNWLpkNWCqAOu"b#@<,jk@<-FL5X@_(6q'R884cEH9MJ8X:f1+h<)lt -#=BSf]0etOA2)[BQ3FQB,A7]@cBPD3sCi+'.E,fo>FEMbNG^4TX,Eai9@UX:nASrW"@<,jrA7^ -p5Ou$QUEas#uAV^>B!g66;!\lEm4aVu2I?IQ=@<,jrA7^PsL]W`5NWM$pP!+/J-%1qU@UX:eDe -*F8!/L]>9TB033KcOPLbsOC<+99V@rGmhL]E54P"^l;2DUFYH\b%;P#O)GDI[a0EfrVLV33VfF -EhmM@UX:nAT!;*P,XTNOu$Ze@rla4L]D"(@rmGuP"Us`L]E53L]MiUBp(ZC1M(H6F!+q#Eas#u -AKY]C!Kp->/;QQS!Kp)eDI[a0EZf(P!g7AU!g3S?",I#ALQZq2P":B1L]N;%H$":Q+DHW5P,VY.@UX -:eDe*E%BnueQ9PK:aP,X6=P&,pYOo^G*;tnV$Cij65FEqe:AohO*+EV1>FCoH/F/;QQS!Kp)eDI[a0EZf(P!g7AU(6S]S",I#ALQZq)G]Y'BL^9.E>9IB` -Eas#uAKY]C$BbFG!Kp,jL]W`UL_c-SMEk,7c]W*dAU&FCf]=F(or -3+C1.TI?I,S@qfOkASrW"@<-0qDMSX_WJCV=Cm$T&H\_ZX!FfJXCh7L?$^.K9056S5Ou$QUEas -#uAKY]C$BbFG!Kp,c@<,jk@<-FP5*CngFcp2eBl7I+P!5$bP')q104f$2+D#G#F!,17A9a81Ou -$Ze@rla4+DHW6P&,piOo]-3A!2+ZG]Y'BL^9.E>9IB`Eas#uAKY]C$BbFG!Kp,jL]`fVL_c-SM -Ek,7c]W*dAU&FCf]=F(or3+C1.TI?I,S@qfOkASrW"@<-0qDMSX_ -WJCY>Cm$T&P#[;R@qfOkAT!Y3L]M()@rla4P%'4WP,We>DI[a0EfrUtDI[aD99Mr2H$tiH062, -U@:F%aLd6b]P&-9fOu%-"FCAWpAV^=jLd6DN98!JiseI?I-,P'J -^"Eb0EM!Ko6p5^P/%AU&;>E,oN5L]NYLOu$ueG]\a,Op$R@P&5P!DIn'7+Dtb8FGN;I_3-U&P# -R5;L]N;rHS9,s5*@]TDIn'7@qBImHQ[?MFCAWpAV`ThAU&<[Chf+6I?HC(AU&<,ASc0*EcZ>2@ -VfV35]CaTG*6ZVOo^_=L]NYLP'CkUG][G,Ci#8-Ld7++L]ETTHZ!D>FCSluC`mV,G][G,Ci#8- -LdR?AP'DD<<.0p#05trCFs([6G]]*)I?K49EcY`/A7]g)ASu"!FE3ORL_,`KL]`fP#@IBL]N[P"_#iL]ilWOo -]-3@rla4+DHW5Oo^@>P"_#iOo^_jI?I-AF(9-!ATO#DL]rs@M#W82HS9)r5*@^X!/LZ3"FDe:P -!5$bEcY`/A7]g)Bcq/R!HN6kDe*F#+DDs5Oo^_=EcZ>2@VfV35[0$uL_5F`L`V?Q>p*mF99O+3 -F(9-!ATJu.L]ikAP"Ur=P"UtSP'DD<8:?Xl04S[,@r#RmA7^c00JG170JG170JG17L^]HCOr9E -=L]E53L]_uWBp(ZC1G<9IBgF --:!g!KsF/MEeUJm#"$rS[*[,K8Mn';=%R2Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/auspost 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp auspost 0.0 2015050900 75628 75331 +%%BeginData: 202 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/auspost { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.175 def + /custinfoenc (character) def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create an array containing the character mappings + /encs + [ (000) (001) (002) (010) (011) (012) (020) (021) + (022) (100) (101) (102) (110) (111) (112) (120) + (121) (122) (200) (201) (202) (210) (211) (212) + (220) (221) (222) (300) (301) (302) (310) (311) + (312) (320) (321) (322) (023) (030) (031) (032) + (033) (103) (113) (123) (130) (131) (132) (133) + (203) (213) (223) (230) (231) (232) (233) (303) + (313) (323) (330) (331) (332) (333) (003) (013) + (00) (01) (02) (10) (11) (12) (20) (21) (22) (30) + (13) (3) + ] def + + % Create a string of the available characters + /barchars (ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz #) def + + /barlen barcode length def + barcode 0 2 getinterval (11) eq {37} if + barcode 0 2 getinterval (45) eq {37} if + barcode 0 2 getinterval (59) eq {52} if + barcode 0 2 getinterval (62) eq {67} if + /encstr exch string def + /txt barlen 2 sub array def + + % Put start character + encstr 0 encs 74 get putinterval + + % Encode the FCC + 0 1 1 { + /i exch def + encs barcode i 1 getinterval cvi 64 add get + encstr i 2 mul 2 add 3 2 roll putinterval + } for + + % Encode the DPID + 2 1 9 { + /i exch def + encs barcode i 1 getinterval cvi 64 add get + encstr i 2 mul 2 add 3 2 roll putinterval + txt i 2 sub [barcode i 1 getinterval i 2 sub 2 mul 6 add 3.312 mul textyoffset textfont textsize] put + } for + + % Encode the customer information + custinfoenc (numeric) eq { + 0 1 barlen 11 sub { + /i exch def + encs barcode i 10 add 1 getinterval cvi 64 add get + encstr i 2 mul 22 add 3 2 roll putinterval + txt i 8 add [barcode i 10 add 1 getinterval i 2 mul 22 add 3.312 mul textyoffset textfont textsize] put + } for + /ciflen barlen 10 sub 2 mul def + } { + 0 1 barlen 11 sub { + /i exch def + barcode i 10 add 1 getinterval barchars exch search + pop + length /indx exch def + pop pop + /enc encs indx get def + encstr i 3 mul 22 add enc putinterval + txt i 8 add [barcode i 10 add 1 getinterval i 3 mul 22 add 3.312 mul textyoffset textfont textsize] put + } for + /ciflen barlen 10 sub 3 mul def + } ifelse + + % Add any filler characters + 22 ciflen add 1 encstr length 14 sub { + encstr exch encs 75 get putinterval + } for + + % Create the 64x64 Reed-Solomon table + /rstable 64 64 mul array def + rstable 0 [ 64 {0} repeat ] putinterval + rstable 64 [ 0 1 63 {} for ] putinterval + /prev 1 def + 64 { + /next prev 1 bitshift def + next 64 and 0 ne { + /next next 67 xor def + } if + 0 1 63 { + /j exch def + /nextcell {rstable 64 next mul j add} def + nextcell rstable 64 prev mul j add get 1 bitshift put + nextcell get 64 and 0 ne { + nextcell nextcell get 67 xor put + } if + } for + /prev next def + } repeat + + % Calculate the Reed-Solomon codes for triples + /rscodes encstr length 16 sub 3 idiv 4 add array def + rscodes 0 [ 4 {0} repeat ] putinterval + 2 3 encstr length 16 sub { + /i exch def + rscodes rscodes length i 2 sub 3 idiv sub 1 sub + encstr i 1 getinterval cvi 16 mul + encstr i 1 add 1 getinterval cvi 4 mul add + encstr i 2 add 1 getinterval cvi add + put + } for + rscodes length 5 sub -1 0 { + /i exch def + 0 1 4 { + /j exch def + rscodes i j add rscodes i j add get + rstable 64 [48 17 29 30 1] j get mul rscodes i 4 add get add get + xor put + } for + } for + /checkcode (000000000000) 12 string copy def + 0 1 3 { + /i exch def + /enc rscodes 3 i sub get 4 3 string cvrs def + checkcode i 3 mul 3 enc length sub add enc putinterval + } for + + % Put checkcode and end characters + encstr encstr length 14 sub checkcode putinterval + encstr encstr length 2 sub encs 74 get putinterval + + /bbs encstr length array def + /bhs encstr length array def + 0 1 encstr length 1 sub { + /i exch def + /enc encstr i 1 getinterval def + enc (0) eq { + bbs i 0 height mul 8 div put + bhs i 8 height mul 8 div put + } if + enc (1) eq { + bbs i 3 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (2) eq { + bbs i 0 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (3) eq { + bbs i 3 height mul 8 div put + bhs i 2 height mul 8 div put + } if + } for + + % Return the arguments + << + /ren //renlinear + /bbs bbs + /bhs bhs + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/auspost dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER auspost-- @@ -2864,43 +8695,119 @@ B\;u~> % --EXAM: 1231FZ13XHS % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp kix 0.0 0 0 0 -%%BeginData: 35 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ Ou" -b5AU&FC f]= AoDR /OtD hQ0 6CcMFE;/BA KZ)+G]\"@H= -`6mOu"b5AU&DM c1QDS l0etP F"> DPd16)Jl0J YGE">MSd16) -Jl0etME">DSc1QD Sl1GCVF ">DVd1 6)Jl1 ,(M E">MYd16)J l1GCSE">DSe -0ocAj1GU\F">DVf0TH8j1,:SE">MYf0TH8j1GUYE">VYc1QDSn0ebDD">V\d16)Jn0JG;C">__ -d16)Jn0ebAC">VYe0ocAl0etJD">V\f0TH8l0JYAC">__f0TH8l0etGC">V_e0ocAl1GCPD">V -bf0TH8l1,(GC">_ef0TH8l1GCLgOu"b#@<,jk@<-FL,VUr.1GgsI2`Nf`6:4.07Rp!@8kViP:/ -=\`;H$Op<``C+>*:Zp@q]:kG%#3.La8-@Ou%moL]N;VHXg_tEctl-F-8_M3+?<:@q]:kF-8_C! -Kp->5*C/=P":B/L]LsnEas#uAWgMY!KsF/@UX:eDe*FB5)96&9OhaEEctl-F-8_M@$5JU04K-> -E,[FFBm;sQA4($=Ea`I"ATEeb91`5.D09oA+Cf>-FCAm$+E).6Gp$U*E+sE&C`mP*FED)7F!+n -/A0>DsB5)I/0/%?SBldisEcQ)=P!=AX<.0p#04J@1Ch7K,@UX:eDe*FB@ZiN#ASu"!FE/L5@<- -0qDMSFYCm(WX1G9IB`Eas#uA -KY]C!Kp,jL]ilWMEk,7c]W*dAU&FCf]=F(or3+C1.TI?I,S@UaC$ -ASu"!FE3OROpR:-04JU9+D#G#F*)Gc@Zh%\1Pc$e!G-.YF*)Gc@Yb&JWI$:4P!5$b04f$2+D#G -#F*)FFBnueQ9Th2CDI\\-0TnSG@UaC$Bnuk)ASGdjFHUHr#a.*/G[b?-+DHW5BOtmjBQTDRL^9 -/%P'DD<<+TrWNWCkt4aUXIF!,1Q!,,qXB4uCMCkr@[2Ni;oBQG;1L]qI'BkM+$P&,p[OuAJJI? -IQ@DI\\-16OeI@UaC$Bnuk)ASGdjFHUHr#a.*/G[b?-+DHW8BOtmjBQTDRL^9/%P'DD<<+TrWN -WCr!4aUXIF!,1Q!,,qXB4uCMCkr@[2Ni;oBQG;1L^7[*BkM+$P&,p[OuAJJI?IQXP"7\t061WA -0/%?WDJX$)ARTU4@UaC$@UaC3@VBg*@VBg9F(025>9IBgF-:!g!KsF/MEeUJm#"$rS[*[,K8Mn -';=%R2Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/kix 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp kix 0.0 2015050900 61942 61672 +%%BeginData: 111 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/kix { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.175 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create an array containing the character mappings + /encs + [ (0033) (0123) (0132) (1023) (1032) (1122) + (0213) (0303) (0312) (1203) (1212) (1302) + (0231) (0321) (0330) (1221) (1230) (1320) + (2013) (2103) (2112) (3003) (3012) (3102) + (2031) (2121) (2130) (3021) (3030) (3120) + (2211) (2301) (2310) (3201) (3210) (3300) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) def + /charvals 36 dict def + 0 1 35 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.kixBadCharacter (KIX must contain only capital letters and digits) //raiseerror exec + } if + } for + + /barlen barcode length def + /encstr barlen 4 mul string def + /txt barlen array def + + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + encstr i 4 mul encs indx get putinterval + txt i [barcode i 1 getinterval i 4 mul 3.312 mul textyoffset textfont textsize] put + } for + + /bbs encstr length array def + /bhs encstr length array def + 0 1 encstr length 1 sub { + /i exch def + /enc encstr i 1 getinterval def + enc (0) eq { + bbs i 3 height mul 8 div put + bhs i 2 height mul 8 div put + } if + enc (1) eq { + bbs i 0 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (2) eq { + bbs i 3 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (3) eq { + bbs i 0 height mul 8 div put + bhs i 8 height mul 8 div put + } if + } for + + % Return the arguments + << + /ren //renlinear + /bbs bbs + /bhs bhs + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/kix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER kix-- @@ -2911,51 +8818,170 @@ Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: 6540123789-A-K-Z % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp japanpost 0.0 0 0 0 -%%BeginData: 43 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%52X=FD5Z2F- 8_M1G <3G Eas # uAW f6? 1G< 9WDKKE 0@ KFD5Z2F*j (NAmoLsAWf3 -'P!FGY<0B5(@ZmR N0oc8t P)X R (F_- _!H] ftD 5*C&O5*@^M H]ft&EckrV1 -OYEdI?J0)*g/N:D fBf4Df 0WZ 5*@^ MP#Q @=F D5Z2F*j'+I ?I/TFCf]=Ao -DR/+EV1>FCoH/FH S5=1G l0Je^k0etP F"#;YeNWV$k -1QDPk1Gb$n0JbDC"#2PbNWV!i16)Gl0eeUi0JP>C"#;PbNWUsj0oc>i0Je^k1G^hI!])Qk!\lK -:Ou"b#@<,jk@<-FL,qq&/1GgsI2`NfL5sdq,77Kd<8P2WL9hnJ\;,U=lL]`fVL]ikAP,4OpR:-ASu"!FE30;ASu"!L_GqEP'J]jBOt[hF*2>U!0T,kC5;kQ1G5?'9FcC*78I!KmJH1OYEWC5;nH'Sl -dQWI$:6P!5$bASu"!FE/L>L]`fVL]W_?ASu"!L^oS@P'J]jBOt[hF*2=B@q]F`CNFW8L^oRKOu -$W_B5)I/+DZcCP'DD<82"IdARfLsF_r72BOt[hF*2>U'9[*d'9YPBWKK&KDI[a0EejdQ'SljSC -m"g1DI[`1@q]F`CNFW8P"Us`ASu"!FE30=L_Y^JP&-9^ASu"!L_Q"FP'J]jBOt[hA8,[jFH-AE -Ou$fi@r-9uARfCb@r#drFCf]=HS8lBARfLdBkM.%+C\c"@q]:kF!+t+ARfLsF_up8P"_#pI?IQ -OG]Y'BL]NY>>9IEhARfLdBkM.%L_PXIP&,pUOo^G*;tnV$Cij65FEqe:AohO*+EV1>FCoH/F>#B4uCMCkr@[2Ni<5P"7\t061WA0/%?WDJX$)ARTU4@UaC$@UaC3@VBg*@VBg9F(025>9 -IBgF-:!g!KsF/MEeUJm#"$rS[*[,K8Mn';=%R2Bl7EsF_#'*AU& -D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtY -uCM@[!I?IP~> -% uk.co.terryburton.bwipp/japanpost 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp japanpost 0.0 2015050900 66345 66129 +%%BeginData: 162 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/japanpost { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /includecheckintext false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.175 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create an array containing the character mappings + % 0123456789- C1C2C3C4C5C6C7C8 ST EN + /encs + [ (300) (330) (312) (132) (321) (303) (123) (231) (213) (033) (030) + (120) (102) (210) (012) (201) (021) (003) (333) + (31) (13) + ] def + + % Create a string of the available characters + /barchars (0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ) def + /barlen barcode length def + + /encstr 20 1 add 3 mul 4 add string def + /digits 20 array def + /txt barlen 1 add array def + + % Put start character + encstr 0 encs 19 get putinterval + + /checksum 0 def + /j 0 def /i 0 def + 0 1 barlen 1 sub { + /i exch def + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard match and post + indx 11 ge indx 37 lt and { % Insert escape + j 18 gt {exit} if % Should fit in 20 chars + % 11-20: C1 (11) + % 21-30: C2 (12) + % 31-36: C3 (13) + /digit indx 1 sub 10 idiv 10 add def + encstr j 3 mul 2 add encs digit get putinterval + /checksum checksum digit add def + digits j digit put + /j j 1 add def + } if + j 19 gt {exit} if % Should fit in 20 chars + /digit 0 def + indx 37 eq { + /digit 14 def % space (C14) + } if + indx 11 ge indx 37 lt and { + /digit indx 1 sub 10 mod def + } if + indx 11 lt { + /digit indx def + } if + encstr j 3 mul 2 add encs digit get putinterval % space + /checksum checksum digit add def + digits j digit put + txt i [barcode i 1 getinterval j 3 mul 2 add 3.312 mul textyoffset textfont textsize] put + /j j 1 add def + } for + + % Fill spaces (c14) at right end + j 1 20 1 sub { + /k exch def + encstr k 3 mul 2 add encs 14 get putinterval + /checksum checksum 14 add def + digits k 14 put + } for + + % Put the checksum character + /checksum checksum 19 mod 19 exch sub def + encstr 2 20 3 mul add encs checksum get putinterval + + % Put end character + encstr 2 21 3 mul add encs 20 get putinterval + /checkdigit ( ) def + includecheckintext { + /checkdigit barchars checksum 1 getinterval def + } if + txt i 1 add [ checkdigit 20 3 mul 2 add 3.312 mul textyoffset textfont textsize] put + + % Put end character + encstr 20 1 add 3 mul 2 add encs 20 get putinterval + + /bbs 21 3 mul 4 add array def + /bhs bbs length array def + 0 1 bbs length 1 sub { + /i exch def + /enc encstr i 1 getinterval def + /bunit 0 def + /hunit 0 def + enc (0) eq { + /bunit 3 def + /hunit 2 def + } if + enc (1) eq { + /bunit 0 def + /hunit 5 def + } if + enc (2) eq { + /bunit 3 def + /hunit 5 def + } if + enc (3) eq { + /bunit 0 def + /hunit 8 def + } if + bbs i bunit height mul 8 div put + bhs i hunit height mul 8 div put + } for + + % Return the arguments + << + /ren //renlinear + /bbs bbs + /bhs bhs + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/japanpost dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER japanpost-- @@ -2966,51 +8992,147 @@ uCM@[!I?IP~> % --EXAM: 0123456789 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp msi 0.0 0 0 0 -%%BeginData: 43 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\0Tn4F@U WeaD e (R W+ D,% uF( LLj0 6CcMF -CoH/FHOV,1G O u"b 5A U&KFD5Z2 F*j(NAmoLsA -Wf3'P!FGY<0B5(@ ZmRN0o c8t P)XR (F_- _!H ]ftD5*C&O5 *@^MH]ft&Ec -krV1OYEdI?J0)*g /N:Df Bf4D f0WZ5 *@^M P#Q @=FD5Z2F*j '+I?I/TFCf] -=AoDR/+EV1>FCoH /FHS5 =1G0mbQ -`De*FB5*@^3De*FB@Yb&JWFKjWAUB4eP,XU.OuS6uP,XU.L^'#WL]W_?P!4;W8Wn4P!+TqXAWg -MLL]`G6P)#3:Oo]uoK89nuC5<7\5*Dn$$^,7f3/@p)4^qi1D/Wr>0p2ZdP'(8QA7^p5L]W_?P, -4=$L]Cq'A7^pLOuQriA7^p5NWLphP'MJ&@rGmhP%'4JOo^`BOuS6t@rGmhP'N3M@rGmhP%'4MM -#WWnLbOtmP'DD<P,4=$L]Cq'A7^pLOuQriA7^p5L]iP6P)"iIOo^_jI?ITYOq*X2Bl7EsF_#&nBOt[hHQ -Zg3ARfLtH#R>T"`80g0eebRHX^E(@rGmh+Dl%-0ee$=<+BTQ@r$13E+P%7D/Wr>0JP8E4aUXHE -as#uAKYi.A2,b\D/Wr>0R]*`@q]F`CNOi@AW?q2De(RWP!+/$@<,jrA7Zm#De(RWI?IQ>BOt[h -FEqh:NX0N4Ec#`*0enhSHX^E(@rGmh+Dt\0D/Wr>0n#3a@q]F`CNOi@AW@"4De(RW0eebRHX^E -(@rGmh+Dl%-0ejefDe(RVI?IQ>BOt[hFEqh:NXBZ6Ec#`*0ekC:P!+/$@<,jrA7Zm$@rcF)A2, -e]D/Wr>0R]*`04J@1@rGmhP!5$b04J@1Ch7K,@UX:eDe*FB@ZiN]DI[L*A7]7aARfLiDKKH7FF -,Z_G][b5DBNCsEbo<)Ou%NL<.0p/06:TD+C\c"Ch7L?#a0"["d/nLV33VfFEhmM@UX:nAT!Y;O -u%/gF,0g-DI[aD$Be&FH&)HV!FfJXCh7L?!KsF/056S5Ou$QUEas#uAKY]C!Kp,c@<,jk@<-FP -5*CngFcp2eBl7I+P!5$bP')q104f$2+D#G#F!,17A9a81Ou%/gF!,1Q#a0"[!g3RqDI\iTFEhm -MBcpV&@UX:eDe*E%BnueQ9PK:kP&,pVOo]Z9G]\4LAnH*qF5?'9 -G\P"9Y'F!+q#Ebo<)L^9/[L]W_?ASu"!L^TA=P'K/P061WA0/%?WDJX$)ARTU4F(025>9IurF* -i]sP,Wkm8R3uYBQG;#+EM"5P%'4JOo^@?P#?X?ASGdjFFB=)>q]YrF!+[0F(03R@Yb&J!Jgf?; -L=3"I?K4g+DG_'Cis9"FCf]=HS9JcF -% uk.co.terryburton.bwipp/msi 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp msi 0.0 2015050900 71052 70834 +%%BeginData: 139 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/msi { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /includecheckintext false def + /checktype (mod10) def + /badmod11 false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create an array containing the character mappings + /encs + [ (12121212) (12121221) (12122112) (12122121) (12211212) + (12211221) (12212112) (12212121) (21121212) (21121221) + (21) (121) + ] def + + % Create a string of the available characters + /barchars (0123456789) def + + /barlen barcode length def % Length of the code + /txtlen barlen def + + /mod10 { + /code exch def + 0 0 code {48 sub exch 10 mul add exch} forall pop 2 mul + 0 {1 index 10 mod add exch 10 idiv dup 0 eq {pop exit} if exch} loop + 0 0 code {48 sub add exch} forall exch pop add + 10 mod 10 exch sub 10 mod + code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put + } bind def + + /mod11 { + /code exch def + code length 1 sub code {48 sub exch dup 1 sub exch 6 mod 2 add exch} forall pop + 0 code length {3 1 roll mul add} repeat + 11 mod 11 exch sub 11 mod + dup 10 eq badmod11 and { + pop code length 2 add string dup 0 code putinterval dup code length (10) putinterval + } { + code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put + } ifelse + } bind def + + /ncrmod11 { + /code exch def + code length 1 sub code {48 sub exch dup 1 sub exch 8 mod 2 add exch} forall pop + 0 code length {3 1 roll mul add} repeat + 11 mod 11 exch sub 11 mod + dup 10 eq badmod11 and { + pop code length 2 add string dup 0 code putinterval dup code length (10) putinterval + } { + code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put + } ifelse + } bind def + + % Calculate checksum + includecheck { + checktype (mod10) eq {barcode mod10} if + checktype (mod1010) eq {barcode mod10 mod10} if + checktype (mod11) eq {barcode mod11} if + checktype (ncrmod11) eq {barcode ncrmod11} if + checktype (mod1110) eq {barcode mod11 mod10} if + checktype (ncrmod1110) eq {barcode ncrmod11 mod10} if + /barcode exch def + /barlen barcode length def + includecheckintext {/txtlen barlen def} if + } if + + /sbs barlen 8 mul 5 add string def + /txt barlen array def + + % Put start character + sbs 0 encs 10 get putinterval + + 0 1 barlen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 8 mul 2 add enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 12 mul 3 add textyoffset textfont textsize] put + } for + + % Put the end character + sbs barlen 8 mul 2 add encs 11 get putinterval + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt 0 txtlen getinterval + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/msi dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER msi-- @@ -3021,59 +9143,154 @@ DKKE0@<[lR0/%?WDJX$)ARTVB<0B7iOq*X205YcEOuSV806M%_@rEuAATDg:@Wc^5Df.1:GA2# % --EXAM: 01234ABCD % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp plessey 0.0 0 0 0 -%%BeginData: 51 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\O u"b5AU &KFD 5Z2 F*j(NAmoLs AWf3'P!FGY< -0B5(@ZmRN0oc8tP )XR(F_ -_! H]ft D5*C &O5 *@^MH]ft&E ckrV1OYEdI? -J0)*g/N:DfBf4Df 0WZ5* @^MP #Q@=F D5Z2 F*j '+I?I/TFCf ]=AoDR/+EV1 ->FCoH/FHS5=1G73G&Q061K8F(Jp'Ec5u]5CJ\oI?I,S@UX:nASrW"@<,jrA -7^p5G%#3$A79Rk@q]F`CO:j=P,Wkm<0B$j@q]F`CLV""F!+q#Ebo<)L]ilWL^9.EOpR:-@q]F` -CLV""F!+q#Ebo<)L]ilW>DN98!/LW2!/LW2!/LW2!*tb5L]E53@UX:nAT!;)P,Wd]Bp(ZC1G9IWtA9`n2Op#K:A9` -q1Oq3?LOp#K:A9`q0Oq3?LOp#K:A9`q/Oq1i]H$tiH04S[,@r$-oCige(L]N;4L]N;4L]E53L] -E52L]LeE1Pc$e!FfJXCh7L?"HmSW!KsF/056S5Ou$T]ARfLbBlnD=Bp),F!KoTmL]E53L^8>\C -6CcD1Lk*0@r#OfFE8R=+DR&?@q]F`CLV""F!,0>C6AU\94MXH@r$-oCige7P"UtSP'DD<8:?Y# -I?I,S@q]F`CNa-&L]ESoL]E53L^/8[Bp(ZC1G<6OARfM!@;I&rBOt[hG%#3C!bicgG]8fs@q]F -`CLV""F!+q#Ebo<)L]ilWBp&L[99O+S!Ko6eP"769BOt[hF*2=S+Cf(r@r$6rCkrUb"HkPo@q] -F`CNFW81*C(?ARfM!@;LbtOq3^3G%#3$A79Rk@q]F`CO715@<,jrA7Zlm@<-0qDN[Y%@<,jk@< --E3@q]F`CNFW80p51mD.6po@rGmh+C\c"Ch7L?!KmJH94D=M@q]:kF!+t+ARfLsF_rms99O.TE -dKHKGA2#8/oYW*ASu"!L_,_BP'Mi`L]LsnEbo<)L]N[99M)P@WNZ+L^9/[L^9.EASu"!+DG_(G`k^_H$" -:Q+DDs&+C\c"@rGmh+DHW4P"]SG'U!9g'TrK=AU&FCf]=F(or3+C -1.TI?I-B@WNZ$@<-0qDMSR]Ckr@[!G-.YF!+t+ARfLsF_rjr99ORA@WNZ$@<-0qDMSR]CkrXc! -G-.YF!+t+ARfLsF_rms99OR7DI[L*A7]7aARfLiDKKH7FF,-PG]Y';@<-0qDBN.+@UX:eBOPq& -+Cf(r@r$..D)$hIP"]=nEbo<)L_Q"gL_Q!QFCf]=H#I;,F(KG9FCf]=AoDR/+EV1>FE;/BAKY9 -AG]\1P+C\c"Ch7L?!KmIf+C\c"@q]:kF!+t+ARfLsF_rmi!Kp,c@<-0qDMS=V!JhGQCkrdg!H_ -mtFEqe:AohO*+EV1>FCoH/FFCoH/F>E/_,@UX:nA -T!;)Oo^@QP&,pgOo]Z9G]\4LAnH*qF5?'9G\P#ZR4F!+q#Ebo<) -L^9/[L_u9UASu"!+E_R9A8-'q@ruF'DII@.L_>,_L_5&uq]Z#F!+[0F(03R@Yb&J!Jgf?;L<(gBkM+$I?K4g04JC3+Bot0@WR -]AL]NY>L]W`;H\_ZMP(R$_Bl7EsF_#'*AU& -% uk.co.terryburton.bwipp/plessey 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp plessey 0.0 2015050900 67754 67457 +%%BeginData: 146 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/plessey { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /validatecheck false def + /includecheckintext false def + /unidirectional false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Create a string of the available characters + /barchars (0123456789ABCDEF) def + /charvals 16 dict def + 0 1 15 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.plesseyBadCharacter (Plessey must contain only digits and letters A B C D E F) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {2 sub} if def + + % Calculate the checksums + /checkbits barlen 4 mul 8 add array def + checkbits barlen 4 mul [ 0 0 0 0 0 0 0 0 ] putinterval + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + checkbits i 4 mul [ + indx 1 and + indx -1 bitshift 1 and + indx -2 bitshift 1 and + indx -3 bitshift + ] putinterval + } for + /checksalt [ 1 1 1 1 0 1 0 0 1 ] def + 0 1 barlen 4 mul 1 sub { + /i exch def + checkbits i get 1 eq { + 0 1 8 { + /j exch def + checkbits i j add checkbits i j add get checksalt j get xor put + } for + } if + } for + /checkval 0 def + 0 1 7 { + /i exch def + /checkval checkval 2 i exp cvi checkbits barlen 4 mul i add get mul add def + } for + /checksum1 checkval 15 and def + /checksum2 checkval -4 bitshift def + validatecheck { + barcode barlen get barchars checksum1 get ne + barcode barlen 1 add get barchars checksum2 get ne or { + /bwipp.plesseyBadCheckDigits (Incorrect Plessey check digits provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + % Create an array containing the character mappings + /encs + [ (14141414) (32141414) (14321414) (32321414) + (14143214) (32143214) (14323214) (32323214) + (14141432) (32141432) (14321432) (32321432) + (14143232) (32143232) (14323232) (32323232) + (32321432) (541412323) (323) + ] def + + /sbs barlen 8 mul unidirectional {27} {33} ifelse add string def + /txt barlen 2 add array def + + % Put start character + sbs 0 encs 16 get putinterval + + 0 1 barlen 1 sub { + /i exch def + /indx charvals barcode i 1 getinterval get def + sbs i 8 mul 8 add encs indx get putinterval + txt i [barcode i 1 getinterval i 20 mul 20 add textyoffset textfont textsize] put + } for + + % Put the checksum characters + sbs barlen 8 mul 8 add encs checksum1 get putinterval + sbs barlen 8 mul 16 add encs checksum2 get putinterval + includecheckintext { + txt barlen [barchars checksum1 1 getinterval barlen 20 mul 20 add textyoffset textfont textsize] put + txt barlen 1 add [barchars checksum2 1 getinterval barlen 1 add 20 mul 20 add textyoffset textfont textsize] put + } { + txt barlen [( ) barlen 20 mul 20 add textyoffset textfont textsize] put + txt barlen 1 add [( ) barlen 1 add 20 mul 20 add textyoffset textfont textsize] put + } ifelse + + % Put end character + sbs barlen 8 mul 24 add encs unidirectional {18} {17} ifelse get putinterval + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/plessey dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER plessey-- @@ -3081,503 +9298,1898 @@ WuO*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --BEGIN ENCODER telepen-- % --REQUIRES preamble raiseerror renlinear-- % --DESC: Telepen -% --EXAM: 123456 -% --EXOP: numeric includetext +% --EXAM: ABCDEF +% --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp telepen 0.0 0 0 0 -%%BeginData: 63 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ Ou "b 5AU &X 4 aVt cO u8C3 DfB f4Df0WCP,i 2'Cia0N4aW> -WI?IQm30Ia6V33Q n!BlU* FE2 M 8P!+ /T/W r;\ FcnqO1OXV5 /Tc#UAWeitP -#ZpnAWe*t3A5;iF D5Z2F- 8_M 1OYE cDfB f4D f0WCOu%NL8 M>0sG][P9DK -I"CAU& FE; /BAWe^01G< i]G]\4LAnH* -qF>#B4uCM09 S,1@<-F#HS9 -5WB-:YlEas#uAWg McV33Vf C5;kQ1 Lad5@ rGm hH]A,5P)Xg O3,N_LP!3WD -5*C2S@VV&,L]NY>05?Y6Ou&8DOuS6tL]`f6Ot:HkB9GGnL]N[L]`f(P"^: -NOuR<"B9GGnP!5%SP%&0h!AA2N5*@]T@UX:eDe*E%D0'?G!,@ZjOu&7dI?ITYP%B')<%hg#@ri -bsNX.Eq1GL[?1GOms0ekI=1GL[?0en[o1G^gA1GLU=NX@Kq0ekI=1GL[?NX@Qs0ekI=1GLU=NX -.?o1G^gA1GOmq0f(O?1GL[?NXRWs0ekC;1GL[?0en[o1GL[A1GLU=NX@Kq1GLU=1GL[?NX.Es0 -ekI=1GOms0ekC;1G^gA0en[q1GLU=0ekI=1GOms0ekC=0f(U?0en[q0f(O=0f(U?0en[s0ekC; -0ekC;1GL[?NX@Qs1GLU=1GLU=NX.?o1GL[A1GOmo1G^gC1GOmu0ekC;1GLU=1GLU=NX.Eq0ekI -?1GOms0ekI?0ekI=0en[q0f(O?0ekI=0en[q0ekC;0ekI?1GOmq1GLU?0f(U?NXRWs1GLU=0ek -I=0en[q1G^a?0ekI=0en[q0ekC;0f(O?1GOmu1GLU=0ekC;1GLU=NX@Kq0f(O=0f(U?NX@Ks0e -kC;0f(U?NXdcu0ekC;0ekC;1GLU=NX.Eq1GL[A0en[q0ekI=1GLU=1GOmq1G^gA0ekI=NX@Kq0 -ekI=1G^a?NX@Qs0ekI=0ekI=NX.?o1G^gC0en[o0f(O?1G^a?NXRWs0ekC;1GLU=1GOmq1GL[A -0ekI=NX@Kq1GLU=1G^a?NX.Es0ekI?0en[q0ekC;1G^a?1GOms1GLU=0ekI?0en[q0ekC=0f(O -=1GOms0f(O=0f(O=1GOmu0ekC;0ekC;1G^a?NX@Qs1GLU=0ekI=NX@Kq1GLU?0f(O=NX.Es0f( -O?0en[s0ekC;1GLU=0ekI=NX@Qs0ekC=0f(O=NX@Kq1G^a?0ekI=NX@Ks0f(O=0ekI=NXRWs0e -kC;0f(O?0en[q1GLU?0ekC=0en[s0ekI=0ekC;0ekI=NX@Qu0ekC;0ekI=NXRWs0ekC=0ekC=0 -en[s1GLU=0ekC;0ekI=NXRWs0f(O=0ekC=0en[s0f(O=0ekC;0f(O=NXdcu0ekC;0ekC;0ekI= -NX@Qs1GL[?0ekC;NX.?o1GL[?1Gb$q1G^gA1Gb%"0ekC;1GL[?0ekC;NX.Eq0ekI=1Gb$u0ekI -?1GLU=0en[q0f(O?1GLU=0en[q0ekC;0ekI=1Gb$q1GL[A1Gb%"0ekI=0ekI=0ekC;NX@Qu0ek -I=0ekC;NX.?o0ekI?1Gb%"1GLU=0ekI=0ekC;NX.?o0f(O?1Gb$s0f(O=0f(UANXdcu0ekC;0e -kI=0ekC;NX.Eq1GLU=1Gb$u0ekI=1G^a?0en[o1G^gC0ekC;NX@Kq0ekI=0ekI?NX@Qs0ekI?0 -ekC;NX.?o1G^a?1Gb$s0f(O?0ekI?NXRWs0ekC;1G^a?0en[q1GLU?0f(O=0en[q0ekI=0ekC; -1Gb$s1G^a?0ekI?NXRWs0ekC=0f(O=0en[q1GLU=0ekC;1Gb%"0ekC=0ekC=0ekC;NXRWu0ekC -;0f(O=0en[s0ekC;0ekC;0ekI?NX.Eq1GLU?0f+gu0ekI=1GLU=0ekC;NX@Qu1GLU=0ekC;NX@ -Kq0ekI=0f(O?NXR]u0ekI=0ekC;0en[o0ekI?0f(O?NX.?q0f(O?0f+h"0ekC;0ekI=0ekC;0e -n[q1GL[A0ekC;0en[q0ekI=0ekC=0f+gq1G^a?0f(O?NXRWs0ekI?0ekC;0en[q1GLU=0ekC=0 -f+gu0ekC=0f(O=0ekC;NXRWu0ekC=0ekC;0en[s0ekC;0ekC;0f(O?NXR]u1GLU=0ekC;0en[q -0ekI=0f(O=0f+gq1G^aA0ekC=NXdcu0ekI=0ekC;0ekC;NX@Qs0ekC=0ekC=NXRWs1G^a?0ekC -;0en[s0f(O?0ekC;0ekC;NXRWs0ekC;0f(O=0f+gs1GLU?0ekC;0f+h"0ekI=0ekC;0ekC;0en -[s1G^a?0ekC;0ekC;NXRWs0ekC=0ekC;0f+h"1GLU=0ekC;0ekC;0en[s0ekC=0ekC;0ekC=NX -RWu0ekC;0ekC;0f+h$0ekC;0ekC;0ekC;0ekC;?'6us@UX:nASrW"@<,jrA7^p5Ou"b4@WNZ$@ -<-0qDMSjeCksd.!Ks:B1G*ASu"@GqWtV -ASu"@@ZiN#@q]F`CNFW8L]ESo0564BOu"b+L]ESoHYFU3@<-0qDN[/0P!FGY<,QhqATDKpHQZd -+Eas#uAKY]M98F.B:jXj5E$/UuEas#uAKY]C!g66?1N%/f!Jgc>9TB-UP!+.FBl7I++Du.S!/L -Z=9Tgr_&X!0X1OXU'Bl7I++Du.]/;P7.!Ko6eP#ZUKF9Ig&+DQ]DP&,pcOo]Z9G]\4LAn -H*qF5?'9FcBcq,G!g3SI1OXU'Bl7I++C\c"@rGmh+DI!3Ou%3)F -E/_,C5FCoH/FFCoH/FFCf]=F(or3+C1.TI?IS`Bcq,G!KmJH1OYEd04 -S[,@r$..D'3>%ARfLsF_r78DIe!T!Ko5lASu!#ASu"!+DG_(G`k^_1NR#H+D`03DI\iT05MbI+ -D#G#P%'RTOu"b++DQ]5Oo^_%I?J.p@q]F`CNFW8LjroJARfLsF_uqaP%p/ZLjtS&Ou"b&DIXf# -DI[`1@q]F`CNFW8P"UroF(025C`m;,A!2*jC`mO:ASu"@@ZgbT1G<1_dDD* -Y`ASu9IurF-:!g!KmJ>!g6H.BOtmjBQSZcK3 -^->@WNYr+EM"5P%'4JOo^@?P#?X_!.C#_>p*j!@r-9uATVL.FF,Z_G]Y'MG]\@s<%i0/FD_?-C -EcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[ -!I?IP~> -% uk.co.terryburton.bwipp/telepen 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp telepen 0.0 2015050900 68624 68368 +%%BeginData: 173 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/telepen { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /numeric false def + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + % Create an array containing the character mappings + /encs + [ (31313131) (1131313111) (33313111) (1111313131) + (3111313111) (11333131) (13133131) (111111313111) + (31333111) (1131113131) (33113131) (1111333111) + (3111113131) (1113133111) (1311133111) (111111113131) + (3131113111) (11313331) (333331) (111131113111) + (31113331) (1133113111) (1313113111) (1111113331) + (31131331) (113111113111) (3311113111) (1111131331) + (311111113111) (1113111331) (1311111331) (11111111113111) + (31313311) (1131311131) (33311131) (1111313311) + (3111311131) (11333311) (13133311) (111111311131) + (31331131) (1131113311) (33113311) (1111331131) + (3111113311) (1113131131) (1311131131) (111111113311) + (3131111131) (1131131311) (33131311) (111131111131) + (3111131311) (1133111131) (1313111131) (111111131311) + (3113111311) (113111111131) (3311111131) (111113111311) + (311111111131) (111311111311) (131111111311) (11111111111131) + (3131311111) (11313133) (333133) (111131311111) + (31113133) (1133311111) (1313311111) (1111113133) + (313333) (113111311111) (3311311111) (11113333) + (311111311111) (11131333) (13111333) (11111111311111) + (31311133) (1131331111) (33331111) (1111311133) + (3111331111) (11331133) (13131133) (111111331111) + (3113131111) (1131111133) (33111133) (111113131111) + (3111111133) (111311131111) (131111131111) (111111111133) + (31311313) (113131111111) (3331111111) (1111311313) + (311131111111) (11331313) (13131313) (11111131111111) + (3133111111) (1131111313) (33111313) (111133111111) + (3111111313) (111313111111) (131113111111) (111111111313) + (313111111111) (1131131113) (33131113) (11113111111111) + (3111131113) (113311111111) (131311111111) (111111131113) + (3113111113) (11311111111111) (331111111111) (111113111113) + (31111111111111) (111311111113) (131111111113) (1111111111111111) + ] def + + /barlen barcode length def % Length of the code + /sbs barlen 16 mul 48 add string def + /txt barlen array def + + % Put the start character ASCII 95 + /enc encs 95 get def + sbs 0 enc putinterval + /l enc length def + + /checksum 0 def + /i 0 def /j 0 def + { % loop + i barlen eq {exit} if + numeric { % numeric mode: 00-99 & 0X-9X + barcode i get 16 gt { + /np barcode i 2 getinterval def + np 1 1 getinterval (X) eq { % X in even position amongst digits + /indx np 0 1 getinterval cvi 17 add def + } { + /indx np cvi 27 add def + } ifelse + txt j [np j 16 mul 16 add textyoffset textfont textsize] put + /i i 2 add def + } { + /indx barcode i get def + txt j [( ) j 16 mul 16 add textyoffset textfont textsize] put + /i i 1 add def + } ifelse + } { % ASCII mode + /indx barcode i get def + indx 32 ge indx 126 le and { + txt j [barcode i 1 getinterval j 16 mul 16 add textyoffset textfont textsize] put + } { + txt j [( ) j 16 mul 16 add textyoffset textfont textsize] put + } ifelse + /i i 1 add def + } ifelse + /checksum checksum indx add def + /enc encs indx get def + sbs l enc putinterval % Put encoded digit into sbs + /l l enc length add def + /j j 1 add def + } loop + + % Put the checksum character + /checksum 127 checksum 127 mod sub 127 mod def + /enc encs checksum get def + sbs l enc putinterval + /l l enc length add def + + % Put the end character ASCII 122 + /enc encs 122 get def + sbs l enc putinterval + /l l enc length add def + + % Shrink sbs and txt to fit exactly + /sbs sbs 0 l getinterval def + /txt txt 0 j getinterval def + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/telepen dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER telepen-- -% --BEGIN ENCODER posicode-- -% --REQUIRES preamble raiseerror renlinear-- -% --DESC: PosiCode -% --EXAM: ABC123 -% --EXOP: version=b inkspread=-0.5 parsefnc includetext -% --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp posicode 0.0 0 0 0 -%%BeginData: 105 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4aVtcOu8C3D fBf4Df 0WC P,i2 'Cia 0N4 aW>WI?IQm3 0Ia6V33Qn!B -lU*FE2M8P!+/T/W r;\Fc nqO1 OXV5/ Tc#U AWe itP#ZpnAWe *t3A5;iFD5Z -2F-8_M1OYEcDfBf 4Df0W COu%N L8M>0 sG] [P9DKI"CAU &FE;/B AWe^01 G4@UX:eDe*FB@ZmRN1GOo[4NP!5$bP')pIL]E55P"_#iD0'?Q5&,lSP,XU.P'E-LP%'4LP,X6>P!5%&I=%,:D -0'?Q5&-6EP'N4"C6ATNC6CcD1G<3GEas#uAKYi2B8?P&P"_#pP!FGY9I.1!AKN7?B,%6>p*@3!AT -T84,=h]+Bsj,16)AtL`B\C>E/_?NWD;!*F0dlNWCts!Bu;\>p*@3!B#l<5DUCe+Bsj,2N@f'NW -C;/+Bsj,2i[oCNWC>0+Bsj,3/Ch"!@(km>E/_ENWEFG!@D(p>E/_MNWERE!F6gPNWDJ,!Fgid> -p*@3!CMkJ@u(4m+Bsj,7#h:YL]h!+>E/_QNWE^I"^N6TNWDV0!G7,l>p*@3!Cr.NB8?du+Bsj, -8<*^aL^79/>E/_UNWEjM$!eZXNWDb4!G[Dt>p*@3!DAFRCPW@(+Bsj,9TB-iL^[Q3>E/_YNWF! -Q%:()\NWDn8!H*]'>p*@3!De^VDhnp0+Bsj,:lYQqL_*i7>E/_]NWF-U&R?M`NWE%p* -@3!E5!ZF,1K8+Bsj,E/_aNWF9Y'jVqdNWE1@!Hs87>p*@3!EY9^GDI&@+Bsj,=H -3E,L_sD?>E/_eNWFE])-n@hNWE=D!IBP?>p*@3!A0<4?\g+9+Bsj,/rfs?LacUP>E/_,Ljt3\> -p*@3!@3[+H]A+V>p*@3!ABH6I#\4Y>p*@3!@s02I?"=h>p*@3!@Blmos+BosmNWChiSqrt -D+Bsj,0o2EWSm)8c+SmBlmosI?ITn9.sdg@<-3nE-%1+Ou"b$BOPq)@;L!->9IEh@<-3nE-%1OOu6`_@<-3nE-%1OO -u6`_@<-3nE-%1OOu6O.1Pc$e!FoeOEc#6(F-:!g!KsF/056S5Ou"b&DI[`1@q]:kD..C)+DI!3 -Ou%moL]N;5HS9,s5*@^5DI[`1C6D5Q30LHuF*)G:DJ+':E+P1qH\_Zb97;t&@q]:kG%#3.+DR' -4P!3TCG^Y`GI?I,SF(KGI+Cf(nEctl-F,0gZ99M(aF(KGJ+Cf(nEctl-F,0j[99M(aF(KGK+Cf -(nEctl-F,0m\99M)O@<[&OASu!rA8,poNWX<1GEOb1P#Q"1@rGmlDJ+t3Eaa0T4aShlGB4m9@< --0qDNY"-Q?@/ -4u -I?IQ@DI[TqBl7RD"CZFpDj!8104o*3G%#3.+?VcH"@c-R0kP;XNW_gH6S`7k16)K,:.$gLDDR: -U7SZ<-Ao9FJ5!G,c05YcC+C\c"Ch7LI$'I(tFCf]=+C\c"Ch7LIV33VfBnubP1GC*7#"@<.NUE+*d.AS,gi+Cf(nEe -n%b4d#q^+C\c"Ch7L?"HoaIAs*:D@UX:eDe*E%BnueQ!Kp*3?BT/P04S[(EZet3@s29sF!+q#E -as#uAKY]C!KmJ>"HlHA99M)QAU&;>C5r<;P'J]p+DHW7Oo^_%I=!V]+DHW4Oo^_%I?ITYP#Q:> -B-:q3@q]:kP'AWo+DHW4Oo^_%05;VEL]NY>Ou%NLAM7nAB-;&4B8?P&P"_#p05YcCCh7K,D0'? -Q@ZiN#FCf]=+EV1>FGKp3P"_#p04f$2H]gRU94N0eP!3WD5*C.DC*78I!KmJH1OYDrOu"b$GB4 -m9@<,jrA7^p5L]W`UOpR:-0564BOu"b+L]ESo04T'7FH-KFATTVh1OEgYD0'?+AT!YoH]gXBP# -Qc]@q]:k0d(=SB-:oO99M(a@q]:k1*C:e!KmJ#F(]<#DN\UYD0'>4BnueQ!Kp*(H\e5@P#[Z$@ -rl4'P%8'9@<+)c@!cBs@<+(F@rl4'P%8-A@kVO=BnueQ!Ko7%5^eepF(KGK+Cf(nE\W_bHZNdS -+CfJ(FHU0GDIXf!BOPp9+EM+91*C.G@kVO=BnueQ!Ko7%5^eep@rl4'P%8'9@<+,d@$5JU@rl4 -'NWaE7F>/k@HYd+F+CfJ(FHU0GDIY>0F(KHR"ES-r0p4>@HYd+E+CfJ(FHU0GDIY>0F(KHR"ES --r0Tn5?P#[Z1I=#IFATWq8F(KGIP!+/5AhbE+hKDI\*Xu-NWq3p0ekCNWq3m0f1U?NWq3o0ekC=NWq3n -0etI>NWq3m0f(O?NWq3n0ekC>NWq3m0etI?NWq3m0ekC?NWq3t0ekC;NWq3s0etINWq3p0f:[?NWq3o0fCa@NWq3n0fLgANWq3m0fUmBNWq3s0ekCNWq3p0f1U?NWq3o0f:[@NWq3n0fCaANWq3m0fLgBNWq3r0ekC=NWq3q0etI>NWq3p0f -(O?NWq3o0f1U@NWq3n0f:[ANWq3m0fCaBNWq3q0ekC>NWq3p0etI?NWq3o0f(O@NWq3n0f1UAN -Wq3m0f:[BNWq3p0ekC?NWq3o0etI@NWq3n0f(OANWq3m0f1UBNWq3o0ekC@NWq3n0etIANWq3m -0f(OBNWq3n0ekCANWq3m0etIBNWq3m0ekCBNX.@%0ekC;0f"as0ekC;0ekC;0fq*q04H&.NWq3 -q0etI>NWq3p0f(O?NWq3o0f1U@NWq3n0f:[ANWq3p0etI?NWq3o0f(O@NWq3n0f1UANWq3o0et -I@NWq3n0f(OANWq3n0etIANWq3u0etI=NWq3t0f(O>NWq3s0f1U?NWq3r0f:[@NWq3q0fCaANW -q3p0fLgBNWq3o0fUmCNWq3n0f^sDNWq3t0etI>NWq3s0f(O?NWq3r0f1U@NWq3q0f:[ANWq3p0 -fCaBNWq3o0fLgCNWq3n0fUmDNWq3s0etI?NWq3r0f(O@NWq3q0f1UANWq3p0f:[BNWq3o0fCaC -NWq3n0fLgDNWq3r0etI@NWq3q0f(OANWq3p0f1UBNWq3o0f:[CNWq3n0fCaDNWq3q0etIANWq3 -p0f(OBNWq3o0f1UCNWq3n0f:[DNWq3p0etIBNWq3o0f(OCNWq3n0f1UDNWq3o0etICNWq3n0f( -ODNWq3n0etIDNX.@%0etI>0f"as0etI=0etI=0g%0r05P?>Blmos@3Ad7"u.he1bg_F"u.he1G -LYF"u.he1,1SF"u.he0ekMF"u.kf1GLVE"u.kf1,1PE"u.kf0ekJE"u.qh0ekDC"u.ng1,1MD" -u.ng0ekGD"u/%k0ekDC"u/"j1,1MD"u.ti1GLVE"u.qh1bg_F"u.ng2)-hG"u.kf2DHqH"u.he -2_d%I"u/"j0ekGD"u.ti1,1PE"u.qh1GLYF"u.ng1bgbG"u.kf2)-kH"u.he2DHtI"u.ti0ekJ -E"u.qh1,1SF"u.ng1GL\G"u.kf1bgeH"u.he2)-nI"u.qh0ekMF"u.ng1,1VG"u.kf1GL_H"u. -he1bghI"u.ng0ekPG"u.kf1,1YH"u.he1GLbI"u.kf0ekSH"u.he1,1\I"u.he0ekVI"u.ti0e -kDC!ARk5Ch[a#FCeul+Bsj10etI@0f"an0etI?0f+go0etI>0f4mp0etI=0f=sq0f(O@0f"an0 -f(O?0f+go0f(O>0f4mp0f:[@0f"an0f1U@0f"an0f1U?0f+go0fUmC0f"an0fLgC0f"an0fCaC -0f"an0f:[C0f"an0f1UC0f"an0f(OC0f"an0etIC0f"an0fLgB0f+go0fCaB0f+go0f:[B0f+g -o0f1UB0f+go0f(OB0f+go0etIB0f+go0fCaA0f4mp0f:[A0f4mp0f1UA0f4mp0f(OA0f4mp0et -IA0f4mp0f:[@0f=sq0f1U@0f=sq0f(O@0f=sq0etI@0f=sq0f1U?0fG$r0f(O?0fG$r0etI?0f -G$r0f(O>0fP*s0etI>0fP*s0etI=0fY0t0f1U?0f"ai0jPnc4s5#[EcYr5DN[XGASu"!P!5$b0 -4Qb]+BosmL&pat!D8(HdYN@.7Yi:F%u:Bp+BsR#V20APDNTA#`&_A#)EG="Gd/9!aQpQL]N;4L]N;4L]N;4L]N;4>p*F91G*4!f-o6!f-o6!f-n`Ou"b3L]ESo04Te)!A:'+5Oo]uo8R7K8I?IP_@q'M>$o'Ik0 -ekC;0ekC;0o-7$V32^Z1Pc3js+gZ%056S5Ou$TWF,1!6P,X6=P&,pTOo])9Bp),F09Q@!G^Y`G -06:TD+CfV:P%'4OP&,prOo^`BOu$Ze@ric(DI[aN@Yb)KWKKo;3-/PMP!4[%P!5%SP%$(ZP!5$ -bL]E53@s1_dDD*Y`ASu9IurF --:!g!KmJ>!g6H.BOtmjBQSZcK3^->@WNYr+EM"5P%'4JOo^@?P#?X_!.C#_>q^;EF9J$! -G]Y'MAU&FCf]=F(or3+C-*q06CcMFEh51BkM= -D#%M4^FCfJGDfBe@DfBf4Df0V=5!C*"Df0Z-Eaa0TE%`kbASu -% uk.co.terryburton.bwipp/posicode 0.0 0 -%%EndData -%%EndResource -% --END ENCODER posicode-- +% --BEGIN ENCODER telepennumeric-- +% --REQUIRES preamble raiseerror renlinear telepen-- +% --DESC: Telepen Numeric +% --EXAM: 01234567 +% --EXOP: includetext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp telepennumeric 0.0 2015050900 57870 57594 +%%BeginData: 55 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /telepen dup /uk.co.terryburton.bwipp findresource put +begin +/telepennumeric { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Get the result of encoding with code2of5 with version=industrial + options (dontdraw) true put + options (numeric) true put + + /args barcode options //telepen exec def + + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/telepennumeric dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER telepennumeric-- + +% --BEGIN ENCODER posicode-- +% --REQUIRES preamble raiseerror renlinear-- +% --DESC: PosiCode +% --EXAM: ABC123 +% --EXOP: version=b inkspread=-0.5 parsefnc includetext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp posicode 0.0 2015050900 101857 104871 +%%BeginData: 389 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/posicode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textxoffset 0 def + /textyoffset -7 def + /height 1 def + /encoding (auto) def + /version (a) def + /checkoffset 0 def + /raw false def + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /encoding encoding cvlit def + /version version cvlit def + /checkoffset checkoffset cvi def + /height height cvr def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Special function characters + /la0 -1 def /la1 -2 def /la2 -3 def + /sf0 -4 def /sf1 -5 def /sf2 -6 def + /fn1 -7 def /fn2 -8 def /fn3 -9 def /fn4 -10 def + + % Character maps for each state + << + /normal + [ + % 0 1 2 0 1 2 0 1 2 + [ (0) (^) (') ] [ (1) (;) 27 ] [ (2) (<) 28 ] % 0-2 + [ (3) (=) 29 ] [ (4) (>) 30 ] [ (5) (?) 31 ] % 3-5 + [ (6) (@) (!) ] [ (7) ([) (") ] [ (8) 92 (#) ] % 6-8 + [ (9) (]) (&) ] [ (A) (a) 1 ] [ (B) (b) 2 ] % 9-11 + [ (C) (c) 3 ] [ (D) (d) 4 ] [ (E) (e) 5 ] % 12-14 + [ (F) (f) 6 ] [ (G) (g) 7 ] [ (H) (h) 8 ] % 15-17 + [ (I) (i) 9 ] [ (J) (j) 10 ] [ (K) (k) 11 ] % 18-20 + [ (L) (l) 12 ] [ (M) (m) 13 ] [ (N) (n) 14 ] % 21-23 + [ (O) (o) 15 ] [ (P) (p) 16 ] [ (Q) (q) 17 ] % 24-26 + [ (R) (r) 18 ] [ (S) (s) 19 ] [ (T) (t) 20 ] % 27-29 + [ (U) (u) 21 ] [ (V) (v) 22 ] [ (W) (w) 23 ] % 30-32 + [ (X) (x) 24 ] [ (Y) (y) 25 ] [ (Z) (z) 26 ] % 33-35 + [ (-) (_) 40 ] [ (.) (`) 41 ] [ ( ) 127 0 ] % 36-38 + [ ($) ({) (*) ] [ (/) (|) (,) ] [ (+) (}) (:) ] % 39-41 + [ (%) (~) fn1 ] [ la1 la0 fn2 ] [ sf1 sf0 fn3 ] % 42-44 + [ sf2 sf2 fn4 ] % 45 + ] + /limited + [ + [ (0) -98 -98 ] [ (1) -98 -98 ] [ (2) -98 -98 ] % 0-2 + [ (3) -98 -98 ] [ (4) -98 -98 ] [ (5) -98 -98 ] % 3-5 + [ (6) -98 -98 ] [ (7) -98 -98 ] [ (8) -98 -98 ] % 6-8 + [ (9) -98 -98 ] [ (A) -98 -98 ] [ (B) -98 -98 ] % 9-11 + [ (C) -98 -98 ] [ (D) -98 -98 ] [ (E) -98 -98 ] % 12-14 + [ (F) -98 -98 ] [ (G) -98 -98 ] [ (H) -98 -98 ] % 15-17 + [ (I) -98 -98 ] [ (J) -98 -98 ] [ (K) -98 -98 ] % 18-20 + [ (L) -98 -98 ] [ (M) -98 -98 ] [ (N) -98 -98 ] % 21-23 + [ (O) -98 -98 ] [ (P) -98 -98 ] [ (Q) -98 -98 ] % 24-26 + [ (R) -98 -98 ] [ (S) -98 -98 ] [ (T) -98 -98 ] % 27-29 + [ (U) -98 -98 ] [ (V) -98 -98 ] [ (W) -98 -98 ] % 30-32 + [ (X) -98 -98 ] [ (Y) -98 -98 ] [ (Z) -98 -98 ] % 33-35 + [ (-) -98 -98 ] [ (.) -98 -98 ] % 36-37 + ] + >> + version (a) eq version (b) eq or {/normal} {/limited} ifelse get + /charmaps exch def + + % Invert charmaps to give character to value maps for each state + /charvals [ + charmaps length dict charmaps length dict charmaps length dict + ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 2 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + /set0 charvals 0 get def + /set1 charvals 1 get def + /set2 charvals 2 get def + + raw {/encoding (raw) def} if + + encoding (raw) eq { + /cws barlen array def + /i 0 def /j 0 def + { % loop + i barlen eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + cws j cw put + /i i 4 add def + /j j 1 add def + } loop + /cws cws 0 j getinterval def + /text () def + } if + + encoding (auto) eq { + + /fncvals << + (FNC1) fn1 + (FNC2) fn2 + (FNC3) fn3 + (FNC4) fn4 + >> def + + % Convert input into bytes accounting for FNC characters + /msg barlen array def + /text barlen string def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + text j char put + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + text j ( ) putinterval + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + /text text 0 j getinterval def + + % Convert the input message to codewords + /enc { + exch get cws exch j exch put + /j j 1 add def + } bind def + + /cws barcode length 2 mul array def + /i 0 def /j 0 def /cset (set0) def + { + i msglen eq {exit} if + + { % common exit + + % Read next two characters + /char1 msg i get def + /char2 i 1 add msglen lt {msg i 1 add get} {-99} ifelse def + + % If current mode is sufficient then directly encode + cset load char1 known { + char1 cset load enc + /i i 1 add def + exit + } if + + % If char1 is in set2 then shift encode + set2 char1 known { + sf2 cset load enc + char1 set2 enc + /i i 1 add def + exit + } if + + % If char2 is also not in this set then latch else shift encode + cset load char2 known not { + cset (set0) eq { + la1 cset load enc + /cset (set1) def + } { + la0 cset load enc + /cset (set0) def + } ifelse + exit + } { + cset (set0) eq { + sf1 cset load enc + char1 set1 enc + } { + sf0 cset load enc + char1 set0 enc + } ifelse + /i i 1 add def + exit + } ifelse + + exit + } loop + + } loop + /cws cws 0 j getinterval def + } if % auto encoding + + % Create an array containing the character mappings + << % ";"=11, "<"=12 + /a + [ (141112) (131212) (121312) (111412) (131113) + (121213) (111313) (121114) (111214) (111115) + (181111) (171211) (161311) (151411) (141511) + (131611) (121711) (111811) (171112) (161212) + (151312) (141412) (131512) (121612) (111712) + (161113) (151213) (141313) (131413) (121513) + (111613) (151114) (141214) (131314) (121414) + (111514) (141115) (131215) (121315) (111415) + (131116) (121216) (111316) (121117) (111217) + (111118) (1<111112) (111111111;1) + ] + /b + [ (151213) (141313) (131413) (121513) (141214) + (131314) (121414) (131215) (121315) (121216) + (191212) (181312) (171412) (161512) (151612) + (141712) (131812) (121912) (181213) (171313) + (161413) (151513) (141613) (131713) (121813) + (171214) (161314) (151414) (141514) (131614) + (121714) (161215) (151315) (141415) (131515) + (121615) (151216) (141316) (131416) (121516) + (141217) (131317) (121417) (131218) (121318) + (121219) (1<121312) (121212121<1) + ] + /limiteda + [ (111411) (111312) (111213) (111114) (121311) + (121212) (121113) (141111) (131211) (131112) + (171111) (161211) (151311) (141411) (131511) + (121611) (111711) (161112) (151212) (141312) + (131412) (121512) (111612) (151113) (141213) + (131313) (121413) (111513) (141114) (131214) + (121314) (111414) (131115) (121215) (111315) + (121116) (111216) (111117) (151111) (1) + ] + /limitedb + [ (121512) (121413) (121314) (121215) (131412) + (131313) (131214) (151212) (141312) (141213) + (181212) (171312) (161412) (151512) (141612) + (131712) (121812) (171213) (161313) (151413) + (141513) (131613) (121713) (161214) (151314) + (141414) (131514) (121614) (151215) (141315) + (131415) (121515) (141216) (131316) (121416) + (131217) (121317) (121218) (141212) (1) + ] + >> + version get /encs exch def + + /c2w [ + [ 495 330 210 126 70 35 15 5 ] + [ 165 120 84 56 35 20 10 4 ] + [ 45 36 28 21 15 10 6 3 ] + [ 9 8 7 6 5 4 3 2 ] + [ 1 1 1 1 1 1 1 1 ] + ] def + /v 0 def + cws { + /cw exch def + 6 { + cw v xor 1 and 0 ne { + /v v 7682 xor def + } if + /v v -1 bitshift def + /cw cw -1 bitshift def + } repeat + } forall + /v v checkoffset add def + + version (limiteda) eq version (limitedb) eq or { + /v v 1023 and def + v 824 gt v 853 lt and { + /v v 292 add def + } if + } { + /v v 1023 and 45 add def + } ifelse + + /d [ 2 2 2 2 2 2 ] def + /r 0 def /c 0 def /w 0 def /sum 0 def + { + sum v eq {exit} if + /t sum c2w r get c get add def + t v eq { + /w w 1 add def + d r w 2 add put + /sum t def + } if + t v gt { + d r w 2 add put + /r r 1 add def + /w 0 def + } if + t v lt { + /c c 1 add def + /w w 1 add def + /sum t def + } if + } loop + 20 0 1 4 {d exch get sub} for + d exch 5 exch put + version (b) eq version (limitedb) eq or { + /d [ d {1 add} forall ] def + } if + /cbs (111111111111) 12 string copy def + 5 -1 0 { + /i exch def + cbs 5 i sub 2 mul 1 add d i get 47 add put + } for + + % Concatenate the space bar successions + /sbs cws length 6 mul 31 add string def + encs encs length 2 sub get dup + sbs exch 0 exch putinterval + length /j exch def + 0 1 cws length 1 sub { + /i exch def + sbs j encs cws i get get putinterval + /j j 6 add def + } for + sbs j cbs putinterval + /j j 12 add def + encs encs length 1 sub get dup + sbs exch j exch putinterval + length j add /j exch def + /sbs sbs 0 j getinterval def + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt [ [text textxoffset textyoffset textfont textsize] ] + /textxalign (center) + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/posicode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER posicode-- + +% --BEGIN ENCODER codablockf-- +% --REQUIRES preamble raiseerror renmatrix-- +% --DESC: Codablock F +% --EXAM: CODABLOCK F 34567890123456789010040digit +% --EXOP: columns=8 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp codablockf 0.0 2015050900 125044 131468 +%%BeginData: 512 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/codablockf { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /rows -1 def + /columns 8 def + /rowheight 10 def + /sepheight 1 def + /encoding (auto) def + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /rows rows cvi def + /columns columns cvi def + /rowheight rowheight cvi def + /sepheight sepheight cvi def + + columns 4 ge columns 62 le and + rows 2 ge rows 44 le and rows -1 eq or and {/c columns def} if + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Convert input into bytes accounting for FNC characters + /swa -1 def /swb -2 def /swc -3 def /sft -4 def + /fn1 -5 def /fn2 -6 def /fn3 -7 def /fn4 -8 def + /sta -9 def /stp -10 def + + % Character maps for each state + /charmaps [ + % A B C A B C A B C + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 + [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 + [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 + [ (,) (,) (12) ] [ (-) (-) (13) ] [ (.) (.) (14) ] % 12-14 + [ (/) (/) (15) ] [ (0) (0) (16) ] [ (1) (1) (17) ] % 15-17 + [ (2) (2) (18) ] [ (3) (3) (19) ] [ (4) (4) (20) ] % 18-20 + [ (5) (5) (21) ] [ (6) (6) (22) ] [ (7) (7) (23) ] % 21-23 + [ (8) (8) (24) ] [ (9) (9) (25) ] [ (:) (:) (26) ] % 24-26 + [ (;) (;) (27) ] [ (<) (<) (28) ] [ (=) (=) (29) ] % 27-29 + [ (>) (>) (30) ] [ (?) (?) (31) ] [ (@) (@) (32) ] % 30-32 + [ (A) (A) (33) ] [ (B) (B) (34) ] [ (C) (C) (35) ] % 33-35 + [ (D) (D) (36) ] [ (E) (E) (37) ] [ (F) (F) (38) ] % 36-38 + [ (G) (G) (39) ] [ (H) (H) (40) ] [ (I) (I) (41) ] % 39-41 + [ (J) (J) (42) ] [ (K) (K) (43) ] [ (L) (L) (44) ] % 42-44 + [ (M) (M) (45) ] [ (N) (N) (46) ] [ (O) (O) (47) ] % 45-47 + [ (P) (P) (48) ] [ (Q) (Q) (49) ] [ (R) (R) (50) ] % 48-50 + [ (S) (S) (51) ] [ (T) (T) (52) ] [ (U) (U) (53) ] % 51-53 + [ (V) (V) (54) ] [ (W) (W) (55) ] [ (X) (X) (56) ] % 54-56 + [ (Y) (Y) (57) ] [ (Z) (Z) (58) ] [ ([) ([) (59) ] % 57-59 + [ 92 92 (60) ] [ (]) (]) (61) ] [ (^) (^) (62) ] % 60-62 + [ (_) (_) (63) ] [ 0 (`) (64) ] [ 1 (a) (65) ] % 63-65 + [ 2 (b) (66) ] [ 3 (c) (67) ] [ 4 (d) (68) ] % 66-68 + [ 5 (e) (69) ] [ 6 (f) (70) ] [ 7 (g) (71) ] % 69-71 + [ 8 (h) (72) ] [ 9 (i) (73) ] [ 10 (j) (74) ] % 72-74 + [ 11 (k) (75) ] [ 12 (l) (76) ] [ 13 (m) (77) ] % 75-77 + [ 14 (n) (78) ] [ 15 (o) (79) ] [ 16 (p) (80) ] % 78-80 + [ 17 (q) (81) ] [ 18 (r) (82) ] [ 19 (s) (83) ] % 81-83 + [ 20 (t) (84) ] [ 21 (u) (85) ] [ 22 (v) (86) ] % 84-86 + [ 23 (w) (87) ] [ 24 (x) (88) ] [ 25 (y) (89) ] % 87-89 + [ 26 (z) (90) ] [ 27 ({) (91) ] [ 28 (|) (92) ] % 90-92 + [ 29 (}) (93) ] [ 30 (~) (94) ] [ 31 127 (95) ] % 93-95 + [ fn3 fn3 (96) ] [ fn2 fn2 (97) ] [ sft sft (98) ] % 96-98 + [ swc swc (99) ] [ swb fn4 swb ] [ fn4 swa swa ] % 99-101 + [ fn1 fn1 fn1 ] [ sta sta sta ] [ stp stp stp ] % 102-104 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 105 dict 105 dict 105 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 2 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + /seta charvals 0 get def + /setb charvals 1 get def + /setc charvals 2 get def + + /fncvals << + (FNC1) fn1 + (FNC2) fn2 + (FNC3) fn3 + (FNC4) fn4 + >> def + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + % Determine digit runlength and characters from given position + /numsscr { + /n 0 def /s 0 def + /p exch def { + p msglen ge {exit} if + msg p get + dup setc exch known not {pop exit} if + fn1 eq { + % FNC1 in odd position of run like two digits + s 2 mod 0 eq {/s s 1 add def} {exit} ifelse + } if + /n n 1 add def + /s s 1 add def + /p p 1 add def + } loop + n s + } bind def + + % Encoding for each alphabet + /enca { + seta exch get cws exch j exch put + /j j 1 add def + } bind def + /encb { + setb exch get cws exch j exch put + /j j 1 add def + } bind def + /encc { + dup type /arraytype ne { + setc exch get + } { + aload pop 48 sub exch 48 sub 10 mul add + } ifelse + cws exch j exch put + /j j 1 add def + } bind def + + % Character exclusively in either alphabet A or B + /anotb {dup seta exch known exch setb exch known not and} bind def + /bnota {dup setb exch known exch seta exch known not and} bind def + + % Pre-compute relative position of next anotb and next bnota characters + /nextanotb [ msg length {0} repeat 9999 ] def + /nextbnota [ msg length {0} repeat 9999 ] def + msg length 1 sub -1 0 { + /i exch def + msg i get anotb { + nextanotb i 0 put + } { + nextanotb i nextanotb i 1 add get 1 add put + } ifelse + msg i get bnota { + nextbnota i 0 put + } { + nextbnota i nextbnota i 1 add get 1 add put + } ifelse + } for + + % Does a-only come before b-only after given position and vice versa + /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def + /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def + + % Add padding to row + /padrow { + { + { % common exit + cset (seta) eq {swc enca /cset (setc) def exit} if + cset (setb) eq {swc encb /cset (setc) def exit} if + cset (setc) eq {swb encc /cset (setb) def exit} if + } loop + } repeat + } bind def + + % Convert message to codewords + /cws c 5 add rows -1 ne {rows} {44} ifelse mul array def + + /i 0 def /j 0 def /r 1 def + /lastrow false def { + + lastrow {exit} if + + % Add start character and code subset selector + sta enca + i msglen lt {i numsscr} {-1 -1} ifelse /nums exch def /nchars exch def + { % common exit + msglen 0 eq { + swb enca + /cset (setb) def + exit + } if + nums 2 ge { + swc enca + /cset (setc) def + exit + } if + i abeforeb { + sft enca + /cset (seta) def + exit + } if + swb enca + /cset (setb) def + exit + } loop + /j j 1 add def % Skip row indicator position + + % Main encoding loop + /endofrow false def { + /rem c 3 add j c 5 add mod sub def % Codewords to end of row + + i msglen eq endofrow or {exit} if + + i numsscr /nums exch def /nchars exch def + + % Determine switches and shifts + { % common exit + cset (seta) eq cset (setb) eq or nums 4 ge and + msg i get fn1 ne and { + nums 2 mod 0 eq + rem 3 ge and { + swc cset (seta) eq {enca} {encb} ifelse + /cset (setc) def + 2 { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + } repeat + exit + } if + nums 2 mod 0 ne + rem 4 ge and { + msg i get cset (seta) eq {enca} {encb} ifelse + /i i 1 add def + swc cset (seta) eq {enca} {encb} ifelse + /cset (setc) def + 2 { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + } repeat + exit + } if + } if + cset (setb) eq msg i get anotb and + rem 2 ge and { + i msglen 1 sub lt { + i 1 add bbeforea { + sft encb + msg i get enca + /i i 1 add def + exit + } if + } if + swa encb + /cset (seta) def + msg i get enca + /i i 1 add def + exit + } if + cset (seta) eq msg i get bnota and + rem 2 ge and { + i msglen 1 sub lt { + i 1 add abeforeb { + sft enca + msg i get encb + /i i 1 add def + exit + } if + } if + swb enca + /cset (setb) def + msg i get encb + /i i 1 add def + exit + } if + cset (setc) eq nums 2 lt and + rem 2 ge and { + i abeforeb { + swa encc + /cset (seta) def + msg i get enca + /i i 1 add def + exit + } if + swb encc + /cset (setb) def + msg i get encb + /i i 1 add def + exit + } if + + % No switches or latches so try to encode + cset (seta) eq seta msg i get known and + rem 1 ge and { + msg i get enca + /i i 1 add def + exit + } if + cset (setb) eq setb msg i get known and + rem 1 ge and { + msg i get encb + /i i 1 add def + exit + } if + cset (setc) eq nums 2 ge and + rem 1 ge and { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + exit + } if + + % Encoding does not fit in the row + /endofrow true def + exit + + } loop % common exit + + } loop + + % Determine whether this is the final row + r rows eq rows -1 eq or r 1 gt and i msglen eq and rem 2 ge and { + rem 2 sub padrow + /j j 3 add def % Skip symbol and row checksum character positions + stp enca + /lastrow true def + } { + rem padrow + /j j 1 add def % Skip row checksum character positions + stp enca + /r r 1 add def + } ifelse + + } loop + /cws cws 0 j getinterval def + + % Maps for row indicators and symbol checksums + /abmap [ + 64 1 95 {} for + 0 1 15 {} for + 26 1 63 {} for + ] def + /cmap [ 0 1 85 {} for ] def + + % Add symbol check characters to last row + /chkmsg msglen array def + /j 0 def + 0 1 msglen 1 sub { + /i exch def + /char msg i get def + char 0 ge {chkmsg j char put /j j 1 add def} if + char fn1 eq i 0 ne and {chkmsg j 29 put /j j 1 add def} if + } for + /t1 0 def /t2 0 def /k1 0 def /k2 0 def + 0 1 j 1 sub { + /i exch def + /t1 chkmsg i get i mul 86 mod def + /t2 t1 chkmsg i get add 86 mod def + /k1 k1 t2 add 86 mod def + /k2 k2 t1 add 86 mod def + } for + cws cws length 4 sub cset (setc) ne {abmap} {cmap} ifelse k1 get put + cws cws length 3 sub cset (setc) ne {abmap} {cmap} ifelse k2 get put + + % Populate row indicators + cws 2 2 copy 1 sub get 99 ne {abmap} {cmap} ifelse r 2 sub get put + 1 1 r 1 sub { + /i exch def + cws i c 5 add mul 2 add 2 copy 1 sub get 99 ne {abmap} {cmap} ifelse i 42 add get put + } for + + % Calculate row check characters + 0 1 r 1 sub { + cws exch c 5 add mul c 4 add getinterval /rcws exch def + /csum rcws 0 get def + 1 1 rcws length 2 sub { + /i exch def + /csum csum rcws i get i mul add def + } for + rcws rcws length 1 sub csum 103 mod put + } for + + % Create an array containing the character mappings + /encs + [ (212222) (222122) (222221) (121223) (121322) (131222) (122213) + (122312) (132212) (221213) (221312) (231212) (112232) (122132) + (122231) (113222) (123122) (123221) (223211) (221132) (221231) + (213212) (223112) (312131) (311222) (321122) (321221) (312212) + (322112) (322211) (212123) (212321) (232121) (111323) (131123) + (131321) (112313) (132113) (132311) (211313) (231113) (231311) + (112133) (112331) (132131) (113123) (113321) (133121) (313121) + (211331) (231131) (213113) (213311) (213131) (311123) (311321) + (331121) (312113) (312311) (332111) (314111) (221411) (431111) + (111224) (111422) (121124) (121421) (141122) (141221) (112214) + (112412) (122114) (122411) (142112) (142211) (241211) (221114) + (413111) (241112) (134111) (111242) (121142) (121241) (114212) + (124112) (124211) (411212) (421112) (421211) (212141) (214121) + (412121) (111143) (111341) (131141) (114113) (114311) (411113) + (411311) (113141) (114131) (311141) (411131) (211412) (2331112) + ] def + + % Derive the bits for each row + /rowbits r array def + 0 1 r 1 sub { + /i exch def + /sbs [ + cws i c 5 add mul c 5 add getinterval { + encs exch get {48 sub} forall + } forall + ] def + mark + 0 sbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall + counttomark 1 sub array astore exch pop exch pop + rowbits i 3 -1 roll put + } for + + % Populate the bitmap + /symwid c 11 mul 57 add def + /pixs [ + symwid sepheight mul {1} repeat + 0 1 r 2 sub { + /i exch def + rowheight {rowbits i get aload pop} repeat + sepheight { + 1 1 0 1 0 0 0 0 1 0 0 + symwid 24 sub {1} repeat + 1 1 0 0 0 1 1 1 0 1 0 1 1 + } repeat + } for + rowheight {rowbits r 1 sub get aload pop} repeat + symwid sepheight mul {1} repeat + ] def + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx symwid + /pixy pixs length symwid idiv + /height pixs length symwid idiv 72 div + /width symwid 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/codablockf dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER codablockf-- + +% --BEGIN ENCODER code16k-- +% --REQUIRES preamble raiseerror renmatrix-- +% --DESC: Code 16K +% --EXAM: Abcd-1234567890-wxyZ +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp code16k 0.0 2015050900 142769 155916 +%%BeginData: 710 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/code16k { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /mode -1 def + /pos -1 def + /rows 0 def + /rowheight 8 def + /sepheight 1 def + /encoding (auto) def + /raw false def + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /mode mode cvi def + /pos pos cvi def + /rows rows cvi def + /rowheight rowheight cvi def + /sepheight sepheight cvi def + + pos -1 ne {/rows 16 def} if + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Convert input into bytes accounting for FNC characters + /swa -1 def /swb -2 def /swc -3 def + /sa1 -4 def /sb1 -5 def /sc1 -6 def + /sa2 -7 def /sb2 -8 def /sc2 -9 def + /pad -10 def /sb3 -11 def /sc3 -12 def + /fn1 -13 def /fn2 -14 def /fn3 -15 def /fn4 -16 def + + % Character maps for each state + /charmaps [ + % A B C A B C A B C + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 + [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 + [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 + [ (,) (,) (12) ] [ (-) (-) (13) ] [ (.) (.) (14) ] % 12-14 + [ (/) (/) (15) ] [ (0) (0) (16) ] [ (1) (1) (17) ] % 15-17 + [ (2) (2) (18) ] [ (3) (3) (19) ] [ (4) (4) (20) ] % 18-20 + [ (5) (5) (21) ] [ (6) (6) (22) ] [ (7) (7) (23) ] % 21-23 + [ (8) (8) (24) ] [ (9) (9) (25) ] [ (:) (:) (26) ] % 24-26 + [ (;) (;) (27) ] [ (<) (<) (28) ] [ (=) (=) (29) ] % 27-29 + [ (>) (>) (30) ] [ (?) (?) (31) ] [ (@) (@) (32) ] % 30-32 + [ (A) (A) (33) ] [ (B) (B) (34) ] [ (C) (C) (35) ] % 33-35 + [ (D) (D) (36) ] [ (E) (E) (37) ] [ (F) (F) (38) ] % 36-38 + [ (G) (G) (39) ] [ (H) (H) (40) ] [ (I) (I) (41) ] % 39-41 + [ (J) (J) (42) ] [ (K) (K) (43) ] [ (L) (L) (44) ] % 42-44 + [ (M) (M) (45) ] [ (N) (N) (46) ] [ (O) (O) (47) ] % 45-47 + [ (P) (P) (48) ] [ (Q) (Q) (49) ] [ (R) (R) (50) ] % 48-50 + [ (S) (S) (51) ] [ (T) (T) (52) ] [ (U) (U) (53) ] % 51-53 + [ (V) (V) (54) ] [ (W) (W) (55) ] [ (X) (X) (56) ] % 54-56 + [ (Y) (Y) (57) ] [ (Z) (Z) (58) ] [ ([) ([) (59) ] % 57-59 + [ 92 92 (60) ] [ (]) (]) (61) ] [ (^) (^) (62) ] % 60-62 + [ (_) (_) (63) ] [ 0 (`) (64) ] [ 1 (a) (65) ] % 63-65 + [ 2 (b) (66) ] [ 3 (c) (67) ] [ 4 (d) (68) ] % 66-68 + [ 5 (e) (69) ] [ 6 (f) (70) ] [ 7 (g) (71) ] % 69-71 + [ 8 (h) (72) ] [ 9 (i) (73) ] [ 10 (j) (74) ] % 72-74 + [ 11 (k) (75) ] [ 12 (l) (76) ] [ 13 (m) (77) ] % 75-77 + [ 14 (n) (78) ] [ 15 (o) (79) ] [ 16 (p) (80) ] % 78-80 + [ 17 (q) (81) ] [ 18 (r) (82) ] [ 19 (s) (83) ] % 81-83 + [ 20 (t) (84) ] [ 21 (u) (85) ] [ 22 (v) (86) ] % 84-86 + [ 23 (w) (87) ] [ 24 (x) (88) ] [ 25 (y) (89) ] % 87-89 + [ 26 (z) (90) ] [ 27 ({) (91) ] [ 28 (|) (92) ] % 90-92 + [ 29 (}) (93) ] [ 30 (~) (94) ] [ 31 127 (95) ] % 93-95 + [ fn3 fn3 (96) ] [ fn2 fn2 (97) ] [ sb1 sa1 (98) ] % 96-98 + [ swc swc (99) ] [ swb fn4 swb ] [ fn4 swa swa ] % 99-101 + [ fn1 fn1 fn1 ] [ pad pad pad ] [ sb2 sa2 sb1 ] % 102-104 + [ sc2 sc2 sb2 ] [ sc3 sc3 sb3 ] % 105-106 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 109 dict 109 dict 109 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 2 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + /seta charvals 0 get def + /setb charvals 1 get def + /setc charvals 2 get def + + raw {/encoding (raw) def} if + + encoding (raw) eq { + /cws barlen array def + /i 0 def /j 0 def + { % loop + i barlen eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + cws j cw put + /i i 4 add def + /j j 1 add def + } loop + /cws cws 0 j getinterval def + /text () def + } if + + encoding (auto) eq { + + /fncvals << + (FNC1) fn1 + (FNC2) fn2 + (FNC3) fn3 + (FNC4) fn4 + >> def + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + % Determine digit runlength and characters from given position + /numsscr { + /n 0 def /s 0 def + /p exch def { + p msglen ge {exit} if + msg p get + dup setc exch known not {pop exit} if + fn1 eq { + % FNC1 in odd position of run like two digits + s 2 mod 0 eq {/s s 1 add def} {exit} ifelse + } if + /n n 1 add def + /s s 1 add def + /p p 1 add def + } loop + n s + } bind def + + % Encoding for each alphabet + /enca { + seta exch get cws exch j exch put + /j j 1 add def + } bind def + /encb { + setb exch get cws exch j exch put + /j j 1 add def + } bind def + /encc { + dup type /arraytype ne { + setc exch get + } { + aload pop 48 sub exch 48 sub 10 mul add + } ifelse + cws exch j exch put + /j j 1 add def + } bind def + + % Character exclusively in either alphabet A or B + /anotb {dup seta exch known exch setb exch known not and} bind def + /bnota {dup setb exch known exch seta exch known not and} bind def + + % Pre-compute relative position of next anotb and next bnota characters + /nextanotb [ msg length {0} repeat 9999 ] def + /nextbnota [ msg length {0} repeat 9999 ] def + msg length 1 sub -1 0 { + /i exch def + msg i get anotb { + nextanotb i 0 put + } { + nextanotb i nextanotb i 1 add get 1 add put + } ifelse + msg i get bnota { + nextbnota i 0 put + } { + nextbnota i nextbnota i 1 add get 1 add put + } ifelse + } for + + % Does a-only come before b-only after given position and vice versa + /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def + /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def + + /cws barcode length 2 mul 3 add array def + + % Select mode and encode first characters + /i 0 def /j 0 def + { % common exit + % extended data length + pos -1 ne { + % encode one and two + cws 0 pos 10 idiv 1 sub put + cws 1 pos 10 mod 1 sub put + /j 2 def + /cset (setb) def + /mode 7 def + exit + } if + % empty => b + msglen 0 eq { + /cset (setb) def + /mode 1 def + exit + } if + % FNC1 . 2+ nums => c fnc1 + msglen 2 ge { + msg 0 get fn1 eq 1 numsscr exch pop 2 ge and { + /cset (setc) def + /mode 4 def + /i 1 def + exit + } if + } if + % FNC1 => b fnc1 + msg 0 get fn1 eq { + /cset (setb) def + /mode 3 def + /i 1 def + exit + } if + msglen 2 ge { + % 2+ even nums => c + 0 numsscr exch pop dup 2 ge exch 2 mod 0 eq and { + /cset (setc) def + /mode 2 def + exit + } if + % 3+ odd nums => c sb1 encode + 0 numsscr exch pop dup 3 ge exch 2 mod 1 eq and { + msg 0 get encb + /cset (setc) def + /mode 5 def + /i 1 def + exit + } if + % b . 2+ even nums => c sb1 encode + setb msg 0 get known + 1 numsscr exch pop dup 2 ge exch 2 mod 0 eq and and { + msg 0 get encb + /cset (setc) def + /mode 5 def + /i 1 def + exit + } if + % b . 3+ odd nums => c sb2 encode + setb msg 0 get known + 1 numsscr exch pop dup 3 ge exch 2 mod 1 eq and and { + msg 0 get encb + msg 1 get encb + /cset (setc) def + /mode 6 def + /i 2 def + exit + } if + % b . b . 2+ even nums => c sb2 encode + setb msg 0 get known + setb msg 1 get known and + 2 numsscr exch pop dup 2 ge exch 2 mod 0 eq and and { + msg 0 get encb + msg 1 get encb + /cset (setc) def + /mode 6 def + /i 2 def + exit + } if + } if + % anotb before bnota => a + 0 abeforeb { + /cset (seta) def + /mode 0 def + exit + } if + % otherwise => b + /cset (setb) def + /mode 1 def + exit + } loop + + { % Encode remainder + i msglen eq {exit} if + + i numsscr /nums exch def /nchars exch def + + % Determine switches and shifts + { % common exit + cset (seta) eq { + % bnota . anotb before bnota => sb1 encode + i msglen 1 sub lt { + msg i get bnota + i 1 add abeforeb and { + sb1 enca + msg i get encb + /i i 1 add def + exit + } if + } if + % bnota . bnota . anotb before bnota => sb2 encode + i msglen 2 sub lt { + msg i get bnota + msg i 1 add get bnota and + i 2 add abeforeb and { + sb2 enca + msg i get encb + msg i 1 add get encb + /i i 2 add def + exit + } if + } if + % bnota => swb + msg i get bnota { + swb enca + /cset (setb) def + exit + } if + % 4 nums . a => sc2 encode + i msglen 4 sub lt { + nums 4 eq + seta msg i 4 add get known and { + sc2 enca + 2 { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + } repeat + exit + } if + } if + % 6 nums . a => sc3 encode + i msglen 6 sub lt { + nums 6 eq + seta msg i 6 add get known and { + sc3 enca + 3 { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + } repeat + exit + } if + } if + % 4+ even nums => swc + nums 4 ge nums 2 mod 0 eq and { + swc enca + /cset (setc) def + exit + } if + % otherwise => encode + msg i get enca + /i i 1 add def + exit + } if + cset (setb) eq { + % anotb . bnota before anotb => sa1 encode + i msglen 1 sub lt { + msg i get anotb + i 1 add bbeforea and { + sa1 encb + msg i get enca + /i i 1 add def + exit + } if + } if + % anotb . anotb . bnota before anotb => sa2 encode + i msglen 2 sub lt { + msg i get anotb + msg i 1 add get anotb and + i 2 add bbeforea and { + sa2 encb + msg i get enca + msg i 1 add get enca + /i i 2 add def + exit + } if + } if + % anotb => swa + msg i get anotb { + swa encb + /cset (seta) def + exit + } if + % 4 nums . b => sc2 encode + i msglen 4 sub lt { + nums 4 eq + setb msg i 4 add get known and { + sc2 encb + 2 { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + } repeat + exit + } if + } if + % 6 nums . b => sc3 encode + i msglen 6 sub lt { + nums 6 eq + setb msg i 6 add get known and { + sc3 encb + 3 { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + } repeat + exit + } if + } if + % 4+ even nums => swc + nums 4 ge nums 2 mod 0 eq and { + swc encb + /cset (setc) def + exit + } if + % otherwise => encode + msg i get encb + /i i 1 add def + exit + } if + cset (setc) eq { + % 2+ nums => encode + nums 2 ge { + msg i get fn1 eq { + fn1 encc + /i i 1 add def + } { + msg i 2 getinterval encc + /i i 2 add def + } ifelse + exit + } if + % b . 2+ even nums => sb1 encode + i msglen 1 sub lt { + setb msg i get known + i 1 add numsscr exch pop dup 2 ge exch 2 mod 0 eq and and { + sb1 encc + msg i get encb + /i i 1 add def + exit + } if + } if + % b . 3+ odd nums => sb2 encode + i msglen 1 sub lt { + setb msg i get known + i 1 add numsscr exch pop dup 3 ge exch 2 mod 1 eq and and { + sb2 encc + msg i get encb + msg i 1 add get encb + /i i 2 add def + exit + } if + } if + % b . b . 2+ even nums => sb2 encode + i msglen 2 sub lt { + setb msg i get known + setb msg i 1 add get known and + i 2 add numsscr exch pop dup 2 ge exch 2 mod 0 eq and and { + sb2 encc + msg i get encb + msg i 1 add get encb + /i i 2 add def + exit + } if + } if + % b . b . 3+ odd nums => sb3 encode + i msglen 3 sub lt { + setb msg i get known + setb msg i 1 add get known and + i 2 add numsscr exch pop dup 3 ge exch 2 mod 1 eq and and { + sb3 encc + msg i get encb + msg i 1 add get encb + msg i 2 add get encb + /i i 3 add def + exit + } if + } if + % b . b . b . 2+ even nums => sb3 encode + i msglen 3 sub lt { + setb msg i get known + setb msg i 1 add get known and + setb msg i 2 add get known and + i 3 add numsscr exch pop dup 2 ge exch 2 mod 0 eq and and { + sb3 encc + msg i get encb + msg i 1 add get encb + msg i 2 add get encb + /i i 3 add def + exit + } if + } if + % anotb before bnota => swa + i abeforeb { + swa encc + /cset (seta) def + exit + } if + % otherwise => swb + swb encc + /cset (setb) def + exit + } if + exit + } loop + + } loop + /cws cws 0 j getinterval def + } if % auto encoding + + % Basic metrics for the each symbol + % r dcws + /metrics [ + [ 2 7 ] + [ 3 12 ] + [ 4 17 ] + [ 5 22 ] + [ 6 27 ] + [ 7 32 ] + [ 8 37 ] + [ 9 42 ] + [ 10 47 ] + [ 11 52 ] + [ 12 57 ] + [ 13 62 ] + [ 14 67 ] + [ 15 72 ] + [ 16 77 ] + ] def + + % Select metrics of an appropriate symbol + /urows rows def + /i 0 def + { % loop + /m metrics i get def + /r m 0 get def % Columns in symbol + /dcws m 1 get def % Data codewords in symbol + /okay true def + urows 0 ne urows r ne and {/okay false def} if + cws length dcws gt {/okay false def} if + okay {exit} if + /i i 1 add def + } loop + + % Extend cws to ncws codewords by addition of pad characters + /cws [ cws aload pop dcws cws length sub {103} repeat ] def + + % Add the start character + /cws [ r 2 sub 7 mul mode add cws aload pop ] def + + % Calculate the check characters + 0 0 1 dcws {dup 2 add exch cws exch get mul add} for + 107 mod /c1 exch def + 0 0 1 dcws {dup 1 add exch cws exch get mul add} for + c1 dcws 2 add mul add 107 mod /c2 exch def + /cws [ cws aload pop c1 c2 ] def + + % Create an array containing the character mappings + /encs + [ (212222) (222122) (222221) (121223) (121322) (131222) (122213) + (122312) (132212) (221213) (221312) (231212) (112232) (122132) + (122231) (113222) (123122) (123221) (223211) (221132) (221231) + (213212) (223112) (312131) (311222) (321122) (321221) (312212) + (322112) (322211) (212123) (212321) (232121) (111323) (131123) + (131321) (112313) (132113) (132311) (211313) (231113) (231311) + (112133) (112331) (132131) (113123) (113321) (133121) (313121) + (211331) (231131) (213113) (213311) (213131) (311123) (311321) + (331121) (312113) (312311) (332111) (314111) (221411) (431111) + (111224) (111422) (121124) (121421) (141122) (141221) (112214) + (112412) (122114) (122411) (142112) (142211) (241211) (221114) + (413111) (241112) (134111) (111242) (121142) (121241) (114212) + (124112) (124211) (411212) (421112) (421211) (212141) (214121) + (412121) (111143) (111341) (131141) (114113) (114311) (411113) + (411311) (113141) (114131) (311141) (411131) (211412) (211214) + (211232) (211133) + ] def -% --BEGIN ENCODER codablockf-- -% --REQUIRES preamble raiseerror renmatrix-- -% --DESC: Codablock F -% --EXAM: CODABLOCK F 34567890123456789010040digit -% --EXOP: columns=8 -% --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp codablockf 0.0 0 0 0 -%%BeginData: 130 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\+F _u#; Ot;bP 061u TBO tmjBQPA;Dg ,l+BkM+$Ot; -bP06:]DBOtmjBQP A-P#QC/EcYf=05YcC+C\c"@rGmhP%'TNOu"b+L]ESo@UX:eDe*F+NWEILNI-gJD0'?Q5&- -6EP'N4"C6AUR!KmI:C6CcD1QlmD3/@Qj"-Q?@/8]H@P!3W:!KsFF5*C/R30Ia,"-TX>"-Pj29R -V8N3,N_LP!3WD5*C2S@VV&,05?Y6Ou"b#@<,jrA7Zm#F(^:/C6D8R1Qk"OP#ZpnAUT_@04J@1C -h7K,@UX:eDe*FB@ZiN#F*D&Ks,o/kF*D)LrfT&jF*D,MrK8riF(TNMr/rihAo9>ZqiW`gAo9A[ -qNp*@ -3!?mI(+cZUX0jPo+NWC>a!@!O*0JZoV>E/_/NWCAb!\cE9+Bsj,,`VmNNWLmk>p*@3!@/NWCJe!@Eg.0K*2Z>E/_3NWCMf!\cQ=+BsXMLa\8b0K<>\>DO_a.?4H`3F*b3NWCVi!@ -j*20eclU>E/_7NWCYj!\lE8+Bsj,/<0`^NWLpj>p*@3!A0<4/WKle1L2,-NWCbm!A9B60f3/Y> -E/_;NWCen!\lQ<+Bsj,0TH/fNWLpn>p*@3!ATT80oc;i2dIP1NWCnq!A]Z:0fWG]>E/_?NWCqr -!\l]@+Bsj,1l_SnNWLsi>p*@3!B#l<23%_n0jPo+NWD%u!B,r>1,<,X>E/_CNWD)!!\uQ;+Bsj -,30"#!NWLsm>p*@3!BH/@3K=.r2-h>/NWD2$!BQ5B1,`D\>E/_GNWD5%!\u]?+Bsj,4H9G)NWL -sq>p*@3!BlGD4cTS!3F*b3NWD>(!BuMF1GE)W>E/_KNWDA)!])Q:+Bsj,5`Pk1NWM!l>p*@3!C -;_H6&l"&1L2,-NWDJ,!CDeJ1GiA[>E/_ONWDM-!])]>+Bsj,7#h:9NWM!p>p*@3!C`"L7?.F*2 -dIP1NWDV0!Ci(N1H8Y_>E/_SNWDY1!])iB+Bsj,8<*^ANWM$k>p*@3!D/:P8WEj/0jPo+NWDb4 -!D8@R1br>Z>E/_WNWDe5!]2]=+Bsj,9TB-INWM$o>p*@3!DSRT9o]932-h>/NWDn8!D\XV1cAV -^>E/_[NWDq9!]2iA+Bsj,:lYQQNWM$s>p*@3!E"jX;2t]73F*b3NWE%E/__NWE -(=!];]<+Bsj,p*@3!EG-\E/_cNWE4A!];i@+B -sj,=H3DaNWM'r>p*@3!EkE`=cNP@2dIP1NWE=D!EtKb2)nka>E/_gNWE@E!];uD+BsY,Lg5rA2 -DADZ>E/_iNWEFG!]Dc=+Bsj,?B,%mNWM*o>p*@3!FLif?]G1G1L2,-L]EG9@#b:H1gM5.L]NM: -@?(CI2-h>/L]WS;@ZCLJ2I.G0L]`Y<@u^UK2dIP1L]i_=A<$^L3*dY2L]re>AW?gM3F*b3L^&k -?ArZpO0O5f*L^/q@B9!$P0jPo+L^9"ABT<-Q10l#,L^B(BBoW6R1L2,-L^K.CC5r?S1gM5.L^T -4DCQ8HT2-h>/L^]:EClSQU2I.G0L^f@FD2nZV2dIP1L^oFGDN4cW3*dY2L_#LHDiOlX3F*b3L_ -,RIE/juZ0O5f*L_5XJEK1)[0jPo+L_>^KEfL2\10l#,L_GdLF,g;]1L2,-L_PjMFH-D^1gM5.L -_YpNFcHM_2-h>/L_c!OG)cV`2I.G0L_l'PGE)_a2dIP1L_u-QG`Dhb3*dY2L`)3RH&_qc3F*b3 -L`29SHB&%e0O5f*L`;?TH]A.f0jPo+L`DEUI#\7g10l#,L`MKVI?"@h1L2,-L`VQWIZ=Ii1gM5 -.L`_G&NWM3u>p*>oAo9CIAo9Db!]`/E+Bot#DDE>HDDI4R3B(4d>9J!!Fp*>oF*D(9Ao9FJF*D(9>p*>oAo9FJF*D%8F*D%8>p*>oAo9=GAo9=GAo9=G>p -*>oF*(h5F*(h5F*(h5>p*>oF*)@DF*)@DF*)@D>p*F91G<6O@<-O"Ci^_'LhW#0LhW#0LhW#0? -'7""!/LYcBOPpu@;p:N@Yb&JWI$:4P!5$b04f$2F!+t+@<-3nE-!.9P"UroL]E53L]VoVC6CcD -1M(H6F!,4\99M8tY:js=EbTE(FEqh:P!+/J!0U!'P#Pq)@<-O"Ci^_6P"Us%Bp*^hP":"a82#$ -qFC?;%BOPq)@;L"@!0U!<1G1G< -?X@s29sF!*S-NW_gH6SW1j0ocB+:.$dKDDI4T7SZ<,Ao9Db"@c-R1hLV^+?huP1G"HlHA99M(aBcq,G"HieK1OXU'Bcq,G!KmJH1OYEdI?IQHF(ZV -1+Cf(nEftZ#Bcq,G!KmJH1G4E09Id(B9H_NL]DjdK8(`a?'6usD -In'7@W$++@3AbsD0'?Q@XEn2I?K5;-P'LG1Mq2GP%'4JP,X9;L]DcTBp(ZC1Mq2G+DI!3@;^"* -@XB58AU&<*DJsW++DHW3P'DD%DIn'7@;^"*@N]A-DIn'7@;^"*@N]B@!KmJH98EV3!Kq\UP#Z@ -?B-:oO94DdWFCBM=DIn'7@W$++@3B9?!0VSTHZ!D>FCK-+FC?;++Dtb8FCK-+FC?;+L]NY>P"U -T3Oo^_jI?ITYP"767@V'.iEb/^,OuR>jG][A3DffHO5*AR%5&OqVFCK-+FCC=rP"UsMI?G)'1G -<3HAS,k$ARTqK3,W;PFCK-+FCC=rP"Us%DIn'7@;^"*@Zip<99Nn8Oq*X205t?1Ec6/KH[?lFF -(KHR"ES-r@?Nd#F*D+:ASu!d04T'7FH-KFATVFF1Qk"OP#Pq4ATWq8F(KH&P!+/5G@Mb,DI[-/ -@rl4'NWaE7FCUIiP!FGY<+Bu\FH-KFATVFF4aV6o@N]6"@q.0%F(KHR"ES-r@ZiO15^eepI?J/ -iP(S1G%[&V$@s;u:@u(;O!HN+&F,9jZD0p;AGB81ZLb*t;dD3>$KDKTf;L]W`SL]ET$Eb0*D"-Q9>"FG36@j#9& -ATWq8F(KH%P!+/'DI[+'HQZm;@q'kLd4aUdY0d(% -F@q.0++DHW4Oo^_%I=#gPB-:oE!g65gDI[00Bcq,G!g3SI1OYEdI?K5G5^eepDKTf;L]W`SL]E -TTEb0*D"HlB?"FG!,B-:oO94N$SFH-KFATV@D4aUaX@pse4+D#G#@XXD>052PCL]NY>Ou%0'@j -#9&ATWq8F(KH%P!+/'DI[+'HQZm;@q'kLd4aUdY0 -d(%F@q.0++DHW4Oo^_%I=#gPB-:oE!g65gDI[00Bcq,G!g3SI1OYEdI?K5G5^eepI?IQ>F(KHR -"ES-r@ZilkF(ZV0P"T5$DffHO"EJ'jL]W`3Op$,G+Dl14Ch7L?!KsFFAp\6J!KmIm@V'.iEb/[ -++EM.:+D#G#@N]N/B-:oO94`!N@4u=;BnueQ!Ko7%5^eepI?IQNG@;V*DI[-/@rl4'NWaE7FCC -=gD0'>4Bp),#DI[*.Bcq,G!KmJH1Qk"OP#Pq4ATWq8F(KH%P!*Z'B-:oO94DdWFCC=8Eb0*D!g -60="FFi*D0'?+AT!;)P,XUVHYJ9:Oo]!#AS,k$AR^!/F(TM:ASu!d+Dl14+DI!3ASu!e052PCL -]NY>Ou&7dI?IQXP#QLH@N]6"@pq$#F(KHR"ES-r@ZiNaF(ZV0P"TA(@q%**+DHW4Oo^_%P!FGY -<+Bu\FH-KFATVFF4`5CZF,0m\As*:;ASm5)P"Ll?HYFU2@V'.iEb/^,+EMa8+D#G#@kV>5ATWq -8F(KH%Ou$rrB-:oO94`!N@4u=;BnueQ!Ko7%5^eepF*D(9ASu!f04T'7FH-KFATVCE1Mq2G+DI -!3ASu!e052PCL]NY>Ou&7dI?IQ>F(KHR"ES-r@?NcpATV?'D0'>4Bp),P@$1Y5ASm5(P"Ll?HY -mh:+DI!3ASu!d052PCL]NY>Ou&7dI?IQ>F(KHR"ES-r@ZilqATVB(D0'>4Bp),P@$1Y5ASm5(P -"Ll?HYmh:+DI!3ASu!e052PCL]NY>Ou&7dI?IQ>F(KHR"ES-rA!/umF_u2U!g60="EJ'jL]NZ2 -Op$,KF(ZV0P"TD)0p4\HAo9=GASu!f052PCL]NY>Ou%N5D0'>4BnuhR9P&*O@kVO=BnuhR!Ko6 -eP#[Z1I?IP_ASu$sAo_g6+EVXHAWej45^ef,I?J/^+EDCEF-8\,Dg-8Ys,oO.EcQs:P#.;EBcq -86B5D-sP!+s2Eb0*D!g60="FG0#D287VWGl9VEc6.TC*78I"-N\J1NRYW+D#G#@4uG*F*)G@G9 -D!JF_-^lI=$!GD'3e+A9)U405;VEL]NY>Ou%0$E$/_0@pq$2+EE8=Oo^_%I?ITYP%?:VGB4m:G -B8Q?C6D8R1G<0GD..B+>DPP#!Jk*0I?I-W!/LZ3%sr_f8;J1?!JiseI?I-,Ou"b$D..B+>DN98 -!Jja&I?I-,Ou"b$BPVI+B-;&4B5D-sOpR:-05?:COu%moL]M@6B5D-sL]N[BOPp(Ao9>d4_] -]PP&6?bHXg`)D0'>4C5L]ESo06At*!0T,kCGCVFOu"b,15 -Gpn1Pc$e!G[DkP,Wd]Bp(ZC1G4Bp),'P&,qTP%p.906ArlF>4nJBPVI+B-:oO9 -9K=3B![LfT[ROu"b,1*C?f+ET?$!Jjd>C6CB$P"9),F!+t:F-:!g"Ho`o -F(KHR"ES-rA!1\U@:F(^E.*'U@r5XnI?ITG0p51mG[kr=+CfV:P%'4LP,Vr4ATWq8F(KH'P&5P -S@VoOmI=!)HD..C3P#Z9QP"Us_@s061QHF-8_M1 -G<6ZF_r7A@s1,=jo1,:U>1,=j -o1,:U?1,4dn0etI=1,Fpp0etI>1,=jo0f(O>1,=jo0etL>0f+go0etL?0f"an0f(R?0f"an1,: -R>0f+go1,:R?0f"an1,CX?0f"an0ekF=1GXsp0etL=1GXsp0etL>1GOmo0ekI>1,=jo0etO>1, -=jo0etO?1,4dn1,:X@0en[m1,:R=1GXsp1,:R>1GOmo1,1R?0f"an1,:X?0f"an1GLX>1GOmo1 -GLU>1,=jo1GU[>1,=jo1GU[?1,4dn1GLX?0f"an1GU^?0f"an1GU^@0en[m1,1O=1,Fpp1,1O? -1,4dn1,C[?1,4dn0ekC=1,Fpp0f(O=1,Fpp0f(O?1,4dn0ekF>0f+go0f(R>0f+go0f(R@0en[ -m1,1L>0f+go1,CX>0f+go1,CX@0en[m0ekF<1Gb$q0ekF>1GOmo0f(R>1GOmo0ekI=1,Fpp0ek -I?1,4dn0f(U?1,4dn1GL[?1,4dn1,1L>1GOmo1,CX>1GOmo1,1R>0f+go1,1R@0en[m1,1R>1G -Omo1GLU=1,Fpp1GLU?1,4dn1G^a?1,4dn1GLX>0f+go1GLX@0en[m1G^d@0en[m1GL^@0en[m1 -,:R@0en[m1c$j@0en[m0ekC<1,P!q0ekC>1,=jo0etI<1,P!q0etI?1,4dn0f1U>1,=jo0f1U? -1,4dn0ekF=0f4mp0ekF?0f"an0etL=0f4mp0etL@0en[m0f1X?0f"an0f1X@0en[m1,L^@0en[ -m1,:R=0f4mp1bgd@0en[m1,L^?0f"an0f(X@0en[m0ekC<1bt'q0etI<1bt'q0etI=1bk!p0ek -L?0f"an0etR?0f"an0etR@0en[m1bg^?0f"an1bpd?0f"an1bpd@0en[m1,1O=1bk!p1,1U?1, -4dn1bga?1,4dn0ekC;1c(-r0ekC=1bk!p0f(O=1bk!p0ekL>0f+go0ekL@0en[m1bg^>0f+go1 -bg^@0en[m0ekI=1bk!p0ekL>1GOmo1GLU=1bk!p1bg^>1GOmo1,1L?0f"ao1,C^@0ekFhOu"b3 -Dg,Z)FE8RFOpR:-L]E53EejaZWI$:4P!5$b06:TD+BosuGB4m@+Cg32Oo^_^@u(;O!Kp-'ASu" -!P!5%%H\aA=WI9q$I?I0-Ou$r`EbgI2F(03;L]NZ@L]NZ%H[CPKI=6HhL]MpPP#[ZtI?I0b)i+ -NXWKIRN$^*]:FcnqOF`MDE@VKq*+DHW6M#WWnP'DD<82#%0D0K])+Cg38P&,q7Oo^_%05tWMF! -+[0F*VVHBk/?-AT2P')29K6(UCBOtmjBQSTW!Jgc4!/LZ3!/LW2!/LW2!Jg`3!- -% uk.co.terryburton.bwipp/codablockf 0.0 0 -%%EndData -%%EndResource -% --END ENCODER codablockf-- + % Start/stop character encodings + /startencs [ + (3211) (2221) (2122) (1411) (1132) (1231) (1114) (3112) + (3211) (2221) (2122) (1411) (1132) (1231) (1114) (3112) + ] def + /stopencsodd [ + (3211) (2221) (2122) (1411) (1132) (1231) (1114) (3112) + (1132) (1231) (1114) (3112) (3211) (2221) (2122) (1411) + ] def + /stopencseven [ + (2122) (1411) (1132) (1231) (1114) (3112) (1132) (1231) + (1114) (3112) (3211) (2221) (2122) (1411) (3211) (2221) + ] def + pos -1 eq pos 10 idiv 2 mod 1 eq or { + /stopencs stopencsodd def + } { + /stopencs stopencseven def + } ifelse + + % Derive the bits for each row + /rowbits r array def + 0 1 r 1 sub { + /i exch def + /sbs [ + 10 + startencs i get {48 sub} forall + 1 + cws i 5 mul 5 getinterval { + encs exch get {48 sub} forall + } forall + stopencs i get {48 sub} forall + 1 + ] def + mark + 1 sbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall + counttomark 1 sub array astore exch pop exch pop + rowbits i 3 -1 roll put + } for -% --BEGIN ENCODER code16k-- -% --REQUIRES preamble raiseerror renmatrix-- -% --DESC: Code 16K -% --EXAM: Abcd-1234567890-wxyZ -% --EXOP: -% --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp code16k 0.0 0 0 0 -%%BeginData: 158 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D P!5%OP!5$bI -=%,/FE2M8Ou%NL< IL$AOr fcH 05kf OBl@ m1P !5$bI?IQJE -,f4DKC/f1O -YEX05YW!AA2N5*@^bFcn_?!/L`?9Tgr -DF(^Y"C5;nRWKKH.G`k%L@Yb,LWJCY>5*ATfH]g@*F(^Y"C6CcDH'2WOOo[4NP!5$b04J@1@rG -mh+Dl14L]D1Q9Th2p5^eeqI?J/iP#O)D@<-0qDBNCsEas#uAWgMc1GOrH1GE/_-NWC;`!\c?7+Bsj,,)u[JNWLmi>p*@3!@*U*,E;gZ1L2,-NWCD -c!@3[,0Jm&X>E/_1NWCGd!\cK;+Bsj,-B8*RNWLmm>p*@3!@Nm.-]S6^2dIP1La\'-NWLmo>p* -@-.>TF5!\cW?+Bsj,.ZONZNWLph>p*@3!@s02.ujZc0jPo+NWC\k!A'640f!#W>E/_9NWC_l!\ -lK:+Bsj,/rfrbNWLpl>p*@3!ABH609-)g2-h>/NWCho!AKN80fE;[>E/_=NWCkp!\lW>+Bsj,1 -6)AjNWLpp>p*@3!Af`:1QDMk3F*b3NWCts!Aof<1,)uV>E/_ANWD"t!\uK9+Bsj,2N@erNWLsk ->p*@3!B6#>2i[qp1L2,-NWD,"!B?)@1,N8Z>E/_ENWD/#!\uW=+Bsj,3fX5%NWLso>p*@3!BZ; -B4,s@t2dIP1NWD8&!BcAD1,rP^>E/_INWD;'!\ucA+Bsj,5)oY-NWM!j>p*@3!C)SF5E5e$0jP -o+NWDD*!C2YH1GW5Y>E/_MNWDG+!])W<+Bsj,6B2(5NWM!n>p*@3!CMkJ6]M4(2-h>/NWDP.!C -VqL1H&M]>E/_QNWDS/!])c@+Bsj,7ZIL=NWM!r>p*@3!Cr.N7udX,3F*b3NWD\2!D&4P1b`2X> -E/_UNWD_3!]2W;+Bsj,8r`pENWM$m>p*@3!DAFR99''11L2,-NWDh6!DJLT1c/J\>E/_YNWDk7 -!]2c?+Bsj,:6#?MNWM$q>p*@3!De^V:Q>K52dIP1NWDt:!DndX1cSb`>E/_]NWE";!]2oC+Bsj -,;N:cUNWM'l>p*@3!E5!Z;iUo:0jPo+NWE+>!E>'\2)8G[>E/_aNWE.?!];c>+Bsj,p*@3!EY9^=,m>>2-h>/NWE7B!Eb?`2)\__>E/_eNWE:C!];oB+Bsj,>)iVeNWM't>p*@3!F -(Qb>E/bB3F*b3Lg5a@NWM*m>p*@3!F:]d?&etE0jPo+NWEIH!FCcf2DSP\>E/_kNWELI!]Di?+ -BsX%NWEOJ!]Dl@+BsX&NWERK!]DoA+BsX'NWEUL!]DrB+BsX(NWEXM!]DuC+BsX)NWE[N!]E#D -+BsX*NWE^O!]E&E+BsX+NWEaP!]Mf=+BsX,NWEdQ!]Mi>+BsX-NWEgR!]Ml?+BsX.NWEjS!]Mo -@+BsX/NWEmT!]MrA+BsX0NWEpU!]MuB+BsX1NWEsV!]N#C+BsX2NWF!W!]N&D+BsX3NWF$X!]N -)E+BsX4NWF'Y!]N,F+BsX5NWF*Z!]Vl>+BsX6NWF-[!]Vo?+BsX7NWF0\!]Vr@+BsX8NWF3]!] -VuA+BsX9NWF6^!]W#B+BsX:NWF9_!]W&C+BsX;NWF<`!]W)D+BsXNWFEc!]W2G+BsX?NWFHd!]_r?+BsX@NWFKe!]_u@+BsXANWFNf!]`#A+BsXBNWFQg -!]`&B+BsXCNWFTh!]`)C+BsXDLjtEd3Ak(b>9INq1E^:I1QDMs2I.G0+D,LH+D,LHNWM4">p*> -oF(-jHF($e`!]`5G+Bot0G@Mb:G@QX73B:@f>9J!2@N]9#1a$j`@N\r!>9INq1a$j`@3BW8@3A -hu>9INq0d((G0d((G0d'aE>9IlnA0>i"A0>i"A0>/#>9Iur1*CXH1*CXI0d'aE>9Ius1*CXJ1* -CXI1*BjF>9Ius1E^aK1E^aJ1E]sG?'6us@q]:kG%#3.+BsY=Ou8&4Ou8&4Ou6O.1Pc$e!FoeOE -c#6(F-:!g!KsF/056S5Ou"b&DI[`1@q]:kD..C)+DI!3Ou%moL]N;5HS9,s5*@^5DI[`1C6D5Q -30LHuF*)G:DJ+':E+P1qH\_Zb97;t&@q]:kG%#3.+DR'4P!3TCG^Y`GI?I,SF(KH%+Cf(nEctl --F,0gZ99M(aF(KH&+Cf(nEctl-F,0j[99M(aF(KH'+Cf(nEctl-F,0m\99M)O@<[&OASu!rA8, -poNWX<1GEOb1P#Q"1@rGmlDJ+t3Eaa0T4aShlGB4m9@<-0qDNY"-Q?@/4uI?IQ@DI[TqBl7RD"CZFpDj!8104o*3 -G%#3.+?VcH"@c-R0kP;XNW_gH6S`7k16)K,:.$gLDDR:U7SZ<-Ao9FJ5!G,c05YcC+C\c"Ch7L -I$'I(tBnubP1GP"UU;P&5P!@q]:k+D,M$G% -#3.+C\c"@rGmh+DHW4Oo^@AP"_$3Ou"b*+DHW7Oo^_%I=!V]+DHW4Oo^_%I?ITYP#Q:>B-:q3@ -q]:kP'AWo+DHW4Oo^_%05;VEL]NY>Ou%NLAM7nAB-;&4B8?P&P"_#p05YcCCh7K,D0'?Q@ZiN# -DKTf;F(96;05cRGOu"b4L]ESo06!(>Oo^_%I=%,BI?ITYP#O)P+Duu9Oo^_%068 -7WL]NY>Ou"b1+E3,;Oo^_%I?J/Z+EMso%[&V$ASu!dHQ[B@FCC=rP"T;/F-8_%P!5%R05;VEL] -NY>Ou%NL%[&V$ASu!eHQ[B@FCLCsP"T;/F-8_%P!5%R05;VEL]NY>Ou%NL%[&V$ASu!fH]g@OY -:j=)Eaa68H#R>XD0p>8FCUItP"U4MOogehLbP!kP!4[UP,X6EP&-9^I?IT?GB8p2C6CcDGVSD0'?Q@Yb&JWJLS1!.-A5P!5$bD0'>4Bp)+tDJsW+HQ -[3;G][A3DffG2BnubPG^XpVAU&<*DJsW++DDs9AU&<*DJsW++DHW4Oo^_=L]NY>P'DD<B5D-sL]W`3H\_Z>F_u2@@rd_rP')pIL]W`3P! -4['P%odQP!+s2HS8lMATWq8F(KH'Ou"b.De*F8!g5@&5^eepL]D=8D0'c.EfrVLFcn_?"-Q9>5 -)99'C5;nR4d#qpD0'?G!0TudDI[-/@rl4'NWaE7FCUIi05YWJAoD^$@XBbF(]<#DN[/0P!FGY<,!ImF_u2@@ra5?F_u2_5*@ -]TDI[?gEc[C-Ou%GpF(KHR"ES-r@?Nd#Bcq86B5D-sL]N[Ou&7dI?IQXP#Q-B-:oO94DdWFCBM -=F*D(9ASu!d04T'7FH-KFATVCE1Qk"OP#Q-d4aUdY0d(%F@q.0++DHW4Oo^_%I=#gPB- -:oE!g65gDI[00Bcq,G!g3SI1OYEdI?K5G5^eepI?IQD+Dl14Ch7L?#*PsKAp\EOu&7dI?IQ>F(K -HR"ES-r@Zim$Bcq86B5D-sL]N[Ou&7dI?IQXP#Q-B-:oO94;^VFCKS>F*D%8ASu!e04T'7FH-K -FATV@D1Qk"OP#Q-d4aUdY0d(%F@q.0++DHW4Oo^_%I=#gPB-:oE!g65gDI[00Bcq,G!g -3SI1OYEdI?K5G5^eepI?IQD+Dl14Ch7L?#*PsKAp\EOu&7dI?IQ>F(KHR"ES-rA!0!%DKTf;L]W -`3HYmh:+DI!3Ao9>d4aUdY0d(%F@q.0++DHW4Oo^_%I=#gPB-:oE!g65gDI[00Bcq,G!g3SI1O -YEdP!FGY<,!IlF(]<#DMS=VWKLk?F(KH&+Dl14+DI!3P$i![!KmJ$F_u2@@rd_rP')pIL]W`3P -!4['P%odQP!+s2Op$,Q@PK!:DI[0!D0'>4Bp),#DI[-/Bcq,G!KmJH1Qk"OP#Qjm<,!IlF(]<# -DMS=VWKLk?F(KH&+Dl14+DI!3P$i![!KmJ$F_u2@@rd_rP')pIL]`f4P!4['P%odRP!+s2Op$, -Q@PT';DI[0!D0'>4Bp),#DI[,uD0'>4BnueQ!Kp)eDI[-/Bcq,G!g3SI1Qk"OP#Qjm<,!IlF(] -<#DMS@WWKLk?F(KH&+Dl14+DI!3P$i?BFCHA0F(ZV0L]NY>P"UsGOp#KT!g3S%F_u2@@rd_rP' -)pIL]W`3P!4['P%odQP!+s2Op$,Q@PT';DI[0!D0'>4Bp),#DI[,uD0'>4BnueQ!Kp)eDI[-/B -cq,G!g3SI1Qk"OP#Qjm<,!IlF(]<#DMSCXWKLk?F(KH&+Dl14+DI!3P$i?BFCHA0F(ZV0L]NY> -P"UsGOp#KT!g3S%F_u2@@rd_rP')pIL]`f4P!4['P%odRP!+s2Op$,Q@P]-4Bp), -#DI[,uD0'>4BnueQ!Kp)eDI[,uD0'>4BnuhR!Kp)eDI[-/Bcq,G"-N\J1Qk"OP#Qjm<,!IlF(] -<#DMSCXWKLk?F(KH&+Dl14+DI!3P$i?BFCHA0F(ZV0L]NY>P"UsGOp#i;FCHA0F(ZV0L]W_?P" -UsGOp#KT"-N\&F_u2@@rd_rP')pIL]W`3P!4['P%odQP!+s2Op$,Q@P]-4Bp),#D -I[,uD0'>4BnueQ!Kp)eDI[,uD0'>4BnuhR!Kp)eDI[-/Bcq,G"-N\J1Qk"OP#Qjm<,!I`@V'.i -Eb/^,+EMa8+D#G#@kV>5ATWq8F(KH%Ou&7dI?IQNG@D\+DI[00@rl4'NWaE7FCLChP!FGY<0BL -pP%B')AM7P;F!+t:F,0g2P"_#pI?IP_D.Rg0Bk)3,>9I.+!f.(e+BsX(L^[Q3>DNE<&R?M`L]r -SM>p*@-#)F4(+BsX,L`ftG>DNQ@-!_WtL^Ake>p*@-$A^?@+BsX0LbrB[>DN]D3F*b3L^f/(>p -*@-%Z!JX+BsX4Le(eo>DNiH9jJlIOu"b6Ec6/C+EDCEF-8=4BnubP1OCcl+Dk\3EbT$)+DI!3O -u"b3+Dlo7P"Uro04\R:F!,=U!Kp*=1G^Dg-7FEft:&"FDe? -CLMK2AmoLsAWeitP#Pq8F-:!C@sOu%NLAM7P;F!+[0@s9IF"F-6TfF^m-K@ko04Ou"b&DI[`1>E/nC0etL>16)Po1,:R>16)Po1,:U?0ocGm1,1O> -1QDYo1,1R?16)Pn1GLX?16)Pn1,:U>1QDYo1,:X?16)Pn1GU^?16)Po1,1O=1QDYp1,1R>16)P -o1GLX>16)Pn0etL?16)Pn1,:R?16)Pn1,:U@0ocGm0f(R?16)Pn1,CX?16)Pn1,C[@0ocGn1,C -[?0ocGn1,1L>16)Po1,1O?0ocGn0f(R>16)Po1,CX>16)Pp0etI>0ocGo0ekF=16)Pp1,1L=16 -)Pp1,1O>0ocGo0etL=16)Pp1,:R=16)Pp1,:U>0ocGn0etI=1QDYp0etO?0ocGn1GU[?0ocGm0 -ekI>1QDYo1GLU>1QDYo1GL[@0ocGm0etO>1QDYo1GU[>1QDYo1GUa@0ocGn0ekI=1QDYp1GLU= -1QDYp1GL[?0ocGm0etI>1QDYo0etO@0ocGm1GU[@0ocGm0f(O>1QDYo0f(U@0ocGm1G^a@0ocG -o0f(O>0ocGn0ekI?0ocGn1GLU?0ocGn0f(O=1QDYp0f(U?0ocGn0f(O?0ocGo0ekC<1QDYq0ek -I>0ocGo1GLU>0ocGo0etI<1QDYq0etO>0ocGo1GU[>0ocGo0f1U>0ocGn1,1U?0ocGp1GLU=0o -cGm0ekF=1l_bp0ekL?16)Pn1,1L=1l_bp1,1U@0ocGm1bg^?16)Pn1bga@0ocGm0etL=1l_bp0 -etR?16)Pn1,:R=1l_bp1,:[@0ocGm1bpd?16)Pn1bpg@0ocGn1bga?0ocGn1,1L<1l_bs0f(O= -0ocGn1bg^>16)Pn1Ggg@0ocGm0ekF?16)Pn1,1L?16)Pn1,1O@0ocGm0f1X?16)Pn1,L^?16)P -n1,La@0ocGp0ekF<16)Pq1,1L<16)Pq1,1O=0ocGn0etI?0ocGn0f1U?0ocGp0etI=0ocGm0ek -C>1QDYo0ekI@0ocGm1GLU@0ocGm0f1U>1QDYo0f1[@0ocGp0ekC;1QDYr0ekI=0ocGm0f(O@0o -cGm0f1U@0ocGo0ekC>0ocGp0ekC=0ocGn0ekL>16)Po0ekF<1l_bq0ekF>16)Po0ekC=1L6/"0 -6;5DEcbl1@ribsNW_-n0en[k1,:U>NW_*l1,=jm0f1U>NW_'k1GXsn0etO>NW_'k0f4mn1GLU> -NW_-n0en[k1,:U>NW_*l1,=jm0f1U>NW_'k1GXsn0etO>NW_'k0f4mn1GLU>?'6usF*)>>ASu" -!De*B$>E/hB1,1MD">V_f0ocAl0etME">M_f0ocAk0f(SF">MYf0ocAk0ekMF">_be16)Jl0f( -SF">MYf0ocAk0ekMF">_be16)Jn1,1MD">V_f0ocAl0etME">M_f0jTqu06;5RE+NosF(KN+DB -N/D">V\e16)Jl1bg_F">MVe16)Jl1,CYF">MVc1l_\p0ekGD">MVe16)Jl1,CYF">MVc1l_\p0 -ekGD">_ef0ocAl1,:SE">V\e16)Jl1bg_F">_ef0ocAl1,:RiOu%&qF,9jZ4`G=\L^K;CL]W`S -L]NZ%P&bn&F*)>>ASu"!+EMXCE+NosF)PT"Ou%N506;5RE+NosF!,OGDfB9*@rl4)AT!YeI?IS -`Ec6/2BlnD=Efp`l1Pc$e!HNtsP,Wd]Bp(ZC1Gg@rmesP"U.X0TrD`P"C(b8TSulE+NosF!,1[97)IKP,Wkm8VdCQOu -$r`EbgI3F(03;L]NZ@L]ET$H[CPLI=6HhL]DjOP#[ZtI?I0b)i+NXWKIRN$^*]:FcnqOF`MDE@ -VKq*+DHW6M#WWnP'DD<82"prG]P!3Lf&5)E+ifsB4uCMCjUs=I?K5=!/LYrL]Wa=HS9)r5*@^B -Dg,l+BkM+$HQ[?IG@G9.F!,1[99K@>Fa]F*F(K<(ASGdjFF/fNH\_ZMP(SQ[H\_]NP(SPjI?K5 -2P"9V3GA(Q%B4uC6+EDCE@VKq*+EE8=P,XU;OogehI?K5=;0-;fBOtmjBQTDRH\_]NP(R&'1H[ -cQEb0,A061WAD.. O,Bm; :MBm= \AE+s Q< 05t WMG_f3 ME+sQB+ -E2%>F-:!g;3Fg1B Otm jBQPA 9Bm=] ^@ Ydm E;M [l,2 -D98gA9;L@;2@c+2 D8ufF e?Ou[r R%[&V $@r Gmh 0fEg 13 0If *F_`U> D_ ?-CEcQ G7F -`MSBDD#CBBlJ#6A 7]@eD Imj "F) Q 2A@ qCg GOu Y1:ATV m" @r#drB 9Ki -QP'(hWFDtYuCM@[ !I?IP ~> -% uk.co.terryburton.bwipp/code16k 0.0 0 + % Populate the bitmap + /pixs [ + 81 sepheight mul {1} repeat + 0 1 r 2 sub { + /i exch def + rowheight {rowbits i get aload pop} repeat + sepheight {10 {0} repeat 70 {1} repeat 0} repeat + } for + rowheight {rowbits r 1 sub get aload pop} repeat + 81 sepheight mul {1} repeat + ] def + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx 81 + /pixy pixs length 81 idiv + /height pixs length 81 idiv 72 div + /width 81 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/code16k dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code16k-- @@ -3588,942 +11200,1084 @@ QP'(hWFDtYuCM@[ !I?IP ~> % --EXAM: MULTIPLE ROWS IN CODE 49 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp code49 0.0 0 0 0 -%%BeginData: 934 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\"-Pj29RV8N3,N_LP!3WD5*C2S@VV&,05?Y -6Ou"b#@<,jrA7Zm#F(^:/C6D8R1Qk"OP#ZpnAUT_@04J@1Ch7K,@UX:eDe*FB@ZiN#F"rLNOu" -b415Ppm1G4@UX:nAT!Y;Ou"b*L]ESo05?:COu%H!+C\c"Ch7LI4 -aW>WI?IP_@q]:k+C\c"@rGmh+DI!3Ou%&cEcYf(DIXf!BOPq;?BRI7"DJuf@<-0qDMSFYWKLkV -"FFTdEas#uAKY]C!KmJH98Ho;D0mpGBOPp(Ao;+%@;L!-@UX:eDe*E%BnueQ!JglA9Ti&31GnNWCho!ATT816)AkNWCts!B -#l<2N@esNWD,"!BH/@6&kt4NWDM-!CVqK7?.C'[HDDNDQF!+bO1G<6O@<-O"CibCeOu8CYL]E53LbO0/Bp(ZC1Lk*,Ec#6(+DI!3OuSW -.06;5UBl7R*H#R>X4aVtbP"U4d<+BTMEctl-F-8_$P'DD<82"IkD.7F)+Bsj-0d)JX0gUg$0g^ -m%0ggs&0gq$'0h%*(0h.0)0h76*0h@<+0hIB,0hRH-0h[N.0hdT/0hmZ00i!`10i*f20i3l30i -&TT+>/ZU -+>8`V+>AfW+>JlX+>SrY+>]#Z+>f)[+>o/\+?#5]+?,;^+?5A_+?>G`0e87c1,4dj1,=jk1,Fp -l1,P!m1,Y'n1,b-o+@2"h+@;(i+@D.j+@M4k+@V:l+@_@m+@hFn+@qLo+A%Rp+A.Xq+A7^r+A@ -ds+AIjt+ARpu+A\"!+Ae("+An.#+B"4$+B+:%+B4@&+B=F'+BFL(+BOR)+BXX*+Ba^++Bjd,1, -k3p1,t9q1-(?r1,+^i1+eLf1+nRg1-pp%1.%!&1..''1.7-(1.@3)1.I9*1.R?+1.[E,1.dK-1 -.mQ.1/!W/1/*]01/3c11/9100D:109J;10BP< -10KV=10T\>1*hk]1,"Xh1+S@d1*qq^1*Bkc1Pc$e!Jl5P056S5Ou$TdD.7F)+DI!3OuS6tP"RH -<0p4_`1Pc'p9.sd1P!5$b@kicoP!+/%BOPq)@;L!-BcpV&@q]:kG%#3.+EK9#94MXDEctl-F!+ -sJP"T)DG^Y`S@kicpP!+/%BOPq)@;L!-BcpV&@q]:kG%#3.+EK<$94MXDEctl-F!+sJP"T)DG^ -Y`SI?I,SASu!rA7]1cE+i[,+Cf(nEctl-F-8_M99M8tY:j=)Eaa68H#R>XD0q'>OpR9ZI?IQm3 -+I/RP!3WD5*C2S@VV&,05?Y6Ou%NL%[&V$@UX=h1cTip*@75*@mg@Yb&JWJLS1!.0M&P$!l2P"Us%I?I-aF^:. -i@sDP"i0Q)#MF,0gP"HlHA!g7\3+C\c#AMcB&!cE-tF,0sT"-Q>e@<6! -:3.6rhI?G)'1GDN]D(5NEU(Pj5j% -YtsX,)@e+%u;*Z,D[q-2i&$$)MfYp/r2KC6AQ50)i,er08MWE6\nHm&r7N`-AX@33f$1[:5E#. -'8RZb-\sL54,?=]:P`/0@pP6R@sWI?IQVD.Rg&De+k3@;Kmr@?Nd#DKTf-EbT$(F`)7CBp),F"d2K)DK?q3DI[TqA -RTCoBONQ2ATVU(A<$n4F_t]1Bk*;^P!FGY<,H\h+DI!3ASu!rA7]1cE+iZ5Bcq,G!KmJH1Qk"O -P#Q:0FD,T'NX'HED.Ra%A!0!%DKTf-EbT$(F`)7CBp),F"d3JEDK?q3DI[TqARTCoBONQ2ATVU -(A<$h%CiF&rOu&7dI?IQHF(ZV0+Du==ATDKpEcl8@+DI!3P"]G)@rGmhDKTf-EbT#:Bcq+4DKT -f-EbT$(F`)7CBp),P!Ko7%5^eepI?J/iP%?:VGB4m:GB8Q?C6D8R1GDN?:$! -eZXL]`GE>p*@-"Gdk"+BsX*L`ThE>DNK>-!_WtL^/_c>p*@-#`(3@+C1-d06M;RGB4mIDg-8c1 -G$K05kW7Gp$^-Cia0N1OYEc@s9IF"F-6TfF_#!+F!+t:F-:!qWI'FTI?K -4gOu"b$@ric5L^9/[OpR:-05?:COu%moL]MOP!g9O0056S5Ou"b$@j#9*F!,4R#EhcD1Ljp9+D -HW;P&+Wq^D5BkM+$G`k7R1Qj -_%P!4[5P!4[&L`hjSOogeh>q^D5BkM+$H'1@S1L$#+LaJ9KL]WATP"_#?P'(%`G@bK$BQSQ`5* -@]T@ps1`@q]F`CO7^YASGdjFEP"Ur=G@bK$BQS;DfTEP -5'(4PEb1C7Ou%NL8989ZEb0Z^%[&V$CghC,Ec6.E@q0R&@q0SC@Yb;QWJChC9Th2PL^0)8HXh( -T+EqC2B4uC5L]ET2P&,>RBkM+$H6?^+Ch$sgARfM=!JUnhP%p.>LbY&jP!4[VP%odSOpR9ZCgh -C,Ec6/X!/L`5s,r/#H$tiT06_Fk+DbJ-FE2;DL]ET2LbY'/CghC,Ec6/X!Kp*=!Ko6KE]5+bAS -GdjFErZBP"UsSG@bK$BQSMB@ps1`@q]F`CQ\^BE\S\\ASGdjFEo!LL]ilWL]`g>P"UsSOo^:D@ -?PAg3%oJr16Oha1Qj_R0p5Ft5):qVC5;qS$'G[4@<6O2Dg.!=L]`J5P)#3G@raLNG@bK$BQSKT -!0U!M#WWnP'AX!@9I.1#Ve%k1,1L>16)Vq2)-g@0f(PE#Ve.k0etI>16)Vq2)-j@1,:SE#Ve.k1,1O>16)Vp1 -,L^@0f(SF#Vn1l1,1O>0ocMo1,La@1,:VF#Vn+l1,1O>0ocMo2)-g@1,:VF#Ve1k1,1R>16)Vp -1G^a@1,:VF#Vn4l1,1R>0ocMo1G^d@1GLYF#Ve%k0etL>16)Vq1,La@1GLVE#Ve%k1,1R>16)V -q2)-g@1GLVE#Ve.k0etO>16)Vq1G^a@1GLVE#Ve(k0etO>16)Vq0f:[@1GLVE#Ve4l1,1L>0oc -Mo1c$mA0f(PE#Ve(l1,1L>0ocMo2)6mA0f(PE#Ve1l1,1O>0ocMo1GggA0f(PE#Ve+l1,1O>0o -cMo0fCaA0f(PE#Ve4l0etL>0ocMo2DHsA1GLVE#Ve.l0etL>0ocMo1c$mA1GLVE#Ve(l0etL>0 -ocMo1,UgA1GLVE#Ve1l0etO>0ocMo1GggA1GLVE#Ve%l0etO>0ocMo0ekI=0f(\I#W"1i1GLU? -1QD_u0ekI=0f(PE#Vn+h1,:R?1l_hu0ekF=0f(SF#Vn+h1GLX?1l_hu0ekI=1,:VF#Ve%g0f(O -?23%qu0ekC=0f(VG#W4=k0f(O?0ocMo0ekF=1,:_I#W"1i1,:U?1QD_u0ekF=1,:SE#Ve%g1GL -[?23%qu0ekI=1GL\G#W4=k1GL[?0ocMp0ekC=1,:\H#W+7j0f(R?16)Vq0ekF=1GL_H#W+7j1, -:X?16)Vp0ekC=1GLbI#W"1i0f(U?1QD_u0ekC=1GLVE#Ve(h1GLU?1l_ht1,1R>0f(SF#Vn+i1 -GLU?1QD_t0etO>0f(PE#Vn.i1,:R?1QD_t1,1O>0f(PE#Ve%h1,:R?1l_hs1,1R>1,:YG#W+:k -1GLX?0ocMo0etO>1,:\H#W"1j1GLX?16)Vp1,1L>0f(YH#W"4j0f(O?16)Vp1,1O>1,:\H#W"4 -j1,:U?16)Vp1,1R>1GL_H#W"4j1GL[?16)Vq0etO>1GL\G#W+7k1GL[?0ocMp1,1L>1,:YG#W+ -:k0f(R?0ocMo0etI>1,:\H#Vn.i1,:X?1QD_t1,1O>1GLVE#Ve%h1,:X?1l_ht0etL>1GLYF#V -e(h0f(U?1l_ht1,1L>1GLYF#Vn+i0f(U?1QD_t0etI>1GLVE#Ve+i1GLU?1QD_s1GL[?0f(PE# -Vn.j1GLU?16)Vp0f(U?0f(VG#W"1k1GLU?0ocMp1GLX?0f(SF#Ve(i1,:R?1QD_r1GL[?1,:VF -#Ve(i1GLX?1QD_s1,:X?1,:SE#Vn+j1GLX?16)Vp1GLU?0f(VG#W"7k0f(O?0ocMo1GLX?1,:Y -G#W"7k1,:U?0ocMo0f(O?0f(VG#Ve+i1GL[?1QD_s1GL[?1GLVE#Ve%i1,:U?1QD_r1,:X?1GL -YF#Ve%i1GL[?1QD_s0f(U?1GLVE#Vn1j0f(R?16)Vp1,:R?1,:YG#Vn1j1,:X?16)Vp1,:U?1G -L\G#W"4k1,:X?0ocMp0f(R?1GLYF#Ve+i0f(U?1QD_s1GLU?1GLVE#Vn.j0f(U?16)Vp0f(O?1 -GL\G#W"1k0f(U?0ocMo1bgd@0f(SF#Vn1k1GLU?0ocMo1,C^@0f(SF#Vn+k1GLU?0ocMp1bga@ -0f(PE#Ve+j1,:R?16)Vq1bgd@1,:SE#Ve+j1GLX?16)Vp0f1X@0f(SF#Vn.k1GLX?0ocMo0f1[ -@1,:VF#Ve.j0f(O?16)Vp1bga@1,:VF#Ve(j0f(O?16)Vp1bgd@1GLYF#Ve(j1,:U?16)Vq1GU -a@1GLVE#Ve(j1GL[?16)Vq0f1[@1GLVE#Vn4k0f(R?0ocMo1GU[@1,:VF#Vn4k1,:X?0ocMo1G -U^@1GLYF#Ve%j0f(R?16)Vq1,C[@1GLVE#Ve%j1,:X?16)Vp1bg^@1GLYF#Vn1k0f(U?0ocMo1 -,CX@1GLYF#Vn+k0f(U?0ocMo2)-mA0f(PE#Ve+k1GLU?0ocMo1bpgA0f(PE#Ve.k1GLX?0ocMo -1,LaA0f(PE#Ve(k1GLX?0ocMo2)-gA0f(PE#Ve1k1,:U?0ocMo1G^aA0f(PE#Ve1k1GL[?0ocM -o1G^dA1,:SE#Ve%k0f(O?0ocMo1G^gA1GLVE#Ve%k1,:U?0ocMo1bpdA1,:SE#Ve.k1,:X?0oc -Mo1,L^A1,:SE#Ve(k1,:X?0ocMo2)-gA1GLVE#Ve+k0f(U?0ocMo0f:[A1GLVE#Ve%g1bg^@1l -_ht0ekL>0f(SF#Vn+h1GU[@1QD_t0ekI>0f(PE#Vn+h1bga@1QD_t0ekL>1,:SE#Ve%g1,CX@1 -l_ht0ekF>0f(SF#Ve%g1GU^@1l_ht0ekI>1,:VF#Ve%g1bgd@1l_ht0ekL>1GLYF#Vn+h0f1U@ -1QD_t0ekC>0f(PE#Vn+h1,C[@1QD_t0ekF>1,:SE#Vn+h1GUa@1QD_t0ekI>1GLVE#Ve%g0f1X -@1l_ht0ekC>1,:VF#Ve%g1,C^@1l_ht0ekF>1GLYF#Vn+h0f1[@1QD_t0ekC>1GLVE#Ve(h1bg -^@1QD_s1,1U?0f(PE#Vn+i1bg^@16)Vq1,1R?0f(SF#Ve%h1GU[@1QD_r1,1U?1,:VF#Ve%h1b -ga@1QD_s0etR?1,:SE#Ve(h1,CX@1QD_s1,1O?0f(PE#Ve(h1GU^@1QD_s1,1R?1,:SE#Ve(h1 -bgd@1QD_s1,1U?1GLVE#Vn+i1bgd@16)Vq1,1L?0f(SF#Ve%h0f1U@1QD_r1,1O?1,:VF#Ve%h -1,C[@1QD_r1,1R?1GLYF#Ve%h1GUa@1QD_s0etO?1GLVE#Ve(h0f1X@1QD_s1,1L?1,:SE#Ve( -h1,C^@1QD_s1,1O?1GLVE#Vn+i1,C^@16)Vq1,1L?1GLYF#Ve%h0f1[@1QD_s0etI?1GLVE#Ve -+i1bg^@16)Vq1,:[@0f(PE#Ve%i1bg^@16)Vq1GL[@0f(PE#Ve(i1GU[@16)Vq1GL^@1,:SE#V -e(i1bga@16)Vq0f(X@1,:SE#Ve+i1,CX@16)Vp1GL[@1,:VF#Ve%i1,CX@16)Vp1GL^@1GLYF# -Ve%i1GU^@16)Vq1,:[@1GLVE#Ve%i1bgd@16)Vq1GLU@0f(PE#Ve(i0f1U@16)Vq1GLX@1,:SE -#Ve(i1,C[@16)Vq1GL[@1GLVE#Ve(i1GUa@16)Vq0f(U@1GLVE#Ve+i0f1X@16)Vp1GLX@1GLY -F#Ve%i0f1X@16)Vq1,:U@1GLVE#Ve%i1,C^@16)Vq1GLU@1GLVE#Ve(i0f1[@16)Vq0f(O@1GL -VE#Ve.j1bg^@0ocMo1,CaA0f(PE#Ve+j1GU[@0ocMo1GUdA1,:SE#Ve%j1GU[@0ocMo1bgaA0f -(PE#Ve.j1GU^@0ocMo1,C[A0f(PE#Ve.j1bgd@0ocMo1,C^A1,:SE#Ve(j1bgd@0ocMo1GU[A0 -f(PE#Ve+j1,C[@0ocMo0f1UA0f(PE#Ve+j1GUa@0ocMo0f1XA1,:SE#Ve%j1GUa@0ocMo1bg^A -1,:SE#Ve.j1,C^@0ocMo1,CXA1,:SE#Ve(j1,C^@0ocMo1GU[A1GLVE#Ve%j0f1[@0ocMo0ekO -?0f(VG#W"1i2)-gA0ocMp0ekL?0f(SF#Vn+h2)-jA16)Vp0ekI?0f(VG#W"1i1G^aA0ocMo0ek -L?1,:YG#W"1i1bpgA0ocMo0ekO?1GL\G#W"1i2)-mA0ocMp0ekF?0f(SF#Vn+h1G^dA16)Vq0e -kL?1GLYF#Ve%g0f:[A1QD_s0ekC?0f(PE#Ve%g1,LaA1QD_s0ekF?1,:SE#Ve%g1G^gA1QD_s0 -ekI?1GLVE#Vn+h0f:^A16)Vq0ekF?1GLYF#Ve(h2)-gA16)Vq0etU@0f(PE#Vn.i1bpdA0ocMo -0etR@0f(SF#Vn.i2)-jA0ocMo0etU@1,:VF#Ve(h1G^aA16)Vp1,1U@1,:VF#Ve(h2)-mA16)V -q0etU@1GLVE#Vn.i1,L^A0ocMo0etL@0f(SF#Vn.i1G^dA0ocMo0etO@1,:VF#Vn.i1bpjA0oc -Mo0etR@1GLYF#Ve(h0f:[A16)Vp1,1O@1,:VF#Ve(h1G^gA16)Vq0etO@1GLVE#Vn.i0f:^A0o -cMo0etI@1,:VF#Vn.i1,LdA0ocMo0etL@1GLYF#Ve+i2)-gA0ocMo1,:[A0f(PE#Ve(i2)-jA0 -ocMo1GL[A0f(PE#Ve+i1bpgA0ocMo0f(UA0f(PE#Ve+i2)-mA0ocMo0f(XA1,:SE#Ve(i1,L^A -0ocMo1,:XA1,:SE#Ve(i1bpjA0ocMo1GLUA0f(PE#Ve+i1,LaA0ocMo0f(OA0f(PE#Ve+i1G^g -A0ocMo0f(RA1,:SE#Ve%i1G^gA0ocMo1,:RA1,:SE#Ve(i1,LdA0ocMo0ekR@0f(SF#Vn+h2)6 -mB0ocMp0ekR@1,:SE#Ve%g1c$jB16)Vp0ekO@1,:VF#Ve%g2DI!B16)Vq0ekI@0f(PE#Vn+h1c -$mB0ocMp0ekO@1GLVE#Ve%g1,UdB16)Vp0ekI@1,:VF#Ve%g1c$pB16)Vq0ekC@0f(PE#Vn+h1 -,UgB0ocMp0ekI@1GLVE#Ve(h2DHpB0ocMo0etUA0f(PE#Ve(h1c$jB0ocMo1,1XA1,:SE#Ve(h -2DI!B0ocMo0etOA0f(PE#Ve%h1c$mB0ocMo0etUA1GLVE#Ve(h1,UdB0ocMo1,1RA1,:SE#Ve( -h1c$pB0ocMo0etIA0f(PE#Ve%h1,UgB0ocMo0etOA1GLVE#Ve%g0ekF>2NA&!0ekC;1,CbI#W4 -=k0ekF>16)Vq0ekC;1GUhJ#W+7j0ekI>1QD`!0ekC;1GU\F#Ve%g0ekL>2NA&!0ekC;1bghI#W -4=k0ekL>16)Vr0etI<0f1\H#W4=l0ekC>0ocMo1,1L<1,CeJ#W"4j0ekF>1QD_u1,1L<1,CYF# -Vn+i0ekF>1l_hu0etI<1,C\G#Vn.i0ekI>1l_hu1,1L<1GU_G#Ve%h0ekI>23%qu0etI<1GUbH -#W4=l0ekI>0ocMo1,1L<1bgkJ#W"4j0ekL>1QD_u1,1L<1bg_F#Vn+i0ekL>1l_hu0etI<1bgb -G#Ve(i0ekC>1l_h t1,:R =0f1Y G#Vn+ j0 ekC >1QD_t 0f(O=0f -1VF#Ve+i0ekF>1l _ht 1GLU= 1,C\G #V n.j 0ek F>1Q -D_t1,:R=1,CYF#V e%i0e kF >1l_h t0f( O= 1,C \G#Vn 1j0 ekI>1 QD_t -1GLU=1GU\F#Ve(i 0ekI> 1l_ ht1 ,:R= 1G U_G #Vn+j0 ek I>1QD_ t0f -(O=1GU\F#Ve+i0e kL>1l _ht 1GL U =1b gbG #Vn .j0ekL >1 QD_t1, :R= -1bg_F#Ve%i0ekL> 1l_ht 0f( O=1 bg bG #Ve +j0 ekC>1Q D_ s1GU[> 0f1 -VF#Vn.k0ekC>16) Vp0f 1U> 0f 1\ H#W "1l 0ek C>0o -cMo1bg^>1,C_H#W ":l0 e kF >0 ocM p1G U[>1 ,C\G# -Ve(j0ekF>1QD_s1 ,CX>1, CYF # Vn+ k0 ekF> 16) Vq1bg^>1GU _G#Ve+j0ekI ->1QD_s1GU[>1GU\ F#Vn.k 0ek I >16) Vp0f 1U> 1GUbH#W"1l 0ekI>0ocMo1 -bg^>1bgeH#W":l0 ekL>0o cMp 1GU[ >1bg bG# Ve(j0ekL>1 QD_s1,CX>1b -g_F#Vn+k0ekL>16 )Vp1b pd?0 f1YG# Vn1l 0ek C>0ocMo1,L ^?0f1YG#Vn+ -l0ekC>0ocMo2)-g ?1,C\ G#Vn4 l0ekF >0o cMo1G^a?1, C\G#Vn.l0ek -F>0ocMo0f:[?1,C \G#Vn7l 0ekI>0 ocMo1 bpd ?1GU_G#Vn1 l0ekI>0ocMo -1,L^?1GU_G#Vn+l0ekI>0ocMo2)-g?1bgbG#Vn4l0ekL>0ocMo1G^a?1bgbG#Vn.l0ekL>0ocM -o0f:[?1bgbG#Ve1l0ekC>0ocMo1Ggg@0f1VF#Ve%l0ekC>0ocMo2DHp@1,CYF#Ve.l0ekF>0oc -Mo1,Ud@1,CYF#Ve1l0ekI>0ocMo1Ggg@1GU\F#Ve%l0ekI>0ocMo2DHp@1bg_F#Ve.l0ekL>0o -cMo1,Ud@1bg_F#Vn+h1,1L?1l_hu0ekF<0f1YG#Ve%g0etI?23%qu0ekC<0f1\H#W4=k0etI?0 -ocMo0ekF<1,CeJ#W"1i1,1O?1QD_u0ekF<1,CYF#Vn+h0etL?1l_hu0ekC<1,C\G#Vn+h1,1R? -1l_hu0ekF<1GU_G#Ve%g0etO?23%qu0ekC<1GUbH#W4=k0etO?0ocMo0ekF<1bgkJ#W"1i1,1U -?1QD_u0ekF<1bg_F#Vn+h0etR?1l_hu0ekC<1bgbG#Vn.i1,1L?1QD_t1,1O=0f1VF#Ve%h1,1 -L?1l_ht0etL=0f1YG#Ve(h0etI?1l_ht1,1L=0f1YG#Ve(h1,1O?1l_ht1,1O=1,C\G#Vn+i1, -1O?1QD_t0etL=1,CYF#Vn.i0etL?1QD_t1,1L=1,CYF#Ve%h0etL?1l_hs1,1O=1GUbH#W+:k1 -,1R?0ocMo0etL=1GUeI#W"1j1,1R?16)Vp1,1L=1GUeI#W"4j0etO?16)Vp1,1O=1bghI#W"4j -1,1U?16)Vq0etL=1bgeH#W+7k1,1U?0ocMp1,1L=1bgeH#W+:k0etR?0ocMo0etI=1bghI#W"1 -j0etR?16)Vq1GLX>0f1YG#Ve(i1,1L?1QD_s1,:U>0f1VF#Vn+j1,1L?16)Vp1GLU>0f1\H#W" -7k0etI?0ocMo1GLX>1,C_H#W"7k1,1O?0ocMo0f(O>0f1\H#Vn.j1,1O?16)Vp0f(R>1,C_H#W -"1k1,1O?0ocMp1GLU>1,C\G#Ve(i0etL?1QD_r1GLX>1GU_G#Ve(i1,1R?1QD_s1,:U>1GU\F# -Vn+j1,1R?16)Vp1GLU>1GUbH#W"7k0etO?0ocMo1GLX>1bgeH#W"7k1,1U?0ocMo0f(O>1GUbH -#Vn.j1,1U?16)Vp0f(R>1bgeH#W"1k1,1U?0ocMp1GLU>1bgbG#Ve(i0etR?1QD_s1,:R>1bg_ -F#Vn+j0etR?16)Vq1bga?0f1VF#Ve+j1,1L?16)Vq1,C[?0f1VF#Ve%j1,1L?16)Vp1bg^?0f1 -YG#Ve.j1,1O?16)Vp1,CX?0f1YG#Vn1k1,1O?0ocMo1,C[?1,C\G#Vn+k1,1O?0ocMp1bg^?1, -CYF#Ve+j0etL?16)Vq1bga?1GU\F#Ve+j1,1R?16)Vp0f1U?1,C\G#Vn.k1,1R?0ocMo0f1X?1 -GU_G#Ve.j0etO?16)Vp1bga?1bgbG#Ve(j0etO?16)Vq1GU^?1bg_F#Ve(j1,1U?16)Vq0f1X? -1bg_F#Vn4k0etR?0ocMo1GU[?1bgbG#Vn.k0etR?0ocMo0f1U?1bgbG#Ve.k1,1L?0ocMo1,La -@0f1VF#Ve1k0etI?0ocMo2)-j@1,CYF#Ve+k0etI?0ocMo1G^d@1,CYF#Ve%k0etI?0ocMo0f: -^@1,CYF#Ve.k0etL?0ocMo1bpg@1GU\F#Ve(k0etL?0ocMo1,La@1GU\F#Ve1k0etO?0ocMo2) --j@1bg_F#Ve+k0etO?0ocMo1G^d@1bg_F#Ve%k0etO?0ocMo0f:^@1bg_F#Ve.k0etR?0ocMo1 -,L^@1bg_F#Vn+h1GLU@1QD_t0ekI=0f1VF#Ve%g1,:R@1l_ht0ekF=0f1YG#Ve%g1GLX@1l_ht -0ekI=1,C\G#Vn+h0f(O@1QD_t0ekC=0f1VF#Vn+h1,:U@1QD_t0ekF=1,CYF#Vn+h1GL[@1QD_ -t0ekI=1GU\F#Ve%g0f(R@1l_ht0ekC=1,C\G#Ve%g1,:X@1l_ht0ekF=1GU_G#Ve%g1GL^@1l_ -ht0ekI=1bgbG#Vn+h0f(U@1QD_t0ekC=1GU\F#Vn+h1,:[@1QD_t0ekF=1bg_F#Ve%g0f(X@1l -_ht0ekC=1bgbG#Vn.i1GLU@16)Vp0etO>0f1\H#W"1j1GLU@0ocMo1,1O>0f1\H#W"4j1,:R@0 -ocMo1,1R>1,C_H#W"4j1GLX@0ocMp0etO>1,C\G#Vn.i0f(O@16)Vp0etI>0f1\H#Vn.i1,:U@ -16)Vp0etL>1,C_H#Vn.i1GL[@16)Vp0etO>1GUbH#W"1j1GL[@0ocMo1,1L>1,C_H#W"4j0f(R -@0ocMo1,1O>1GUbH#W"4j1,:X@0ocMo1,1R>1bgeH#W"4j1GL^@0ocMp0etO>1bgbG#Vn.i0f( -U@16)Vp0etI>1GUbH#Vn.i1,:[@16)Vp0etL>1bgeH#W"1j1,:[@0ocMo1,1L>1bgeH#W"4j0f -(X@0ocMp0etI>1bgbG#Vn1j1GLU@0ocMo1,:X?0f1YG#Vn+j1GLU@0ocMo1GLX?0f1YG#Ve+i1 -GLX@16)Vp0f(R?0f1YG#Vn.j1GLX@0ocMo0f(U?1,C\G#Vn1j0f(O@0ocMo1,:R?0f1YG#Vn1j -1,:U@0ocMo1,:U?1,C\G#Vn1j1GL[@0ocMo1,:X?1GU_G#Vn+j1GL[@0ocMo1GLU?1,C\G#Ve+ -i1,:X@16)Vp0f(O?1,C\G#Ve+i1GL^@16)Vp0f(R?1GU_G#Vn.j1GL^@0ocMo0f(U?1bgbG#Vn -1j0f(U@0ocMo1,:R?1GU_G#Vn1j1,:[@0ocMo1,:U?1bgbG#Vn+j1,:[@0ocMo1GLU?1bgbG#V -n.j0f(X@0ocMo0f(O?1bgbG#Ve+j1GLU@0ocMo0f1[@0f1VF#Ve.j1,:R@0ocMo1bgd@1,CYF# -Ve(j1,:R@0ocMo1,C^@1,CYF#Ve+j0f(O@0ocMo1GU^@1,CYF#Ve%j0f(O@0ocMo1GUa@1GU\F -#Ve%j1,:U@0ocMo0f1[@1GU\F#Ve.j0f(R@0ocMo1bga@1GU\F#Ve(j0f(R@0ocMo1bgd@1bg_ -F#Ve(j1,:X@0ocMo1,C^@1bg_F#Ve+j0f(U@0ocMo1GU^@1bg_F#Ve%j0f(U@0ocMo0f1X@1bg -_F#Ve.j0f(X@0ocMo1,CX@1bg_F#Vn+h1bg^A16)Vp0ekI>0f1\H#W"1i1GU[A0ocMo0ekL>1, -C_H#W"1i1bgaA0ocMp0ekF>0f1YG#Vn+h1GU^A16)Vq0ekL>1GU_G#Ve%g0f1UA1QD_s0ekC>0 -f1VF#Ve%g1,C[A1QD_s0ekF>1,CYF#Ve%g1GUaA1QD_s0ekI>1GU\F#Ve%g1bggA1QD_s0ekL> -1bg_F#Vn+h0f1XA16)Vq0ekF>1GU_G#Vn+h1GUdA16)Vp0ekC>1GUbH#W"1i0f1[A0ocMo0ekF ->1bgeH#W"1i1,CaA0ocMp1,1U?0f1VF#Ve%h1bg^A16)Vp1,1R?0f1YG#Ve(h1bgaA16)Vq0et -R?1,CYF#Vn.i1,CXA0ocMo0etL?0f1YG#Vn.i1GU^A0ocMo0etO?1,C\G#Vn.i1bgdA0ocMo0e -tR?1GU_G#Ve(h0f1UA16)Vp1,1O?1,C\G#Ve(h1GUaA16)Vp1,1U?1bgbG#Vn+i1bggA0ocMp1 -,1L?1,CYF#Ve%h0f1XA16)Vq1,1O?1GU\F#Ve%h1,C^A16)Vq1,1R?1bg_F#Ve%h1GUdA16)Vp -1,1L?1GU_G#Ve(h1,CaA16)Vq0etL?1bg_F#Ve(i1bg^A0ocMo1GL[@0f1VF#Ve+i1bgaA0ocM -o0f(U@0f1VF#Ve%i1bgaA0ocMo1,:U@0f1VF#Ve(i1GU^A0ocMo1,:[@1GU\F#Ve+i0f1UA0oc -Mo1GLX@1,CYF#Ve%i0f1UA0ocMo1GL[@1GU\F#Ve%i1,C[A0ocMo1GL^@1bg_F#Ve%i1GUaA0o -cMo0f(X@1bg_F#Ve(i0f1XA0ocMo1,:U@1GU\F#Ve(i1GUdA0ocMo1GLU@1GU\F#Ve+i1,CaA0 -ocMo0f(O@1GU\F#Ve%i1,CaA0ocMp0ekO?0f1VF#Ve%g1bpdB16)Vp0ekO?1,C\G#Vn+h1G^aB -0ocMp0ekL?1,CYF#Vn+h2)-mB0ocMo0ekF?0f1YG#Ve%g1G^dB16)Vp0ekL?1GU_G#Ve%g2)-p -B16)Vq0ekC?0f1VF#Vn+h1,LaB0ocMp0ekI?1GU\F#Vn+h1bpmB0ocMo0ekC?1,C\G#Ve%g1,L -dB16)Vp0ekI?1bgbG#Ve%h2)-gB0ocMo1,1U@0f1VF#Ve(h2)-jB0ocMo0etO@0f1VF#Ve%h1b -pgB0ocMo0etU@1GU\F#Ve(h1,L^B0ocMo1,1R@1,CYF#Ve(h1bpjB0ocMo1,1X@1bg_F#Ve%h0 -f:[B0ocMo0etL@1,CYF#Ve%h1G^gB0ocMo0etR@1bg_F#Ve(h0f:^B0ocMo1,1O@1GU\F#Ve(h -1G^jB0ocMo0ekO@0f1VF#Ve%g2DHsC0ocMo0ekI@0f1VF#Ve%g1c$mC0ocMo0ekO@1GU\F#Ve% -g2DI$C0ocMo0ekC@0f1VF#Ve%g1,UgC0ocMo0ekI@1GU\F#Ve%g1c$sC0ocMp0ekC;1,LhJ#W+ -7j0ekF?16)Vp0ekC;1G^nK#W"1i0ekI?1QD_u0ekC;1G^bG#Vn+h0ekL?1l_hu0ekC;1bphH#V -e%g0ekO?23%qu0ekC;2)-nI#W4=k0ekO?0ocMp0etI<0f:bI#W+7k0ekC?0ocMp1,1L<1,LeI# -W+:k0ekF?0ocMo0etI<1,LhJ#W"1j0ekF?16)Vp1,1L<1G^kJ#W"4j0ekI?16)Vq0etI<1G^hI -#W+7k0ekI?0ocMp1,1L<1bpkI#W+:k0ekL?0ocMo0etI<1bpnJ#W"1j0ekL?16)Vp1,1L<2)-q -J#W"4j0ekO?16)Vq0etI<2)-nI#W+7k0ekO?0ocMp1,:R=0f:_H#Ve%i0ekC?1QD_s0f(O=0f: -\G#Vn1j0ekF?16)Vp1,:R=1,LeI#W"4k0ekF?0ocMp0f(O=1,LbH#Ve+i0ekI?1QD_s1GLU=1G -^bG#Vn.j0ekI?16)Vp0f(O=1G^hI#W"1k0ekI?0ocMp1GLU=1bphH#Ve(i0ekL?1QD_s1,:R=1 -bpeG#Vn+j0ekL?16)Vp1GLU=2)-nI#W"7k0ekO?0ocMp1,:R=2)-kH#Ve%i0ekO?1QD_s0f(O= -2)-hG#Vn1k0ekC?0ocMo1,CX>0f:_H#Vn+k0ekC?0ocMp1bg^>1,L_G#Ve+j0ekF?16)Vq1,CX ->1,L_G#Ve%j0ekF?16)Vp1bg^>1G^eH#Vn1k0ekI?0ocMo1,CX>1G^eH#Vn+k0ekI?0ocMp1bg -^>1bpeG#Ve+j0ekL?16)Vq1,CX>1bpeG#Ve%j0ekL?16)Vp1bg^>2)-kH#Vn1k0ekO?0ocMo1, -CX>2)-kH#Vn+k0ekO?0ocMo1G^a?0f:\G#Ve%k0ekC?0ocMo1bpd?1,L_G#Ve(k0ekF?0ocMo2 -)-g?1G^bG#Ve+k0ekI?0ocMo0f:[?1G^bG#Ve.k0ekL?0ocMo1,L^?1bpeG#Ve1k0ekO?0ocMo -1G^a?2)-hG#Ve%k0ekO?0ocMq0ekF<0f:_H#Vn+h0etI@1QD_t0ekC<0f:\G#Vn+h1,1O@1QD_ -t0ekF<1,L_G#Ve%g0etL@1l_ht0ekC<1,LbH#Ve%g1,1R@1l_ht0ekF<1G^eH#Vn+h0etO@1QD -_t0ekC<1G^bG#Vn+h1,1U@1QD_t0ekF<1bpeG#Ve%g0etR@1l_ht0ekC<1bphH#Ve%g1,1X@1l -_ht0ekF<2)-kH#Vn+h0etU@1QD_t0ekC<2)-hG#Ve(h1,1L@1QD_s1,1O=0f:\G#Vn+i1,1L@1 -6)Vq1,1L=0f:_H#Ve%h0etI@1QD_r1,1O=1,LbH#Ve%h1,1O@1QD_s0etL=1,L_G#Ve(h0etL@ -1QD_s1,1L=1,L_G#Ve(h1,1R@1QD_s1,1O=1G^bG#Vn+i1,1R@16)Vq1,1L=1G^eH#Ve%h0etO -@1QD_r1,1O=1bphH#Ve%h1,1U@1QD_s0etL=1bpeG#Ve(h0etR@1QD_s1,1L=1bpeG#Ve(h1,1 -X@1QD_s1,1O=2)-hG#Vn+i1,1X@16)Vq1,1L=2)-kH#Ve%h0etU@1QD_s0etI=2)-hG#Ve+i1, -1L@16)Vq1,:U>0f:\G#Ve%i1,1L@16)Vq1GLU>0f:\G#Ve(i0etI@16)Vq1GLX>1,L_G#Ve(i1 -,1O@16)Vq0f(R>1,L_G#Ve+i0etL@16)Vp1GLX>1G^eH#Ve%i0etL@16)Vq1,:U>1G^bG#Ve%i -1,1R@16)Vq1GLU>1G^bG#Ve(i0etO@16)Vq1GLX>1bpeG#Ve(i1,1U@16)Vq0f(R>1bpeG#Ve+ -i0etR@16)Vp1GLX>2)-kH#Ve%i0etR@16)Vq1,:U>2)-hG#Ve%i1,1X@16)Vq1GLU>2)-hG#Ve -(i0etU@16)Vq0f(O>2)-hG#Ve.j1,1L@0ocMo1,C[?0f:\G#Ve+j0etI@0ocMo1GU^?1,L_G#V -e%j0etI@0ocMo0f1X?1,L_G#Ve.j0etL@0ocMo1bga?1G^bG#Ve(j0etL@0ocMo1,C[?1G^bG# -Ve+j0etO@0ocMo1GU^?1bpeG#Ve%j0etO@0ocMo0f1X?1bpeG#Ve.j0etR@0ocMo1bga?2)-hG -#Ve(j0etR@0ocMo1,C[?2)-hG#Ve+j0etU@0ocMo0f1U?2)-hG#Ve%g1GLUA1QD_s0ekI=0f:\ -G#Vn+h1,:RA16)Vq0ekI=1,LbH#Ve%g0f(OA1QD_s0ekC=0f:\G#Ve%g1,:UA1QD_s0ekF=1,L -_G#Ve%g1GL[A1QD_s0ekI=1G^bG#Vn+h0f(RA16)Vq0ekF=1G^eH#Vn+h1GL^A16)Vp0ekC=1G -^hI#W"1i0f(UA0ocMo0ekF=1bpkI#W"1i1,:[A0ocMo0ekI=2)-nI#W"1i1GLaA0ocMp0ekC=1 -bphH#Vn+h1,:^A16)Vp1,1R>0f:_H#Vn+i1GLUA0ocMp1,1O>0f:\G#Ve%h1,:RA16)Vq1,1R> -1,L_G#Ve%h1GLXA16)Vp1,1L>0f:_H#Ve(h1,:UA16)Vp1,1R>1G^eH#Vn+i1GL[A0ocMp1,1L ->1,L_G#Ve%h0f(RA16)Vq1,1O>1G^bG#Ve%h1,:XA16)Vq1,1R>1bpeG#Ve%h1GL^A16)Vp1,1 -L>1G^eH#Ve(h1,:[A16)Vp1,1R>2)-kH#Vn+i1GLaA0ocMp1,1L>1bpeG#Ve%h0f(XA16)Vq1, -1O>2)-hG#Ve%h1,:^A16)Vp1GL[?0f:\G#Ve%i1GLUA0ocMo1,:U?0f:\G#Ve(i1GLXA0ocMo1 -GLU?0f:\G#Ve+i1,:UA0ocMo0f(O?0f:\G#Ve+i1GL[A0ocMo0f(R?1,L_G#Ve%i1GL[A0ocMo -1,:R?1,L_G#Ve(i1,:XA0ocMo1,:X?1bpeG#Ve+i0f(UA0ocMo1GLX?1bpeG#Ve%i0f(UA0ocM -o1GL[?2)-hG#Ve%i1,:[A0ocMo0f(U?2)-hG#Ve(i0f(XA0ocMo1,:U?2)-hG#Ve%g1bg^B16) -Vq0ekI>0f:\G#Vn+h1bgaB0ocMo0ekF>0f:_H#Ve%g1GU^B16)Vp0ekL>1G^eH#Vn+h0f1UB0o -cMp0ekF>1,L_G#Vn+h1GUaB0ocMp0ekL>1bpeG#Ve%g0f1XB16)Vp0ekF>1G^eH#Ve%g1GUdB1 -6)Vp0ekL>2)-kH#Vn+h0f1[B0ocMp0ekF>1bpeG#Vn+h1GUgB0ocMo1,1U?0f:\G#Ve%h1GU[B -0ocMo0etR?1,L_G#Ve(h1,CXB0ocMo1,1R?1,L_G#Ve(h1bgdB0ocMo0etI?0f:\G#Ve%h1,C[ -B0ocMo0etO?1G^bG#Ve%h1bggB0ocMo1,1L?1,L_G#Ve(h1,C^B0ocMo1,1R?1bpeG#Ve(h1bg -jB0ocMo0etI?1G^bG#Ve%h1,CaB0ocMo0etO?2)-hG#Ve%g2)-gC0ocMo0ekI?0f:\G#Ve%g1b -pgC0ocMo0ekO?1G^bG#Ve%g0f:[C0ocMo0ekF?1,L_G#Ve%g1G^gC0ocMo0ekL?1bpeG#Ve%g2 -)-sC0ocMo0ekC;1,UnK#W"1i0ekF@16)Vq0ekC;1GgnJ#W+7j0ekI@0ocMo0ekC;1c$tK#W"1i -0ekL@16)Vq0ekC;2)6tJ#W+7j0ekO@0ocMo0ekC;2DI%K#W"1i0ekR@16)Vr0etI<0fCbH#Ve( -h0ekF@1QD_s1,1L<1,UeH#Vn+i0ekF@16)Vq1,1L<1GgkI#Ve%h0ekI@1QD_s0etI<1GghH#Ve -(h0ekL@1QD_s1,1L<1c$kH#Vn+i0ekL@16)Vq1,1L<2)6qI#Ve%h0ekO@1QD_s0etI<2)6nH#V -e(h0ekR@1QD_s1,1L<2DHqH#Vn+i0ekR@16)Vp1,:R=0fCeI#Vn+j0ekC@0ocMo1GLU=1,UhI# -Vn.j0ekF@0ocMo0f(O=1,UhI#Vn1j0ekI@0ocMo1,:R=1GgkI#Vn+j0ekI@0ocMo1GLU=1c$nI -#Vn.j0ekL@0ocMo0f(O=1c$nI#Vn1j0ekO@0ocMo1,:R=2)6qI#Vn+j0ekO@0ocMo1GLU=2DHt -I#Vn.j0ekR@0ocMo0f(O=2DHtI#Ve+j0ekC@0ocMo0f1U>0fCbH#Ve.j0ekF@0ocMo1,CX>1,U -eH#Ve+j0ekI@0ocMo0f1U>1GghH#Ve.j0ekL@0ocMo1,CX>1c$kH#Ve+j0ekO@0ocMo0f1U>2) -6nH#Ve.j0ekR@0ocMo1,CX>2DHqH#Vn+h1,1LA16)Vp0ekC<0fChJ#W"1i0etIA0ocMo0ekF<1 -,UkJ#W"1i1,1OA0ocMp0ekC<1,UhI#Vn+h1,1RA16)Vp0ekC<1GgnJ#W"1i0etOA0ocMo0ekF< -1c$qJ#W"1i1,1UA0ocMp0ekC<1c$nI#Vn+h1,1XA16)Vp0ekC<2)6tJ#W"1i0etUA0ocMo0ekF -<2DI"J#W"1i1,1[A0ocMp1,1O=0fCbH#Ve%h1,1LA16)Vp1,1L=0fCeI#Ve(h1,1OA16)Vq0et -L=1,UeH#Vn.i0etLA0ocMo0etI=1,UhI#Vn.i1,1RA0ocMo0etL=1GgkI#Ve(h0etOA16)Vp1, -1O=1c$nI#Vn+i1,1UA0ocMp1,1L=1c$kH#Ve%h0etRA16)Vq1,1O=2)6nH#Ve%h1,1XA16)Vp1 -,1L=2)6qI#Ve(h1,1[A16)Vq0etL=2DHqH#Ve(i1,1LA0ocMo1GLU>0fCbH#Ve+i1,1OA0ocMo -0f(O>0fCbH#Ve%i1,1OA0ocMq1,1O=0ekPG#W4@l1,1L<1QD_r0etL=0ekSH#W+7k1,1L<1l_i -"0etL=0ekGD#Vn.i0etI<2NA&"1,1L=0ekMF#W"1j0etI<23%r"0etI=0ekJE#Ve+i1,1L<2NA -&!1GLX>0ekMF#Vn.j1,1L<23%r!1,:U>0ekJE#Ve%i1,1L<2NA&!0f(R>0ekMF#W4=m1,1L<16 -)Vq1GLU>0ekPG#W+=l0etI<1QD_q1,:R>0ekSH#W"4k0etI<1l_i!1,:R>0ekGD#Vn+j0etI<2 -3%r!0f(O>0ekJE#W=Cn0etI<0ocMo1bga?0ekPG#W":l1,1L<1QD_r1GU^?0ekMF#W+=m1,1L< -16)Vp1,C[?0ekPG#W"4l1,1L<1QD_u1,C[?0ekDC#Vn+k1,1L<1l_hu0f1X?0ekGD#Vn4k0etI -<1l_hr1GU[?0ekPG#W"7l0etI<1QD_r1,CX?0ekMF#W+:m0etI<16)Vp0f1U?0ekPG#W"1l0et -I<1QD_u0f1U?0ekDC#Ve1k1,1L<1l_hs1bpg@0ekJE#Ve+k1,1L<1l_ht1G^d@0ekGD#Vn.l1, -1L<1QD_t1,La@0ekDC#Ve%k1,1L<1l_ht0f:^@0ekGD#Vn7l0etI<1QD_q1bpd@0ekMF#W":m0 -etI<16)Vq1G^a@0ekJE#W+=n0etI<0ocMo1,L^@0ekMF#W"4m0etI<16)Vq0f:[@0ekJE#W+7n -0etI<0ocMo2DHsA0ekJE#Vn7m1,1L<16)Vp1c$mA0ekJE#W":n1,1L<0ocMp1GgjA0ekGD#Ve( -l1,1L<1QD_s1,Ug A0ekD C#Ve1 l0etI <1 QD_ r1c$jA 0ekGD#V -e+l0etI<1QD_s1G ggA 0ekDC #Vn.m 0e tI< 16) Vp0f -CaA0ekJE#W"1n0e tI<0o cM q0ekI =0ek PG #W4 =k1GL U=1 QD_r0 ekF= -0ekSH#W+7j1,:R= 1l_i" 0ek F=0 ekGD #W "1i 0f(O=2 3% r"0ekC =0e -kJE#Ve(h1GLU=2N A&!1, 1R> 0ek M F#W 4@l 1GL U=16)V q0 etO>0e kPG -#W+7k1GLU=1QD`! 0etO> 0ek DC# Vn .i 1,: R=2 3%r!1, 1O >0ekJE #Ve - %h1,:R=2NA&!0e tL>0 ekM F# W4 =l1 ,:R =16 )Vp1 -,1L>0ekSH#W"4j0 f(O= 1 l_ i! 1,1 L>0 ekGD #Vn+i -0f(O=23%r!0etI> 0ekJE# W=C m 0f( O= 0ocM o1G L[?0ekPG#W "7k1GLU=1QD -_r1,:X?0ekMF#W+ :l1GLU =16 ) Vp0f (U?0 ekP G#W"1k1GLU =1QD_u0f(U? -0ekDC#Vn1j1,:R= 1l_hu1 GLX ?0ek GD#V e(i 1,:R=23%qu 1,:U?0ekJE# -W4@m1,:R=0ocMp0 f(R?0 ekMF #W+7l 1,:R =16 )Vp1GLU?0e kPG#W"7k0f( -O=1QD_r1,:R?0ek MF#W+ :l0f( O=16) Vp0 f(O?0ekPG# W"1k0f(O=1Q -D_u0f(O?0ekDC#V e.j1GLU =1l_ht 1bgd@ 0ek GD#Vn1k1GL U=1QD_t1GUa -@0ekDC#Ve(j1GLU=1l_ht1,C^@0ekGD#Vn+k1GLU=1QD_t0f1[@0ekDC#Vn4k1,:R=1QD_q1GU -^@0ekMF#W"7l1,:R=16)Vq1,C[@0ekJE#W+:m1,:R=0ocMo0f1X@0ekMF#W"1l1,:R=16)Vp1b -g^@0ekMF#W":l0f(O=16)Vq1GU[@0ekJE#W+=m0f(O=0ocMo1,CX@0ekMF#W"4l0f(O=16)Vq0 -f1U@0ekJE#W+7m0f(O=0ocMo2)-mA0ekJE#Vn4l1GLU=16)Vp1G^gA0ekJE#W"7m1GLU=0ocMp -1,LdA0ekGD#Vn7l1,:R=16)Vp1bpgA0ekJE#W":m1,:R=0ocMp1G^dA0ekGD#Ve(k1,:R=1QD_ -s1,LaA0ekDC#Vn+l1,:R=16)Vp2)-gA0ekJE#Vn4l0f(O=16)Vp1G^aA0ekJE#W"7m0f(O=0oc -Mp1,L^A0ekGD#Ve%k0f(O=1QD_s0f:[A0ekDC#Ve4l1GLU=16)Vq2)6sB0ekDC#Ve.l1GLU=16 -)Vq1GgmB0ekDC#Ve1l1,:R=16)Vq1c$mB0ekDC#Ve+l1,:R=16)Vq1,UgB0ekDC#Ve4l0f(O=1 -6)Vq2)6mB0ekDC#Ve.l0f(O=16)Vq1GggB0ekDC#Ve(l0f(O=16)Vq0fCaB0ekDC#Ve%g1bg^> -2NA&!0ekL>0ekMF#W4=k1bg^>16)Vq0ekI>0ekPG#W+7j1GU[>1QD`!0ekI>0ekDC#Ve%g1,CX ->2NA&!0ekF>0ekMF#W4=k1,CX>16)Vq0ekC>0ekPG#W+7j0f1U>1QD`!0ekC>0ekDC#Ve(h1bg -^>23%qu1,1U?0ekJE#W4@l1bg^>0ocMp0etR?0ekMF#W+7k1bg^>16)Vq1,1R?0ekMF#W+:k1G -U[>16)Vp0etO?0ekPG#W"1j1GU[>1QD_u0etO?0ekDC#Ve(h1,CX>23%qu1,1O?0ekJE#W4@l1 -,CX>0ocMp0etL?0ekMF#W+7k1,CX>16)Vq1,1L?0ekMF#W+:k0f1U>16)Vp0etI?0ekPG#W"1j -0f1U>1QD_u0etI?0ekDC#Ve+i1bg^>1l_ht1GL^@0ekGD#Vn.j1bg^>1QD_t1,:[@0ekDC#Ve% -i1bg^>1l_ht0f(X@0ekGD#Vn1j1GU[>1QD_t1GL[@0ekDC#Ve(i1GU[>1l_ht1,:X@0ekGD#Vn -+j1GU[>1QD_t0f(U@0ekDC#Ve+i1,CX>1l_ht1GLX@0ekGD#Vn.j1,CX>1QD_t1,:U@0ekDC#V -e%i1,CX>1l_ht0f(R@0ekGD#Vn1j0f1U>1QD_t1GLU@0ekDC#Ve(i0f1U>1l_ht1,:R@0ekGD# -Vn+j0f1U>1QD_t0f(O@0ekDC#Ve.j1bg^>1QD_s1bggA0ekDC#Vn1k1bg^>16)Vp1,CaA0ekJE -#W"4l1bg^>0ocMp1bgdA0ekGD#Ve+j1GU[>1QD_s1GUaA0ekDC#Vn.k1GU[>16)Vp0f1[A0ekJ -E#W"1l1GU[>0ocMo1bgaA0ekJE#W":l1,CX>0ocMp1GU^A0ekGD#Ve(j1,CX>1QD_s1,C[A0ek -DC#Vn+k1,CX>16)Vq1bg^A0ekGD#Ve+j0f1U>1QD_s1GU[A0ekDC#Vn.k0f1U>16)Vp0f1UA0e -kJE#W"1l0f1U>0ocMo2)-pB0ekGD#Vn4l1bg^>0ocMo1G^jB0ekGD#Vn7l1GU[>0ocMo1bpjB0 -ekGD#Vn1l1GU[>0ocMo1,LdB0ekGD#Ve1k1,CX>16)Vq1bpgB0ekDC#Ve+k1,CX>16)Vq1,LaB -0ekDC#Ve%k1,CX>16)Vq2)-gB0ekDC#Ve.k0f1U>16)Vq1G^aB0ekDC#Ve(k0f1U>16)Vq0f:[ -B0ekDC#Ve4l1bg^>0ocMo1c$sC0ekDC#Ve1l1GU[>0ocMo1GgmC0ekDC#Ve4l1,CX>0ocMo1c$ -mC0ekDC#Ve(l1,CX>0ocMo2)6mC0ekDC#Ve+l0f1U>0ocMo0fCaC0ekDC#Ve%g2)-g?23%qu0e -kO?0ekJE#W4=k2)-g?0ocMp0ekL?0ekMF#W+7j1bpd?16)Vp0ekI?0ekPG#W"1i1G^a?1QD_u0 -ekI?0ekDC#Vn+h1,L^?1l_hu0ekF?0ekGD#Ve%g0f:[?23%qu0ekC?0ekJE#W4=k0f:[?0ocMo -1,1X@0ekMF#W"4j2)-g?16)Vq0etU@0ekJE#W+7k2)-g?0ocMp1,1U@0ekJE#W+:k1bpd?0ocM -o0etR@0ekMF#W"1j1bpd?16)Vp1,1R@0ekMF#W"4j1G^a?16)Vq0etO@0ekJE#W+7k1G^a?0oc -Mp1,1O@0ekJE#W+:k1,L^?0ocMo0etL@0ekMF#W"1j1,L^?16)Vp1,1L@0ekMF#W"4j0f:[?16 -)Vq0etI@0ekJE#W+7k0f:[?0ocMo1GLaA0ekJE#W"7k2)-g?0ocMp1,:^A0ekGD#Vn1j1bpd?1 -6)Vp1,:[A0ekJE#W"4k1bpd?0ocMp0f(XA0ekGD#Ve+i1G^a?1QD_s1GL[A0ekDC#Vn.j1G^a? -16)Vp0f(UA0ekJE#W"1k1G^a?0ocMp1GLXA0ekGD#Ve(i1,L^?1QD_s1,:UA0ekDC#Vn+j1,L^ -?16)Vp1GLUA0ekJE#W"7k0f:[?0ocMp1,:RA0ekGD#Ve%i0f:[?1QD_s0f(OA0ekDC#Ve.j2)- -g?16)Vq1GUgB0ekDC#Vn4k1bpd?0ocMo1GUdB0ekGD#Vn.k1bpd?0ocMo1bgdB0ekGD#Vn1k1G -^a?0ocMo1,C^B0ekGD#Vn+k1G^a?0ocMp1bgaB0ekDC#Ve+j1,L^?16)Vq1,C[B0ekDC#Ve%j1 -,L^?16)Vp1bg^B0ekGD#Vn1k0f:[?0ocMo1,CXB0ekGD#Vn+k0f:[?0ocMo2)-sC0ekDC#Ve.k -1bpd?0ocMo2)-mC0ekDC#Ve+k1G^a?0ocMo1bpgC0ekDC#Ve(k1,L^?0ocMo2)-gC0ekDC#Ve+ -k0f:[?0ocMo0f:[C0ekDC#Ve%g2DHp@1l_ht0ekR@0ekGD#Vn+h2)6m@1QD_t0ekO@0ekDC#Ve - %g1c$j@1l_ht0ekL@0ekGD#Vn+h1Ggg@1QD_t0ekI@0ekDC#Ve%g1,Ud@1l_ht0ekF@0ekGD# -Vn+h0fCa@1QD_t0ekC@0ekDC#Ve(h2DHp@1QD_s1,1[A0ekDC#Vn.i2)6m@16)Vp0etUA0ekJE -#W"1j2)6m@0ocMo1,1UA0ekJE#W"4j1c$j@0ocMp0etRA0ekGD#Vn.i1Ggg@16)Vp0etOA0ekJ -E#W"1j1Ggg@0ocMo1,1OA0ekJE#W"4j1,Ud@0ocMp0etLA0ekGD#Vn.i0fCa@16)Vp0etIA0ek -JE#W"1j0fCa@0ocMo1GLdB0ekGD#Vn1j2)6m@0ocMo1,:^B0ekGD#Ve+i1c$j@16)Vq1,:[B0e -kDC#Ve%i1c$j@16)Vq1GL[B0ekDC#Ve(i1Ggg@16)Vq0f(UB0ekDC#Ve+i1,Ud@16)Vq1,:UB0 -ekDC#Ve%i1,Ud@16)Vq1GLUB0ekDC#Ve(i0fCa@16)Vq0f(OB0ekDC#Ve.j2DHp@0ocMo1GUgC -0ekDC#Ve.j1c$j@0ocMo1,CaC0ekDC#Ve+j1Ggg@0ocMo0f1[C0ekDC#Ve.j1,Ud@0ocMo1,C[ -C0ekDC#Ve+j0fCa@0ocMo0f1UC0ekDC#W"1i0ekF<2NA�ekC;1,1VG#W"1j0ekC<23%r"0et -I<0etPF#W"4j0ekF<23%r"1,1L<1,1SF#Vn+i0ekF<2NA&"0etI<1,1VG#W=Cm0ekF<16)Vp1, -:R=0etYI#W"4k0ekC<1l_i!1,:R=0etME#Vn+j0ekC<23%r!0f(O=0etPF#W=Cn0ekC<0ocMo1 -GLU=1,1\I#W"7k0ekF<1l_hs1,:R=1,1YH#W+:l0ekF<1QD_q0f(O=1,1\I#W"1k0ekF<1l_i! -0f(O=1,1PE#Ve+j0ekC<23%qu1GU[>0etPF#Vn.k0ekC<1l_hu1,CX>0etME#Ve%j0ekC<23%q -u0f1U>0etPF#W4=n0ekC<0ocMo1bg^>1,1YH#W":l0ekF<1QD_r1GU[>1,1VG#W+=m0ekF<16) -Vp1,CX>1,1YH#W"4l0ekF<1QD_u1,CX>1,1MD#Vn+k0ekF<1l_hu0f1U>1,1PE#Ve.k0ekC<1l -_ht1bpd?0etME#Vn1l0ekC<1QD_t1G^a?0etJD#Ve(k0ekC<1l_ht1,L^?0etME#Vn+l0ekC<1 -QD_t0f:[?0etJD#Ve1k0ekF<1l_hs1bpd?1,1SF#Ve+k0ekF<1l_ht1G^a?1,1PE#Vn.l0ekF< -1QD_t1,L^?1,1MD#Ve%k0ekF<1l_ht0f:[?1,1PE#Ve1l0ekC<1QD_r1c$j@0etME#Ve+l0ekC -<1QD_s1Ggg@0etJD#Vn.m0ekC<16)Vp0fCa@0etPF#W"1n0ekC<0ocMo2DHp@1,1SF#Vn7m0ek -F<16)Vp1c$j@1,1SF#W":n0ekF<0ocMp1Ggg@1,1PE#Ve(l0ekF<1QD_s1,Ud@1,1MD#Vn+m0e -kF<16)Vq0ekF<0etYI#W+7j1,1L=1l_i"0ekF<0etME#W"1i0etI=23%r"0ekC<0etPF#W"1i1 -,1O=23%r"0ekF<1,1SF#Vn+h0etL=2NA&"0ekC<1,1VG#W=Cl0etL=16)Vq1,1O=0etVH#W+:k -1,1L=1QD_q0etL=0etYI#W"1j1,1L=1l_i!0etL=0etME#Ve(h0etI=2NA&!1,1L=0etSG#W4@ -l0etI=16)Vp1,1O=1,1\I#W"4j1,1O=1l_i!1,1O=1,1PE#Vn+i1,1O=23%r!0etL=1,1SF#W= -Cm1,1O=0ocMp1,1L=1,1YH#W+:k0etL=1QD_q0etI=1,1\I#W"1j0etL=1l_i!0etI=1,1PE#V -n1j1,1L=1l_hu1GLX>0etME#Ve(i1,1L=23%qu1,:U>0etPF#W4@m1,1L=0ocMp0f(R>0etSG# -W+7l1,1L=16)Vp1GLU>0etVH#W"7k0etI=1QD_q1GLX>1,1YH#W"7k1,1O=1QD_q0f(O>0etVH -#Vn.j1,1O=1l_hu1,:U>1,1PE#Ve%i1,1O=23%qu0f(R>1,1SF#W4=m1,1O=0ocMp1GLU>1,1V -G#W+=l0etL=16)Vp1,:R>1,1YH#W"4k0etL=1QD_u1,:R>1,1MD#Vn+j0etL=1l_hu0f(O>1,1 -PE#Vn4k1,1L=1QD_q1GU^?0etSG#W"7l1,1L=16)Vq1,C[?0etPF#W+:m1,1L=0ocMo0f1X?0e -tSG#W"1l1,1L=16)Vp1bg^?0etSG#W":l0etI=16)Vp1bga?1,1VG#W":l1,1O=16)Vp1,CX?0 -etSG#Vn1k1,1O=1QD_t1GU^?1,1MD#Ve(j1,1O=1l_ht1,C[?1,1PE#Vn+k1,1O=1QD_t0f1X? -1,1MD#Vn4k0etL=1QD_q1GU[?1,1VG#W"7l0etL=16)Vq1,CX?1,1SF#W+:m0etL=0ocMo0f1U -?1,1VG#W"1l0etL=16)Vq2)-j@0etME#Ve.k1,1L=1QD_s1bpg@0etJD#Vn1l1,1L=16)Vp1,L -a@0etPF#W"4m1,1L=0ocMp0f:^@0etME#Ve1k0etI=1QD_q2)-j@1,1SF#Ve+k0etI=1QD_r1b -pg@1,1PE#Ve+k1,1O=1QD_s1G^d@1,1MD#Ve%k0etI=1QD_r1,La@1,1PE#Ve%k1,1O=1QD_s0 -f:^@1,1MD#Vn7l0etL=16)Vp1bpd@1,1SF#W":m0etL=0ocMp1G^a@1,1PE#Ve(k0etL=1QD_s -1,L^@1,1MD#Vn+l0etL=16)Vp2)6pA0etME#Vn4m1,1L=0ocMo1GgjA0etME#Vn.m1,1L=0ocM -o2DHpA0etME#Ve4l1,1O=16)Vp1c$jA0etME#Vn7m1,1O=0ocMo1c$mA1,1PE#Ve(l0etI=16) -Vq1GgjA1,1MD#Ve(l1,1O=16)Vp2)6mA1,1PE#Vn4m0etL=0ocMo1GggA1,1PE#Vn.m0etL=0o -cMo0fCaA1,1PE#Vn+h1GLU>23%r!0ekI=0etPF#W=Cl1GLU>0ocMo0ekF=0etYI#W"1i1,:R>1 -l_i!0ekF=0etME#Ve%g1GLX>2NA&!0ekI=1,1VG#W4=k1GLX>16)Vq0ekC=0etVH#W+7j0f(O> -1QD`!0ekC=0etJD#Vn+h1,:U>23%r!0ekF=1,1SF#W=Cl1,:U>0ocMo0ekC=1,1\I#W"1i0f(R ->1l_i!0ekC=1,1PE#Vn.i1GLU>1l_hu1,1R>0etME#Ve%h1GLU>23%qu0etO>0etPF#W4=l1GL -U>0ocMo1,1O>0etVH#W"4j1,:R>1QD_u1,1O>0etJD#Ve(h1GLX>23%qu1,1R>1,1SF#W4@l1G -LX>0ocMp0etO>1,1VG#W+7k1GLX>16)Vq1,1L>0etSG#W+:k0f(O>16)Vp0etI>0etVH#Vn.i1 -,:U>1l_hu1,1O>1,1PE#Ve%h1,:U>23%qu0etL>1,1SF#W4=l1,:U>0ocMo1,1L>1,1YH#W"4j -0f(R>1QD_u1,1L>1,1MD#Vn+i0f(R>1l_hu0etI>1,1PE#Vn1j1GLU>1QD_t1GL[?0etJD#Ve( -i1GLU>1l_ht1,:X?0etME#Vn+j1GLU>1QD_t0f(U?0etJD#Ve+i1,:R>1l_ht1GLX?0etME#Ve -+i1GLX>1l_ht1GL[?1,1PE#Ve%i1,:R>1l_hs1,:X?1,1SF#W+:l1GLX>0ocMo0f(U?1,1VG#W -"1k1GLX>16)Vq1GLU?0etPF#W+=l0f(O>0ocMo1,:R?0etSG#Vn1j1,:U>1QD_t1GLX?1,1MD# -Ve(i1,:U>1l_ht1,:U?1,1PE#Vn+j1,:U>1QD_t0f(R?1,1MD#Ve+i0f(R>1l_ht1GLU?1,1PE -#Vn.j0f(R>1QD_t1,:R?1,1MD#Ve%i0f(R>1l_ht0f(O?1,1PE#Vn4k1GLU>16)Vp1GUa@0etP -F#W"7l1GLU>0ocMp1,C^@0etME#Ve%j1GLU>1QD_s0f1[@0etJD#Ve.j1,:R>1QD_s1bga@0et -JD#Ve.j1GLX>1QD_s1bgd@1,1MD#Ve(j1,:R>1QD_r1GUa@1,1PE#Ve(j1GLX>1QD_s1,C^@1, -1MD#Vn+k1GLX>16)Vq1bg^@0etME#Ve+j0f(O>1QD_r1bga@1,1PE#Ve+j1,:U>1QD_s1GU^@1 -,1MD#Ve%j0f(O>1QD_r1,C[@1,1PE#Ve%j1,:U>1QD_s0f1X@1,1MD#Ve.j0f(R>1QD_s1bg^@ -1,1MD#Vn1k0f(R>16)Vp1,CX@1,1SF#W"4l0f(R>0ocMp0f1U@1,1PE#Vn7l1GLU>0ocMo1bpj -A0etME#Vn1l1GLU>0ocMo1,LdA0etME#Ve1k1,:R>16)Vp2)-mA1,1PE#Ve+k1,:R>16)Vq1bp -jA1,1MD#Ve+k1GLX>16)Vp0f:^A0etME#Vn.l1GLX>0ocMp2)-gA0etJD#Ve.k0f(O>16)Vq2) --jA1,1MD#Ve.k1,:U>16)Vp1,L^A0etME#Vn1l1,:U>0ocMo1,LaA1,1PE#Vn+l1,:U>0ocMo2 -)-gA1,1PE#Vn4l0f(R>0ocMo1G^aA1,1PE#Vn.l0f(R>0ocMo0f:[A1,1PE#Ve1l1GLU>0ocMo -1GgmB0etJD#Ve4l1,:R>0ocMo2DI!B1,1MD#Ve.l1,:R>0ocMo1c$pB1,1MD#Ve(l1,:R>0ocM -o2)6mB0etJD#Ve1l1,:U>0ocMo1GggB0etJD#Ve+l1,:U>0ocMo0fCaB0etJD#Ve4l0f(R>0oc -Mo1c$jB1,1MD#Ve(l0f(R>0ocMp0ekL>0etSG#W+7j1bg^?16)Vp0ekI>0etVH#W"1i1GU[?1Q -D_u0ekI>0etJD#Ve%g1bga?23%qu0ekL>1,1SF#W4=k1bga?0ocMp0ekF>0etSG#W+7j1,CX?1 -6)Vq0ekI>1,1VG#W+7j1GU^?16)Vp0ekC>0etVH#W"1i0f1U?1QD_u0ekC>0etJD#Ve%g1,C[? -23%qu0ekF>1,1SF#W4=k1,C[?0ocMp0ekC>1,1VG#W+7j0f1X?16)Vq1,1U?0etPF#W+:k1bg^ -?0ocMo0etR?0etSG#W"1j1bg^?16)Vp1,1R?0etSG#W"4j1GU[?16)Vp1,1U?1,1VG#W"4j1bg -a?16)Vq0etR?1,1SF#W+7k1bga?0ocMp1,1O?0etPF#W+:k1,CX?0ocMo0etL?0etSG#Vn.i1G -U^?1QD_t1,1R?1,1MD#Ve%h1GU^?1l_ht0etO?1,1PE#Ve(h0f1U?1l_ht1,1L?0etME#Ve(h1 -,C[?1l_ht1,1O?1,1PE#Vn+i1,C[?1QD_t0etL?1,1MD#Vn.i0f1X?1QD_t1,1L?1,1MD#Ve%h -0f1X?1l_ht0etI?1,1PE#Vn1j1bg^?16)Vp1,:[@0etPF#W"4k1bg^?0ocMp0f(X@0etME#Ve+ -i1GU[?1QD_s1GL[@0etJD#Ve+i1bga?1QD_s1GL^@1,1MD#Ve%i1GU[?1QD_r1,:[@1,1PE#Ve - %i1bga?1QD_s0f(X@1,1MD#Vn1j1,CX?16)Vp1,:U@0etPF#Vn1j1GU^?16)Vp1,:X@1,1SF# -W"4k1GU^?0ocMp0f(U@1,1PE#Ve+i0f1U?1QD_s1GLU@0etJD#Ve+i1,C[?1QD_s1GLX@1,1MD -#Ve%i0f1U?1QD_r1,:U@1,1PE#Ve%i1,C[?1QD_s0f(R@1,1MD#Vn1j0f1X?16)Vp1,:R@1,1S -F#W"4k0f1X?0ocMp0f(O@1,1PE#Vn4k1bg^?0ocMo1GUdA0etME#Vn.k1bg^?0ocMo1bgdA0et -ME#Ve.j1bga?16)Vp1,C^A0etME#Vn1k1bga?0ocMo1,CaA1,1PE#Vn4k1,CX?0ocMo1GU^A0e -tME#Vn4k1GU^?0ocMo1GUaA1,1PE#Ve%j1,CX?16)Vq1,C^A1,1MD#Ve%j1GU^?16)Vp1bg^A0 -etME#Ve.j1,C[?16)Vp1,CXA0etME#Vn1k1,C[?0ocMo1,C[A1,1PE#Vn+k1,C[?0ocMp1bg^A -1,1MD#Ve+j0f1X?16)Vq1,CXA1,1MD#Ve%j0f1X?16)Vp1bpmB0etJD#Ve1k1GU[?0ocMo2)-p -B1,1MD#Ve+k1GU[?0ocMo1G^jB1,1MD#Ve.k1,CX?0ocMo1bpjB1,1MD#Ve(k1,CX?0ocMo1,L -dB1,1MD#Ve1k0f1U?0ocMo2)-jB1,1MD#Ve+k0f1U?0ocMo1G^dB1,1MD#Ve%k0f1U?0ocMo0f -:^B1,1MD#Ve.k0f1X?0ocMo1,L^B1,1MD#Vn+h2)-g@1QD_t0ekO?0etJD#Ve%g1bpd@1l_ht0 -ekL?0etME#Ve%g2)-j@1l_ht0ekO?1,1PE#Vn+h1G^a@1QD_t0ekI?0etJD#Vn+h1bpg@1QD_t -0ekL?1,1MD#Ve%g1,L^@1l_ht0ekF?0etME#Ve%g1G^d@1l_ht0ekI?1,1PE#Vn+h0f:[@1QD_ -t0ekC?0etJD#Vn+h1,La@1QD_t0ekF?1,1MD#Ve%g0f:^@1l_ht0ekC?1,1PE#Vn.i2)-g@16) -Vp0etU@0etPF#W"1j2)-g@0ocMo1,1U@0etPF#W"4j1bpd@0ocMo1,1X@1,1SF#W"4j2)-j@0o -cMp0etU@1,1PE#Vn.i1G^a@16)Vp0etO@0etPF#Vn.i1bpg@16)Vp0etR@1,1SF#W"1j1bpg@0 -ocMo1,1O@0etPF#W"4j1,L^@0ocMo1,1R@1,1SF#W"4j1G^d@0ocMp0etO@1,1PE#Vn.i0f:[@ -16)Vp0etI@0etPF#Vn.i1,La@16)Vp0etL@1,1SF#W"1j1,La@0ocMo1,1L@1,1SF#W"4j0f:^ -@0ocMp0etI@1,1PE#Vn1j2)-g@0ocMo1,:^A0etME#Ve+i1bpd@16)Vp1GLaA1,1PE#Ve%i1bp -d@16)Vq1,:^A1,1MD#Vn1j1G^a@0ocMo1,:XA0etME#Vn1j1bpg@0ocMo1,:[A1,1PE#Vn+j1b -pg@0ocMo1GLXA0etME#Ve+i1G^d@16)Vp0f(RA0etME#Vn.j1G^d@0ocMo0f(UA1,1PE#Vn1j0 -f:[@0ocMo1,:RA0 etME# Vn1j1 ,La@0 oc Mo1 ,:UA1, 1PE#Vn+ -j1,La@0ocMo1GLU A1, 1PE#V n.j0f :^ @0o cMo 0f(O -A1,1PE#Ve+j2)-g @0ocM o1 bggB0 etJD #V e.j 2)-j@ 0oc Mo1,C aB0e -tJD#Ve+j1G^a@0o cMo1G UdB 1,1 MD#V e% j1G ^a@0oc Mo 1bgaB0 etJ -D#Ve.j1G^d@0ocM o1,C[ B0e tJD # Ve( j1G ^d@ 0ocMo1 GU [B0etJ D#V -e+j1,La@0ocMo0f 1UB0e tJD #Ve %j 1, La@ 0oc Mo1bg^ B1 ,1MD#V e(j -0f:^@0ocMp0ekR@ 0etM E#V e% g2 )6m A1Q D_s 0ekO -@0etJD#Ve%g2DHs A1QD _ s0 ek R@1 ,1M D#Vn +h1c$ -jA16)Vq0ekO@1,1 PE#Ve% g1G g gA1 QD _s0e kI@ 0etJD#Ve%g 1c$mA1QD_s0 -ekL@1,1MD#Vn+h1 ,UdA16 )Vq 0 ekI@ 1,1P E#V e%g0fCaA1Q D_s0ekC@0et -JD#Ve%g1,UgA1QD _s0ekF @1, 1MD# Vn.i 2DH pA0ocMo1,1 XA0etME#Ve( -h2DHsA16)Vq1,1U A0etJ D#Ve %h1c$ jA16 )Vq 1,1XA1,1MD #Ve%h2)6pA1 -6)Vp1,1RA0etME# Ve(h1 c$mA1 6)Vq0 etR A1,1MD#Vn. i1,UdA0ocMo -0etLA0etME#Vn.i 1GgjA0o cMo0et OA1,1 PE# Ve(h0fCaA1 6)Vp1,1OA1, -1PE#Vn+i1,UgA0ocMo1GLaB0etJD#Ve+i2DHsA0ocMo1,:[B0etJD#Ve(i2)6pA0ocMo1GL[B0 -etJD#Ve+i1c$mA0ocMo0f(UB0etJD#Ve%i1c$mA0ocMo1,:UB0etJD#Ve(i1GgjA0ocMo1GLUB -0etJD#Ve+i1,UgA0ocMo0f(OB0etJD#Ve%i1,UgA0ocMp0ekC;1,:bJ#W+7j0ekF=1l_i"0ekC -;1,:VF#W"1i0ekI=23%r"0ekC;1GL\G#Vn+i0ekC=23%r!0etI<0f(VG#W=Cm0ekC=0ocMp1,1 -L<1,:_I#W+:k0ekF=1QD_q0etI<1,:bJ#W"1j0ekF=1l_i!0etI<1,:VF#Ve(h0ekI=2NA&!1, -1L<1GL_H#W4@l0ekI=16)Vq0etI<1GLbI#W+7k0ekI=1QD`!0etI<1GLVE#Vn.j0ekC=1l_hu1 -,:R=0f(SF#Ve%i0ekC=23%qu0f(O=0f(VG#W4=m0ekC=0ocMp1GLU=1,:\H#W+=l0ekF=16)Vp -1,:R=1,:_I#W"4k0ekF=1QD_u1,:R=1,:SE#Vn+j0ekF=1l_hu0f(O=1,:VF#Ve+i0ekI=23%q -u1GLU=1GL\G#Vn.j0ekI=1l_hu1,:R=1GLYF#Ve%i0ekI=23%qu0f(O=1GL\G#W4=m0ekI=0oc -Mp1GU[>0f(VG#W+=m0ekC=0ocMo1,CX>0f(YH#W"4l0ekC=16)Vq0f1U>0f(VG#W+7m0ekC=0o -cMp1bg^>1,:YG#Ve+j0ekF=1l_ht1GU[>1,:VF#Vn.k0ekF=1QD_t1,CX>1,:SE#Ve%j0ekF=1 -l_ht0f1U>1,:VF#Ve.j0ekI=1l_ht1bg^>1GLYF#Vn1k0ekI=1QD_t1GU[>1GLVE#Ve(j0ekI= -1l_ht1,CX>1GLYF#Vn+k0ekI=1QD_t0f1U>1GLVE#Vn4l0ekC=16)Vp1G^a?0f(VG#W"7m0ekC -=0ocMp1,L^?0f(SF#Ve%k0ekC=1QD_s0f:[?0f(PE#Vn7l0ekF=16)Vp1bpd?1,:YG#W":m0ek -F=0ocMp1G^a?1,:VF#Ve(k0ekF=1QD_s1,L^?1,:SE#Vn+l0ekF=16)Vp2)-g?1GL\G#Vn4l0e -kI=16)Vp1G^a?1GL\G#W"7m0ekI=0ocMp1,L^?1GLYF#Ve%k0ekI=1QD_s0f:[?1GLVE#Vn7m0 -ekC=0ocMo1c$j@0f(SF#Vn1m0ekC=0ocMo1,Ud@0f(SF#Vn+m0ekC=0ocMo2)6m@1,:VF#Vn4m -0ekF=0ocMo1Ggg@1,:VF#Vn.m0ekF=0ocMo0fCa@1,:VF#Ve4l0ekI=16)Vq2)6m@1GLVE#Ve. -l0ekI=16)Vq1Ggg@1GLVE#Ve(l0ekI=16)Vq0fCa@1GLVE#W"1i1,1L>1l_i!0ekF<0f(SF#Vn -+h0etI>23%r!0ekC<0f(VG#W=Cl0etI>0ocMp0ekF<1,:_I#W+7j1,1O>1QD`!0ekF<1,:SE#V -e%g0etL>2NA&!0ekC<1,:\H#W4=k0etL>16)Vp0ekF<1GLeJ#W"1i1,1R>1l_i!0ekF<1GLYF# -Vn+h0etO>23%r!0ekC<1GL\G#W=Cl0etO>0ocMo1,1O=0f(\I#W"4j1,1L>1QD_u1,1O=0f(PE -#Vn+i1,1L>1l_hu0etL=0f(SF#Vn.i0etI>1l_hu1,1L=0f(SF#Ve%h0etI>23%qt1,1O=1,:\ -H#W+:k1,1O>16)Vp0etL=1,:_I#W"1j1,1O>1QD_u0etL=1,:SE#Ve(h0etL>23%qu1,1L=1,: -YG#W4@l0etL>0ocMo1,1O=1GLbI#W"4j1,1R>1QD_u1,1O=1GLVE#Vn+i1,1R>1l_hu0etL=1G -LYF#Vn.i0etO>1l_hu1,1L=1GLYF#Ve%h0etO>23%qu0etI=1GL\G#W4=l0etO>0ocMo1GLX>0 -f(YH#W"7k1,1L>16)Vq1,:U>0f(VG#W+:l1,1L>0ocMo0f(R>0f(YH#W"1k1,1L>16)Vq1GLU> -0f(VG#W+=l0etI>0ocMo1,:R>0f(YH#Vn1j1,1O>1QD_t1GLX>1,:SE#Ve(i1,1O>1l_ht1,:U ->1,:VF#Vn+j1,1O>1QD_t0f(R>1,:SE#Ve+i0etL>1l_ht1GLU>1,:VF#Ve+i1,1R>1l_ht1GL -X>1GLYF#Ve%i0etL>1l_hs1,:U>1GL\G#W+:l1,1R>0ocMo0f(R>1GL_H#W"1k1,1R>16)Vq1G -LU>1GL\G#W+=l0etO>0ocMo1,:R>1GL_H#W"4k0etO>16)Vq0f(O>1GL\G#W+7l0etO>0ocMo1 -bga?0f(VG#W":l1,1L>0ocMp1GU^?0f(SF#Ve(j1,1L>1QD_s1,C[?0f(PE#Vn+k1,1L>16)Vq -1bg^?0f(SF#Ve+j0etI>1QD_r1bga?1,:VF#Ve+j1,1O>1QD_s1GU^?1,:SE#Ve%j0etI>1QD_ -r1,C[?1,:VF#Ve%j1,1O>1QD_s0f1X?1,:SE#Ve.j0etL>1QD_s1bg^?1,:SE#Ve.j1,1R>1QD -_s1bga?1GLVE#Ve(j0etL>1QD_r1GU^?1GLYF#Ve(j1,1R>1QD_s1,C[?1GLVE#Vn+k1,1R>16 -)Vq1bg^?1GLYF#Ve+j0etO>1QD_s1GU[?1GLVE#Vn.k0etO>16)Vp0f1U?1GL\G#W"1l0etO>0 -ocMo2)-j@0f(SF#Vn4l1,1L>0ocMo1G^d@0f(SF#Vn.l1,1L>0jPo+NX.Bq0etI<0fG$t1bpd@ -0ekC>NX.Eq1,:R=0f=ss2)-jA0ekC=NX.Er0ekF<0f=ss2)6m@1,1L>NX.Bp1,1O=0fG$t1bga -?1,1L?NX.Nt1,1O=0f"ap1,CX?0ekC?NX.Ht0etI<0f+gq0etL>0ekC@NX.Er1,:R=0f4mr2)6 -pB0ekC0f=ss1bgdA0ekC=NX.Nt1GU[>0en[o0f(O=1,1LANX.Es0ekF<0f4mr1, -:U>1,1L@NX.Hs1,1O=0f+gq0ekI=1,1LANX.Eq1GLX>0f4mr2)-mA1,1L=NX.Bs0etI<0f4mr0 -f(R?0ekC?NX.Es1,:R=0f+gq1,:X@0ekC>NX.Hs1GU[>0f"ap0ekL?0ekC?NX.Eq1bpd?0f+gq -2)-pC0ekC;NX.?r0ekF<0f=ss1Ggg@1,1L>NX.Br1,1O=0f4mr1c$mA1,1L=NX.?p1GLX>0f=s -s1GUa@1,1L>NX.Kt1GLX>0en[o1,1U?1,1L?NX.Hr1bga?0f"ap1,UdA0ekC=NX.?r1,:R=0f4 -mr1GgjB0ekC0f+gq1c$pC0ekC;NX.?p1bpd?0f4mr1GUdB0ekCNX.?q1GLX>0f4mr1G^gA1,1L=NX.Bq1bga?0 -f+gq1bpmB1,1LNX.Bt1,1O=0f"ap0f1[@1,1L>NX.Et1GLX ->0en[o1,CaA1,1L=NX.?p2)-j@0f+gq1GUgB1,1L0ekC@NX.Hr0f( -O=0f4mr2DHpB0ekCNX.Bp0ekI=0fG$t1bg^>1GLU@NX.Nt0e -kI=0f"ap1,:R?0ekC?NX.Hs0f(O=0f+gq0ekF>0ekC@NX.Eq1,CX>0f4mr2)-jB0ekC1,1L@NX.Hr1,:U>0f+gq2DHsB1,1L0fG$t1GLX>1GLU@NX.Ks1,1R>0f"ap1,CX@0ekC>NX.H -t0f(O=0f"ap0etL?0ekC?NX.Er1,CX>0f+gq2)6pC0ekC;NX.Bp1G^a?0f4mr1bgdB0ekCNX.Bq1,:U>0f4mr1bpgA1,1L=NX.?o1GU^?0f=ss1GL[@1,1L>NX -.Ks1GU^?0en[o1,CX>1GLU@NX.Ht0ekI=0f"ap0etL=1GLUANX.Er1,1R>0f+gq2)6pA1GLU=N -X.Bp1GL[?0f4mr1bgd@1GLU>NX.Bs0f(O=0f+gq0f(R@0ekC>NX.Es1,CX>0f"ap1,:XA0ekC= -NX.Hs1G^a?0en[o0ekL@0ekC>NX.Eq1c$j@0f"ap0f1U?1,1L?NX.Et0etL=0f"ap1,C[@1,1L ->NX.Ht1,:U>0en[o0etO?1,1L?NX.Er1GU^?0f"ap1,1U@1,1L>NX.Hr1bpg@0en[o1,L^?1GL -U?NX.?q1,1R>0f4mr1G^d@1GLU>NX.Bq1GL[?0f+gq1bpjA1GLU=NX.?o1bgd@0f4mr1GL^@1G -LU>NX.Bt0f(O=0f"ap0f1XA0ekC=NX.Et1,CX>0en[o1,C^B0ekCNX.Eq2)6pA0en[o1,Ud@1GLU>NX.?r1,1R>0f+gq1GgjA1GLU=NX.Br1GL[?0f"ap0etR -?1GLU?NX.Er1bgd@0en[o1,1X@1GLU>NX.?s1,CX>0f"ap1,LdC0ekC;NX.?q1c$j@0f"ap0fC -aA1,1L=NX.Bt1,:U>0en[o0f1[A1,1L=NX.Br1bpg@0en[o0etUA1,1L=NX.?s1,1R>0f"ap1, -LdA1GLU=NX.?q1bgd@0f"ap1,:^A1GLU=NX.?o2DI!B0f"ap1,1L?0ekC?NX.Hr0f1U>0f+gq2 -DHpC0ekC;NX.?o0f(R>0fG$t1GLU?1,1L?NX.Ks0f(R>0f"ap1,1L=1GLUANX.Hr0etO>0f+gq -2DHpA1GLU=NX.?o0ekL>0fG$t1GLU=1bg^ANX.Ks0ekL>0f"ap1,:R@0ekC>NX.Hs0f1U>0f"a -p0ekF?0ekC?NX.Eq1,L^?0f+gq2)-jC0ekC;NX.?p0f(R>0f=ss1GU[@1,1L>NX.Kt0f(R>0en -[o1,1O?1,1L?NX.Hr1,C[?0f"ap1,:R>1GLU@NX.Hs0etO>0f"ap0ekF=1GLUANX.Eq1,:X?0f -+gq2)-jA1GLU=NX.?p0ekL>0f=ss1GU[>1bg^@NX.Kt0ekL>0en[o1,1O=1bg^ANX.Hr1,1U?0 -f"ap1,CXA0ekC=NX.Ht0f1U>0en[o0etL@0ekC>NX.Er1,L^?0f"ap1,1RA0ekC=NX.Hr1Ggg@ -0en[o0f(O?1,1L?NX.Es0f(R>0f"ap1,:U@1,1L>NX.Hs1,C[?0en[o0ekI?1,1L?NX.Eq1G^d -@0f"ap1,CX?1GLU?NX.Ht0etO>0en[o0etL>1GLU@NX.Er1,:X?0f"ap1,1R?1GLU?NX.Hr1GU -a@0en[o0f(O=1bg^ANX.Es0ekL>0f"ap1,:U>1bg^@NX.Hs1,1U?0en[o0ekI=1bg^ANX.Eq1G -L^@0f"ap1,L^B0ekCNX.Et0 -f(R>0en[o1,C[A1,1L=NX.?p1G^d@0f+gq1GUaB1,1LNX.?q -1,:X?0f+gq1G^dA1GLU=NX.Bq1GUa@0f"ap0ekL?1GLU?NX.Eq1bpjA0en[o0f1U>1bg^@NX.E -t0ekL>0en[o1,C[?1bg^?NX.?p1GL^@0f+gq1GUa@1bg^>NX.Bp1bggA0f"ap1,UdC0ekC;NX. -?r1,L^?0f"ap1,C^C0ekC;NX.?s0f(R>0f"ap1,LaB1,1L0en[o0f1X@1GLU>NX.Br1GUa@0en[o0etR@1GLU>NX.Bp2)6sB0en[o0f:[?1bg^?N -X.Bs1,1U?0en[o0f(U?1bg^?NX.Bq1bggA0en[o0ekO?1bg^?NX.?s1,L^?0en[o0fCaB1,1L< -NX.?r1G^d@0en[o0f:^A1GLU=NX.?q1bpjA0en[o0fCa@1bg^>NX.?r1GL^@0en[o0etU@1bg^ ->NX.Bp0f:[?0f4mr1bg^B0ekCNX.Ks0f1X?0en[o1,1L>1GL -U@NX.Hr0f(U?0f"ap0ekC<1bg^BNX.Eq0etR?0f+gq2)-g@1bg^>NX.Bp0ekO?0f4mr1bg^>2) --g@NX.Bq0f:[?0f+gq1bpdC0ekC;NX.?o1,Ud@0f4mr1GLXB0ekCNX.?p0etR?0f4mr1GU[?1bg^?NX.Bp1,:[@0f+gq1bga@1bg^>NX.Bq0ekO?0f+gq1bpd -?2)-g?NX.?o1,1X@0f4mr1GLX>2)-g@NX.Br0f:[?0f"ap0etLA0ekC=NX.Er1,Ud@0en[o0f( -O@1,1L>NX.Es0f1X?0en[o1,:UA1,1L=NX.?o1GgjA0f+gq1GL[B1,1LNX.?q0etR?0f+gq1G^a@1bg^>NX.Bq1,:[@0f"ap0 -ekI>1bg^@NX.Eq1GUdA0en[o1,CX>2)-g@NX.?p1,1X@0f+gq1GU^?2)-g?NX.Bp1GLaA0f"ap -1,L^C0ekC;NX.?q1,Ud@0f"ap0f1UA1,1L=NX.Br1,La@0en[o0etOA1,1L=NX.Bs0f(U?0en[ -o0f(R@1GLU>NX.Bq1G^gA0en[o0ekL@1GLU>NX.?r0etR?0f"ap1,C[@1bg^>NX.?p1GUdA0f" -ap1,1U@1bg^>NX.Bs0ekO?0en[o0f(R>2)-g@NX.Bq1GLaA0en[o0ekL>2)-g@NX.?r1,Ud@0e -n[o0f:[B1,1LNX.?q1GUdA0 -en[o0ekO@1bg^>NX.?r1,1X@0en[o0etR?2)-g?NX.Bp0fCa@0f+gq1bg^C0ekC;NX.?o0f:^@ -0f4mr1GLUA1,1L=NX.Bp0f1[@0f+gq1bg^A1GLU=NX.?o0f(X@0f4mr1GLU?1bg^?NX.Bp0etU -@0f+gq1bg^?2)-g?NX.?o0ekR@0f4mr1GLU=2DHpANX.Bq0fCa@0f"ap0etI@1,1L>NX.Er0f: -^@0en[o1,1OA1,1L=NX.Bq0f1[@0f"ap0ekF?1GLU?NX.Eq1,LdA0en[o0etI>1bg^@NX.Er0f -(X@0en[o1,1O?1bg^?NX.Bq0etU@0f"ap0ekF=2)-gANX.Eq1,:^A0en[o0etI<2DHpBNX.Er0 -ekR@0en[o1,1O=2DHpANX.Br0fCa@0en[o0f(OA1,1L=NX.Bq1,UgA0en[o1,CXA1GLU=NX.?p -1,LdA0f"ap1,1RA1GLU=NX.?q0f(X@0f"ap1,:U@1bg^>NX.?o1G^jB0f"ap1,CX?2)-g?NX.? -p1,:^A0f"ap1,1R?2)-g?NX.?q0ekR@0f"ap1,:U>2DHp@NX.?o1GLdB0f"ap0f1UB1,1LNX.?p1G^jB0en[o0f(R?2)-g?NX.?o1bppC0en[o0f1U>2DHp@NX -.?p1GLdB0en[o1bg^>0etI@NX.Nt0ekC<0f+gq1,1O=0ekFANX.Hr1,1L<1,P!s2DHsA0ekF=N -X.Bq0ekC<0fG$t1bpd?0etI?NX.Eq1,1L=0f=ss2)-j@0etI>NX.Bq1,1L<1,Y't1bpg@0ekF> -NX.?o1GLU=1,b-u1GL[?0ekF?NX.Ks1GLU=1,=jq1,CX>0etI@NX.Ht0ekC<0f+gq0etL=0etI -ANX.Er1,1L=0f4mr2)6pA0etI=NX.Bp1GLU>0f=ss1bgd@0etI>NX.Nt1GLU>0en[o1,C[?0ek -F?NX.Ht1,1L<1,=jq0etO>0ekF@NX.Er1GLU=1,Fpr2)6sB0ekF1,P!s1bggA0e -kF=NX.Bs0ekC<0f4mr0f(R>0etI@NX.Es1,1L=0f+gq1,:X?0etI?NX.Hs1GLU>0f"ap0ekL>0 -etI@NX.Eq1bg^?0f+gq2)-pB0etINX.Hs1bg^>1,4dp0ekO?0ekF?NX.Eq2)-g?1,=jq1,Ud@0etI>NX.?r1,1L=0f4mr1Ggj -A0etI=NX.Br1GLU>0f+gq1c$pB0etINX.Et1GLU=1,4dp1,CaA0ekF=NX.?p2)-g?1,Fpr1G -UgB0ekFNX.Bs1GLU>0f"ap0f(X@0etI>NX.Es1bg^?0en[o1 -,:^A0etI=NX.?o2DHpA0f+gq1GLdB0etINX.Bp0ekF<1,b-u -1bg^>1,1O@NX.Nt0ekF<1,=jq1,1L=0etIANX.Hr0etI=0f4mr2DHpA0etI=NX.Eq0ekF=0f=s -s2)-g?1,:R?NX.?p0etI<1,b-u1GU[?0ekF?NX.Kt0etI<1,=jq1,1O>0ekF@NX.Hr1,:R=1,F -pr2DHsB0ekF0etI@NX.Hs0etI=0f -+gq0ekF=0etIANX.Eq1,:R>0f4mr2)-jA0etI=NX.?p0ekF=0fG$t1GU[>1,:R@NX.Kt0ekF=0 -f"ap1,1O=1,:RANX.Hr1,1O>0f+gq2DHsA1,:R=NX.?q0etI<1,Y't1G^a@0ekF>NX.Bq1,:R= -1,P!s1bpgA0ekF=NX.?o1GU[>1,Y't1GL[@0ekF>NX.Ks1GU[>1,4dp1,CX>1,1O@NX.Ht0ekF -<1,=jq0etL=1,1OANX.Br0etI=0f4mr1c$jA0etI=NX.?p1,:R>0f=ss1GU^@0etI>NX.Kt1,: -R>0en[o1,1R?0etI?NX.Hr1GU[?0f"ap0f(O=1,:RANX.Es0ekF=0f+gq1,:U>1,:R@NX.Hs1, -1O>0f"ap0ekI=1,:RANX.Eq1GLX?0f+gq2)-mA1,:R=NX.?r0etI<1,P!s1GggA0ekF=NX.Br1 -,:R=1,Fpr1c$mB0ekF1,P!s1GUaA0ekF=NX.Bp1bpd?1,Fpr1bggB0ekF1,1O@NX.Bs0etI=0f+gq0f(R?0etI?NX.Es1,:R>0f"ap0ekL>1,1O@NX.B -q1GU[?0f+gq1bpjB0etINX. -Br1,1O>0f+gq1c$mA1,:R=NX.?p1GLX?0f4mr1GUa@1,:R>NX.Bp1bga@0f+gq1bggA1,:R=NX -.?s0etI<1,Fpr1,LaA0ekF=NX.?q1GU[>1,Fpr1G^gB0ekFN -X.Eq2)6m@1,4dp1,Ud@1,1O>NX.?r1,1O=1,Fpr1,UdA0etI=NX.?r1,:R>0f+gq1GgjB0etI< -NX.?p1bga?1,Fpr1,C^A0etI=NX.?p1bpd@0f+gq1GUdB0etI0f"ap0f(U?1,:R?NX.Es1GLX?0en[o1,:[@1,:R>NX.?o2)-jA0f+gq1GLaA1,: -R=NX.?t0etI<1,=jq1,UgB0ekF1,=jq1,CaB0ekFNX.?s1,:R>0f"ap0f(X@1,1O>NX.Bs1GU[?0en[o0f(XA0etI=NX.?o2DHsA1,=jq1,:^B0 -etI 0f= ss1b g^ @0e tI>NX. Nt 0f(O>0 en[ -o0ekC;1GLXCNX.E q0ekI =1, P!s 2 )-g ?1G LX? NX.?o0 et L>0fG$ t1G -LU>1,:R@NX.Ks0e tL>0f "ap 1,1 L< 1G U[B NX. Hr0ekI >0 f+gq2D Hp@ -1GU[>NX.?p0f(O= 1,Y' t1G U[ @0 ekF >NX .Kt 0f(O -=1,4dp1,1O?0ekF ?NX. H r1 ,C X>1 ,=j q1,: R>1,1 -O@NX.Hs0etL=1,= jq0ekF =1, 1 OAN X. Bq0f (O> 0f4mr1bpdA 0etI=NX.?o1 -,CX?0f=ss1GLX@0 etI>NX .Ks 1 ,CX? 0en[ o0e tI<1GLXBNX .Er0ekI=1,F -pr2)6m@1GLX>NX. ?p0etL >0f =ss1 GU[? 1,: R?NX.Kt0et L>0en[o1,1O ->1,:R@NX.Hr1,:U ?0f"a p1,: R=1GU [ANX .Hs 0ekI>0f"ap 0ekF<1GU[BN -X.Eq1,1R?0f+gq2 )-j@1 GU[>N X.?q0 f(O =1,P!s1G^a A0ekF=NX.Bq -1,CX>1,Fpr1bpgB 0ekF1,P!s1,CX@0etI>NX.Ht0f(O>0en[o0etL?0etI?NX.Er1,CX?0 -f"ap1,1R@0etI>NX.Hr1G^a@0en[o0f(O=1GLXANX.Es0ekI=1,=jq0f(O>1,:R@NX.Es0etL> -0f"ap0ekI=1GLXANX.Bq1,:U?0f+gq1bpgA1,:R=NX.?o1GU^@0f4mr1GL[@1,:R>NX.Br0ekI ->0f+gq1c$j@1GU[>NX.?p1,1R?0f4mr1GU^?1GU[?NX.Bp1GL[@0f+gq1bgd@1GU[>NX.?r0f( -O=1,Fpr1GggB0ekF1,=jq0etO@0ekF>NX.Er1G^a?1,4dp1,1UA0ekF=NX.Bs0e -tL=1,=jq0f(R?1,1O?NX.Bs0f(O>0f"ap0f(R@0etI>NX.Es1,CX?0en[o0ekL?1,1O?NX.Bq1 -G^a@0f"ap0ekL@0etI>NX.Eq1c$jA0en[o0f1U>1GLX@NX.Et0ekI=1,4dp0f1U?1,:R?NX.Et -0etL>0en[o0etO>1GLX@NX.Br1,:U?0f"ap0etO?1,:R?NX.Er1GU^@0en[o1,1U@1,:R>NX.B -s0ekI>0f"ap0f(R>1GU[@NX.Es1,1R?0en[o1,:X?1GU[?NX.?o1bgdA0f+gq1GL^@1GU[>NX. -?s0f(O=1,=jq1,LaB0ekFNX -.Bt0f(O>0en[o0f1XA0etI=NX.?p1bpg@1,=jq1,C^B0etI0f"ap0f(U?1GLX?NX.Bs1,:U?0en[o0f(U@1,:R>NX.?o2)-mA1,=jq1,:[A1,:R= -NX.?o2)6pB0f"ap1,Ud@1GU[>NX.?r1,1R?0f"ap1,C^@1GU[>NX.?p1bgdA0f"ap1,1X@1GU[ ->NX.?t0f(O=1,4dp0f1[B0ekF1,4dp0f:^B0etINX.?o2DI!C0en[o0ekC>0ekF@NX.Eq0f1U>1,Fpr2)-gB0 -ekF1,P!s1bg^@1,1O>NX.Bp0f1U?0f4mr1bg^A0etI=NX.?o0etO>1,Y't1GLU> -1GLX@NX.Ks0etO>1,4dp0ekC=1,:RANX.Eq0f(R?0f+gq2)-gA1,:R=NX.Bp0ekL>1,P!s1bg^ ->1bga@NX.Bp0etO?0f4mr1bg^?1GU[?NX.?o0ekL?0f=ss1GLU=1bpdANX.Ks0ekL?0en[o0et -I?0ekF?NX.Er0f1U>1,=jq1,1O@0ekF>NX.Hr1,L^?1,4dp1,:R?1,1O?NX.Hs0f(R>1,4dp0e -kF>1,1O@NX.Bq0f1U?0f+gq1bpdB0etI1,P!s1 -GU[?1GLX?NX.?p0f(R?0f4mr1GU[@1,:R>NX.Bp1,C[@0f+gq1bgaA1,:R=NX.Bq0ekL>1,Fpr -1bpd?1bga?NX.?o1,1U?1,P!s1,:R>1GU[@NX.Hs0etO?0en[o0ekF=1GU[ANX.Eq1,:X@0f"a -p0etI<1bpdBNX.Er0ekL?0f"ap1,1O=1bpdANX.Hr1,1U@0en[o0f(O@0ekF>NX.Es0f1U>1,4 -dp1,:UA0ekF=NX.?o1Ggg@1,Fpr1GL[B0ekF1,=jq0etL?1,1O?NX.Br0f1U?0f -"ap0etL@0etI>NX.Er1,L^@0en[o1,1RA0etI=NX.?q0etO>1,Fpr1G^a@1GLX>NX.?q0f(R?0 -f+gq1G^aA1,:R=NX.?o1GUa@1,Fpr1,:U@1,:R>NX.?o1G^dA0f+gq1GL[A1,:R=NX.Br0ekL> -1,=jq0etL=1bgaANX.Br0etO?0f"ap0etL>1GU[@NX.Er1,:X@0en[o1,1R?1GU[?NX.?q0ekL -?0f+gq1G^a?1bpd?NX.Bq1,1U@0f"ap0ekI=1bpdANX.Eq1GL^A0en[o0f1UA0ekF=NX.Br1,L -^?1,4dp0etOA0ekF=NX.Bs0f(R>1,4dp0f(R@1,1O>NX.Bs0f1U?0en[o0f(RA0etI=NX.?o1c -$mA1,=jq1,:XB0etI1,=jq0f1U@1,:R>NX.?p1GUa@1,=jq1,C[A1,:R=NX.?p1 -G^dA0f"ap1,1UA1,:R=NX.Bs0ekL>1,4dp0f(R>1bga@NX.Bs0etO?0en[o0f(R?1GU[?NX.?o -1bggA1,=jq1,:X@1GU[>NX.?o1bpjB0f"ap0f1U>1bpd@NX.Br1,1U@0en[o0etO>1bpd@NX.B -p1bggB0en[o0f:[B0ekF1,4dp0f:[A1,:R=NX.?q1GUa@1,4dp0f(UA1,:R=NX.?o2)6sB1,4dp0f1X?1bga?NX -.?r1,:X@0en[o0etR?1bga?NX.?p1bpjB0en[o0f:[?1bpd?NX.?q1GL^A0en[o0ekO?1bpd?N -X.?o0f:[?1,P!s1GLUA0ekF=NX.Bp0f1X?1,Fpr1bg^A1,1O=NX.Bp0f:[@0f+gq1bg^B0etI< -NX.?o0f(U?1,P!s1GLU?1GLX?NX.?o0f1X@0f4mr1GLU@1,:R>NX.Bp0etR?1,Fpr1bg^?1bga -?NX.Bp0f(U@0f+gq1bg^@1GU[>NX.?o0ekO?1,P!s1GLU=2)-jANX.?o0etR@0f4mr1GLU>1bp -d@NX.Bp0ekO@0f+gq1bg^>2)6m@NX.?p0f:[?1,Fpr1GU[B0ekFNX.?o1,La@1,Fpr1,:RA0etI=NX.?o1,UdA0f+gq1GLXB0etINX.?p0f1X@0f+gq1GU[A1,:R=NX.Bp1,LaA0f"ap1,:R>1bga@NX.?o1,:[@1,Fpr1,:R? -1GU[?NX.?o1,C^A0f+gq1GLX@1GU[>NX.?p0ekO?1,Fpr1GU[>2)-j@NX.?p0etR@0f+gq1GU[ -?1bpd?NX.Bp1,:[A0f"ap1,:R=2)6mANX.?o1,1XA0f+gq1GLX>2)6m@NX.?q0f:[?1,=jq1,: -UB0ekFNX.Br0f:[@0en[o0etLA0etI=NX.?q0f(U?1,=jq0f -(O@1,:R>NX.?o1G^gA1,=jq1,:UA1,:R=NX.?o1GgjB0f"ap1,CX?1bga?NX.?p1,:[@1,=jq1 -,CX@1GU[>NX.?p1,C^A0f"ap1,1R@1GU[>NX.?q0ekO?1,=jq0f(O>1bpd@NX.?o1GLaA1,=jq -1,:U?1bpd?NX.?o1GUdB0f"ap1,CX>2)6m@NX.?p1,1XA0f"ap1,1R>2)6m@NX.?r0f:[?1,4d -p0f(RA1,1O=NX.?q1,UdA0en[o0f1U@1GLX>NX.?r0f1X@0en[o0etO@1GLX>NX.?p1GgjB0en -[o0f(R?1bga?NX.?q1,C^A0en[o0ekL?1bga?NX.?o1c$pC0en[o0f1U>2)-j@NX.?r0etR@0e -n[o0etO>2)-j@NX.?p1GUdB0en[o0f(R>2)6m@NX.?o1bgjC0en[o0ekC@0ekF>NX.Eq0fCa@1 -,4dp1,1L@1,1O>NX.Bp0fCaA0f"ap0ekC>1GLX@NX.Eq0f1[@1,4dp0ekC?1,:R?NX.Eq0f:^A -0en[o1,1L>1bga@NX.Bp0f1[A0f"ap0ekC<2)-jBNX.Eq0etU@1,4dp0ekC=1bpdANX.Eq0f(X -A0en[o1,1L<2DHsBNX.Bp0etUA0f"ap0etIA0ekF=NX.Bq0f:^@1,4dp0ekF@1,1O>NX.Bq0fC -aA0en[o0etI?1GLX?NX.?p0f:^A0f"ap1,1OA1,:R=NX.Bq0f(X@1,4dp0ekF>1bga@NX.Bq0f -1[A0en[o0ekF?1GU[?NX.?p0etU@1,=jq0etI>1bpd@NX.Bp1,CaB0en[o1,:R=2DHsANX.?o1 -,1[A1,=jq1,:R>2)6m@NX.?o1,:^B0f"ap0f(OB0ekFNX.?q -0f:^A0en[o0ekI@1GLX>NX.?p1,CaA1,4dp0etL@1GU[>NX.?q0etU@1,4dp0f(O?1bpd?NX.? -o1GUgB1,4dp0ekI?1bpd?NX.?p1,1[A1,4dp0etL>2)6m@NX.Eq0ekC<1,Y't2)-g?0etL?NX. -Bp0ekC=0fG$t1bg^>0f(O@NX.Nt0ekC=0f"ap1GLX>0ekI@NX.Ks1,1L<1GXsr0etI<0etLBNX -.Er0ekC<1,P!s2)6m@0etL>NX.Bp1,1L=1,Y't1bga?0etL?NX.Nt1,1L=1,4dp1,:R=0f(OAN -X.Hs0ekC=0f+gq0ekF<0f(OBNX.Eq1,1L>0f4mr2)-j@0f(O>NX.?p1,1L<1Gt0u1GU^?0ekI? -NX.Kt1,1L<1GOmq1,1R>0ekI@NX.Hr1GLU=1GXsr0f(O=0etLANX.Es0ekC<1,Fpr1,:U>0etL -@NX.Hs1,1L=1,=jq0ekI=0etLANX.Eq1GLU>1,Fpr2)-mA0etL=NX.Br0ekC=0f4mr1c$j@0f( -O>NX.?p1,1L>0f=ss1GU^?0f(O?NX.Kt1,1L>0en[o1,1R>0f(O@NX.Hr1GLU?0f"ap0f(R>0e -kI@NX.Es1,1L<1GXsr1,:X?0ekI?NX.Hs1GLU=1GOmq0ekL>0ekI@NX.Eq1bg^>1GXsr0f1U>0 -etL@NX.Et0ekC<1,=jq1,C[?0etL?NX.Ht1,1L=1,4dp0etO>0etL@NX.Er1GLU>1,=jq1,1U? -0etL?NX.Hr1bg^?1,4dp1,L^?0f(O?NX.?q1,1L>0f4mr1G^d@0f(O>NX.Bq1GLU?0f+gq1bpj -A0f(O=NX.?o1bg^@0f4mr1GL^@0f(O>NX.?r1,1L<1Gb$s1GgjA0ekI=NX.Br1GLU=1GXsr0et -R?0ekI?NX.Er1bg^>1GOmq1,1X@0ekI>NX.?s0ekC<1,Fpr1,La@0etL>NX.?q1GLU>1,Fpr1G -^gA0etL=NX.Bq1bg^?1,=jq0ekO?0etL?NX.Eq2)-g@1,4dp1,Ud@0f(O>NX.?r1,1L>0f+gq1 -GgjA0f(O=NX.Br1GLU?0f"ap0etR?0f(O?NX.Er1bg^@0en[o1,1X@0f(O>NX.?s1,1L<1GXsr -1,LdA0ekI=NX.?q1bg^>1GXsr1,:^A0ekI=NX.?o2DHp@1GXsr0fCa@0etL>NX.Bt1,1L=1,4d -p0f1[@0etL>NX.Br1bg^?1,4dp0etU@0etL>NX.Bp2DHpA1,4dp0f:^@0f(O>NX.Bs1GLU?0en -[o0f(X@0f(O>NX.Bq2)-gA0en[o0ekR@0f(O>NX.Bp0etI<1Gt0u1bg^?0ekI?NX.Nt0etI<1G -Omq0ekC;1,1RCNX.Eq0ekF<1Gk*t2)-g?1,1R?NX.?o0etI=1,b-u1GLU>0etL@NX.Ks0etI=1 -,=jq1,1L<1,:UBNX.Hr0ekF=1,Fpr2DHp@1,:U>NX.Bp0etI>0f=ss1bg^?0f(O?NX.Nt0etI> -0en[o0ekC;1,CXCNX.Eq0ekF>0f4mr2)-g?1,CX?NX.Bq0etI<1Gk*t1bpd@0ekI>NX.?o1,:R -=1Gt0u1GLX?0ekI?NX.Ks1,:R=1GOmq0etI<1,1RBNX.Er0ekF<1Gb$s2)6m@1,1R>NX.?p0et -I=1,Y't1GU[?0etL?NX.Kt0etI=1,4dp1,1O>0etL@NX.Hr1,:R>1,=jq1,:R=1,:UANX.Hs0e -kF=1,=jq0ekF<1,:UBNX.Bq0etI>0f4mr1bpd@0f(O>NX.?o1,:R?0f=ss1GLX?0f(O?NX.Ks1 -,:R?0en[o0etI<1,CXBNX.Er0ekF>0f+gq2)6m@1,CX>NX.Bp1,1O?0f4mr1bga?1,CX?NX.Br -0etI<1Gb$s1c$jA0ekI=NX.?p1,:R=1Gk*t1GU^@0ekI>NX.Bp1GU[>1Gb$s1bgdA0ekI=NX.? -q0ekF<1Gk*t1G^a?1,1R?NX.?q0etI=1,P!s1G^a@0etL>NX.?o1GLX>1Gk*t1,:U?0etL?NX. -Hs1,:R>1,4dp0ekI>0etL@NX.Eq1GU[?1,=jq1,CX>1,:U@NX.Ht0ekF=1,4dp0etL=1,:UANX -.Br0etI>0f+gq1c$jA0f(O=NX.?p1,:R?0f4mr1GU^@0f(O>NX.Bp1GU[@0f+gq1bgdA0f(O=N -X.?q0ekF>0f4mr1G^a?1,CX?NX.Bq1,1O?0f+gq1bpg@1,CX>NX.?o1GLX@0f4mr1GL[?1,CX? -NX.Bs0etI<1GXsr0f(R?0ekI?NX.Es1,:R=1GOmq1,:X@0ekI>NX.?o1bpd?1Gb$s1GL^A0ekI -=NX.?r0ekF<1Gb$s1Ggg@1,1R>NX.?r0etI=1,Fpr1GggA0etL=NX.?p1GLX>1Gb$s1,C[@0et -L>NX.?p1GU[?1,Fpr1GUaA0etL=NX.Bp1bpd@1,=jq1,L^?1,:U?NX.?q1,1O>1,Fpr1,L^@0f -(O>NX.?q1,:R?0f+gq1G^dA0f(O=NX.?o1bga@1,Fpr1,:X@0f(O>NX.?o1bpdA0f+gq1GL^A0 -f(O=NX.?r0ekF>0f+gq1Ggg@1,CX>NX.Br1,1O?0f"ap0etO>1,CX@NX.Er1GLX@0en[o1,1U? -1,CX?NX.Bt0etI<1GOmq0f1X@0ekI>NX.Br1GU[>1GOmq0etR@0ekI>NX.Bp2)6m@1GOmq0f:[ -?1,1R?NX.?s0etI=1,=jq0f(U?1,1R?NX.Bs1,:R>1,4dp0f(U@0etL>NX.?o2)-j@1GXsr1,: -[A0etL=NX.?o2)6mA1,=jq1,Ud@1,:U>NX.?r1,1O>1,=jq1,UdA0f(O=NX.?r1,:R?0f"ap0e -tR?1,:U?NX.Br1GU[@0en[o0etR@0f(O>NX.Bp2)6mB0en[o0f:[?1,CX?NX.Bs1,1O?0en[o0 -f(U?1,CX?NX.Bq1bgaA0en[o0ekO?1,CX?NX.?s1,:R=1GOmq0f(XA0ekI=NX.?t0ekF<1GOmq -0fCaA0etL=NX.?r1GLX>1GOmq0f1[A0etL=NX.?p2)-j@1GOmq0etUA0etL=NX.?s1,1O>1,4d -p0f:^A0f(O=NX.?q1bga@1,4dp0f(XA0f(O=NX.?o2DHsB1,4dp0fCa@1,CX>NX.?r1GLX@0en -[o0etU@1,CX>NX.Bp0f(O=1Gk*t1bg^@0ekI>NX.?o0etL=1Gt0u1GLU>1,1R@NX.Ks0etL=1G -Omq0ekC=0etLANX.Eq0f(O>1,Fpr2)-gA0etL=NX.Bp0ekI=1Gk*t1bg^>1GL[@NX.Bp0etL>1 -,P!s1bg^?1,:U?NX.Bp0f(O?0f4mr1bg^@0f(O>NX.?o0ekI>1,Y't1GLU=1GU^ANX.Ks0ekI> -1,4dp0ekC<1,CXBNX.Eq0etL?0f+gq2)-g@1,CX>NX.Bp0ekI?0f4mr1bg^>1G^a@NX.Bq0f(O -=1Gb$s1bpdA0ekI=NX.?o1,CX>1Gk*t1GLX@0ekI>NX.?p0etL=1Gk*t1GU[?1,1R?NX.?p0f( -O>1,P!s1GU[@0etL>NX.Bp1,CX?1,Fpr1bgaA0etL=NX.Bq0ekI=1Gb$s1bpd?1GL[?NX.?o1, -1R>1Gk*t1,:R>1,:U@NX.Hs0etL>1,4dp0ekF=1,:UANX.Bq0f(O?0f+gq1bpdA0f(O=NX.?o1 -,CX@0f4mr1GLX@0f(O>NX.?p0ekI>1,P!s1GU[>1GU^@NX.?p0etL?0f4mr1GU[?1,CX?NX.Bp -1,:U@0f+gq1bga@1,CX>NX.Bq0ekI?0f+gq1bpd?1G^a?NX.?o1,1R@0f4mr1GLX>1G^a@NX.B -r0f(O=1GXsr0etL?0ekI?NX.Er1,CX>1GOmq1,1R@0ekI>NX.?q0etL=1Gb$s1G^a@1,1R>NX. -?q0f(O>1,Fpr1G^aA0etL=NX.?o1GU^?1Gb$s1,:U@0etL>NX.?o1G^a@1,Fpr1GL[A0etL=NX -.Br0ekI=1GXsr0etL=1GL[ANX.Br0etL>1,=jq0etL>1,:U@NX.Br0f(O?0f"ap0etL?0f(O?N -X.Er1,CX@0en[o1,1R@0f(O>NX.?q0ekI>1,Fpr1G^a?1GU^?NX.?q0etL?0f+gq1G^a@1,CX> -NX.?o1GL[@1,Fpr1,:U?1,CX?NX.?o1GU^A0f+gq1GL[@1,CX>NX.Br0ekI?0f"ap0etL=1G^a -ANX.Er1,1R@0en[o1,1R>1G^a@NX.Bs0f(O=1GOmq0f(R@0ekI>NX.Bq1G^a?1GOmq0ekL@0ek -I>NX.?r0etL=1GXsr0f1U@0etL>NX.?p1GU^?1GXsr1,C[A0etL=NX.?p1G^a@1,=jq1,1UA0e -tL=NX.Bs0ekI=1GOmq0f(R>1GL[@NX.Bs0etL>1,4dp0f(R?1,:U?NX.Bs0f(O?0en[o0ekL>1 -GL[@NX.?q1,CX@0f"ap0ekL?1,:U?NX.Bq1G^aA0en[o0ekL@0f(O>NX.?r0ekI>1,=jq0f1U? -1,CX?NX.?p1GL[@1,=jq1,C[@1,CX>NX.?p1GU^A0f"ap1,1U@1,CX>NX.Bs0ekI?0en[o0f(R ->1G^a@NX.Bq1GL[A0en[o0ekL>1G^a@NX.?r1,CX>1GOmq0etRA0ekI=NX.?s0etL=1GOmq0f: -[A0etL=NX.?q1GU^?1GOmq0f(UA0etL=NX.?o2)6pA1GOmq0f1X?1GL[?NX.?r1,:U?1,4dp0e -tR?1GL[?NX.?r1,CX@0en[o0etR@1,:U>NX.?p1c$jB0en[o0f:[?1GU^?NX.?s0etL?0en[o0 -f(U?1GU^?NX.?q1GU^A0en[o0ekO?1GU^?NX.?o2)6pC0en[o0f1X?1G^a?NX.?p1bgdB0en[o -1,1L?0ekI?NX.Hr0f1U>1GOmq0ekC=1,1RANX.Eq0f(R>1GXsr0ekC>0etL@NX.Eq0f1U?1,=j -q1,1L=1GL[ANX.Hr0etO>1GOmq1,1L>1,:U@NX.Hr0f(R?1,4dp1,1L?0f(O?NX.Hr0f1U@0en -[o0ekC;1bgdCNX.Eq0ekL>1GXsr0ekC<1GU^BNX.Eq0etO?1,=jq0ekC=1,CXANX.Eq0f(R@0f -"ap1,1L<1bpgBNX.Hr0ekL?1,4dp1,1L=1G^aANX.Hr0etO@0en[o0ekC;1c$jCNX.Eq0ekL@0 -f"ap1,:R@0ekI>NX.?o1,L^?1Gb$s1GLXA0ekI=NX.?p0f(R>1Gb$s1GU[@1,1R>NX.?p0f1U? -1,Fpr1GU[A0etL=NX.Bp1,L^@1,=jq1,:R>1GL[@NX.?o1,:X?1Gb$s1,:R?1,:U?NX.?o1,C[ -@1,Fpr1,:R@0f(O>NX.?o1,L^A0f+gq1GLXA0f(O=NX.?p0ekL>1Gb$s1GU[>1bgd@NX.?p0et -O?1,Fpr1GU[?1GU^?NX.?p0f(R@0f+gq1GU[@1,CX>NX.Bp1,C[A0f"ap1,:R=1bpgANX.?o1, -1U@1,Fpr1,:R>1G^a@NX.?o1,:XA0f+gq1GLX?1G^a?NX.?p0ekL@0f+gq1GU[>1c$j@NX.Bp1 -,1UA0f"ap1,CXA0ekI=NX.?p1,L^?1GXsr1,1RA0ekI=NX.?q0f(R>1GXsr0f(O@0etL>NX.?o -1G^d@1GXsr1,:UA0etL=NX.?o1GggA1,=jq1,CX?1GL[?NX.?p1,:X?1GXsr1,CX@1,:U>NX.? -p1,C[@1,=jq1,CXA0f(O=NX.?p1,L^A0f"ap1,1RA0f(O=NX.?q0ekL>1GXsr0f(O>1GU^@NX. -?o1GL^@1GXsr0f(O?1,CX?NX.?o1GUaA1,=jq1,:U@1,CX>NX.?o1G^dB0f"ap1,CX>1bpg@NX -.?p1,1U@1,=jq1,CX?1G^a?NX.?p1,:XA0f"ap1,1R?1G^a?NX.?q0ekL@0f"ap1,:U>1c$j@N -X.?o1GL^B0f"ap0 f(RA0 ekI=N X.?r0 f( R>1 GOmq0f 1UA0etL -=NX.?p1G^d@1GOm q0e tOA0e tL=NX .? q1, :X? 1GOm -q0f(R@1,:U>NX.? o1bpj A1 GOmq0 f(RA 0f (O= NX.?o 1c$ mB1,4 dp0f -1U>1bgd@NX.?r0e tO?1, 4dp 0et O>1b gd @NX .?r0f( R@ 0en[o0 etO -?1GU^?NX.?p1G^d B0en[ o0f (R> 1 bpg @NX .?q 1,:XA0 en [o0ekL >1b -pg@NX.?o1bpjC0e n[o0f 1U> 1c$ j@ NX .?p 1GL ^B0en[ o1 ,1L@0e kI> -NX.?o0f1X?1Gb$s 1GLU @1, 1R >N X.? o0f :[@ 1,Fp -r1GLUA0etL=NX.B p0f( U ?1 GX sr1 ,1L ?1,: U?NX. -Bp0f:[A0f"ap0ek C<1bgd BNX . Eq0 et R?1G Omq 0ekC=1GU^A NX.Eq0f(U@1 -,4dp0ekC>1,CX@N X.Eq0f 1XA 0 en[o 1,1L <2) -mBNX.Bp0e tR@1,=jq1,1 -L>1G^a@NX.?o0ek O@1,Fp r1G LU=2 )6pA NX. ?o0etRA0f+ gq1GLU>1c$j -@NX.Bq0f:[?1GOm q0ekF @0ek I>NX. ?p0f 1X? 1GXsr0etI@ 0etL>NX.Bp1 -,UdA1,4dp1,:R?1 GL[?N X.?o1 ,C^@1 GXs r1,:R@1,:U >NX.?o1,LaA -1,=jq1,:RA0f(O= NX.?o1, UdB0f" ap0et I=1 bgdANX.?p0 f(U@1,=jq0e -tI?1,CX?NX.Bp1,LaB0en[o1,:R=2)-mANX.?o1,1X@1GXsr1,:R>1bpg@NX.?o1,:[A1,=jq1 -,:R?1G^a?NX.?o1,C^B0f"ap0etI<2)6pBNX.?p0etRA0f"ap1,1O>1c$j@NX.?p1,Ud@1GOmq -0f(O@1,1R>NX.?q0f:[@1,4dp0ekI@1,1R>NX.?p1,C^@1GOmq0etL@1,:U>NX.?p1,UdB0en[ -o0f(O>1bgd@NX.?q0f(U@1,4dp0ekI>1bgd@NX.?q0f1XA0en[o0ekI?1GU^?NX.?o1GgjC0en -[o0etL=2)-mANX.?p1,:[A1,4dp0etL?1G^a?NX.?q0ekO@1,4dp0f(O>1c$j@NX.?o1GLaB1, -4dp0ekI>1c$j@NX.Bp0fCa@1GOmq0ekC?1,1R?NX.?o0fCaA1,=jq1,1L?1GL[?NX.Bp0f:^A1 -,4dp1,1LA0f(O=NX.?o0f(X@1GXsr0ekC>1GU^@NX.?o0f:^B0f"ap1,1L=2)-mANX.Bp0f(XA -1,4dp1,1L?1G^a?NX.?o0ekR@1GXsr0ekC<2)6pBNX.?o0f(XB0f"ap0etI@1,1R>NX.?p0fCa -A1,4dp0ekF?1GL[?NX.?o1,UgB1,4dp0etI>1bgd@NX.?p0f1[A1,4dp0etI@1,CX>NX.?o1,: -^A1GOmq0ekF>1bpg@NX.?o1,LdC0en[o0etI<2DI!BNX.?p0etUA1,4dp0etI>1c$j@NX.Bp0e -kC<1Gt0u1bg^>0etO@NX.Nt0ekC<1GOmq0ekC;0f(RCNX.Eq0ekC=1,P!s2)-g?0f(R?NX.Bp0 -ekC>0f=ss1bg^>0f1U@NX.Nt0ekC>0en[o1,1O=0ekLANX.Hr1,1L<1bt's1,:R=0etOANX.Hs -0ekC<1GXsr0ekF<0etOBNX.Eq1,1L=1Gb$s2)-j@0etO>NX.?p0ekC=1,Y't1GU[>0f(R@NX.K -t0ekC=1,4dp1,1O=0f(RANX.Hr1,1L>1,=jq1,:R=0f1UANX.Hs0ekC>0f"ap0ekF<0f1UBNX. -Eq1,1L?0f+gq2)-j@0f1U>NX.Bq1,1L<1c(-t1bpg@0ekL>NX.?o1GLU=1c13u1GL[?0ekL?NX -.Br0ekC<1Gb$s1c$j@0etO>NX.?p1,1L=1Gk*t1GU^?0etO?NX.Bp1GLU>1Gb$s1bgd@0etO>N -X.?q0ekC=1,P!s1G^a?0f(R?NX.Bq1,1L>1,Fpr1bpg@0f(R>NX.?o1GLU?1,P!s1GL[?0f(R? -NX.Br0ekC>0f+gq1c$j@0f1U>NX.?p1,1L?0f4mr1GU^?0f1U?NX.Bp1GLU@0f+gq1bgd@0f1U ->NX.Br1,1L<1bt's0etO>0ekL@NX.Er1GLU=1bk!r1,1U?0ekL?NX.Bs0ekC<1GXsr0f(R>0et -O@NX.Es1,1L=1GOmq1,:X?0etO?NX.?o1bg^?1Gb$s1GL^@0etO>NX.?r0ekC=1,Fpr1Ggg@0f -(R>NX.Br1,1L>1,=jq0etO>0f(R@NX.Er1GLU?1,4dp1,1U?0f(R?NX.Bs0ekC>0f"ap0f(R>0 -f1U@NX.Es1,1L?0en[o1,:X?0f1U?NX.?o1bg^A0f+gq1GL^@0f1U>NX.Bs1,1L<1bk!r0f(U? -0ekL?NX.Bq1bg^>1bk!r0ekO?0ekL?NX.Bt0ekC<1GOmq0f1X?0etO?NX.Br1GLU>1GOmq0etR -?0etO?NX.Bp2)-g@1GOmq0f:[?0f(R?NX.Bs1,1L>1,4dp0f(U?0f(R?NX.Bq1bg^@1,4dp0ek -O?0f(R?NX.Bt0ekC>0en[o0f1X?0f1U?NX.Br1GLU@0en[o0etR?0f1U?NX.Bp2)-gB0en[o0f -1[@0ekL>NX.?p2)-g?1bk!r0f:^@0etO>NX.?q1bg^?1GOmq0ekR@0etO>NX.?t0ekC=1,4dp0 -f1[@0f(R>NX.?p2)-gA1,4dp0f:^@0f1U>NX.?q1bg^A0en[o0ekR@0f1U>NX.Eq0etI<1c(-t -2)-g@0ekL>NX.Bp0ekF<1c13u1bg^>1,1U@NX.Bp0etI=1Gk*t1bg^?0etO?NX.?o0ekF=1Gt0 -u1GLU=1,:XANX.Ks0ekF=1GOmq0ekC<0f(RBNX.Eq0etI>1,Fpr2)-g@0f(R>NX.Bp0ekF>1,P -!s1bg^>1,C[@NX.Bp0etI?0f4mr1bg^?0f1U?NX.?o0ekF?0f=ss1GLU=1,L^ANX.Ks0ekF?0e -n[o0etI=0ekLANX.Er0etI<1bt's1,1O>0ekL@NX.Hr1,:R=1bk!r1,:R=1,1UANX.Hs0ekF<1 -bk!r0ekF<1,1UBNX.Bq0etI=1Gb$s1bpd@0etO>NX.?o1,:R>1Gk*t1GLX?0etO?NX.?p0ekF= -1Gk*t1GU[>1,:X@NX.?p0etI>1,P!s1GU[?0f(R?NX.Bp1,:R?1,Fpr1bga@0f(R>NX.Bq0ekF ->1,Fpr1bpd?1,C[?NX.?o1,1O?1,P!s1,:R>0f1U@NX.Hs0etI?0en[o0ekF=0f1UANX.Eq1,: -R@0f"ap0etI<1,L^BNX.Er0ekF?0f"ap1,1O=1,L^ANX.Hr1,1O@0en[o0f(O>0ekL@NX.Es0e -tI<1bk!r1,:U?0ekL?NX.?o1GU[>1c(-t1GL[@0ekL>NX.Br0ekF<1bt's0etL=1,1UANX.Br0 -etI=1GXsr0etL>0etO@NX.Er1,:R>1GOmq1,1R?0etO?NX.?q0ekF=1Gb$s1G^a?1,:X?NX.?q -0etI>1,Fpr1G^a@0f(R>NX.?o1GLX?1Gb$s1,:U?0f(R?NX.?o1GU[@1,Fpr1GL[@0f(R>NX.B -r0ekF>1,=jq0etL=1,C[ANX.Br0etI?0f"ap0etL>0f1U@NX.Er1,:R@0en[o1,1R?0f1U?NX. -?q0ekF?0f+gq1G^a?1,L^?NX.Bq1,1O@0f"ap0ekI=1,L^ANX.Eq1GLXA0en[o0f1U?0ekL?NX -.Br1,:R=1bk!r0etO?0ekL?NX.Bp1bpd?1bk!r1,L^?1,1U?NX.?q1,1O=1bt's1,L^@0etO>N -X.?q1,:R>1GXsr0ekL>1,1U@NX.Bq1GU[?1GOmq0ekL?0etO?NX.?r0ekF=1GXsr0f1U?0f(R? -NX.?p1GLX?1GXsr1,C[@0f(R>NX.?p1GU[@1,=jq1,1U@0f(R>NX.Bs0ekF>1,4dp0f(R>1,C[ -@NX.Bs0etI?0en[o0f(R?0f1U?NX.?o1bgaA1,=jq1,:X@0f1U>NX.?o1bpdB0f"ap0f1U>1,L -^@NX.Br1,1O@0en[o0etO>1,L^@NX.Bp1bgaB0en[o0f:[@0ekL>NX.?q1GU[>1bk!r0ekO@0e -kL>NX.?r1,1O=1bk!r0f1X@0etO>NX.?p1bga?1bk!r0etR@0etO>NX.?s0ekF=1GOmq0f:[@0 -f(R>NX.?q1GLX?1GOmq0f(U@0f(R>NX.?o2)-jA1GOmq0ekO@0f(R>NX.?r1,1O?1,4dp0f1X@ -0f1U>NX.?p1bgaA1,4dp0etR@0f1U>NX.?s0ekF?0en[o0f(U?1,L^?NX.?o2)-jC0en[o0ekC -=0ekLANX.Eq0f(O=1bt's1,1L=1,1UANX.Hr0etL=1bk!r1,1L>0etO@NX.Hr0f(O>1GOmq0ek -C;1GL^CNX.Eq0ekI=1bt's0ekC<1,:XBNX.Eq0etL>1GXsr0ekC=0f(RANX.Eq0f(O?1,=jq1, -1L<1GUaBNX.Hr0ekI>1GOmq1,1L=1,C[ANX.Hr0etL?1,4dp1,1L>0f1U@NX.Hr0f(O@0en[o0 -ekC;1G^dCNX.Eq0ekI?1,=jq0ekC<1,L^BNX.Eq0etL@0f"ap1,1L<1GggBNX.Hr0ekI@0en[o -0etI>0ekL@NX.Er0f(O=1bk!r1,1O?0ekL?NX.Bq0etL=1bt's0ekF=1,1UANX.Bq0f(O>1GXs -r0ekF>0etO@NX.Eq1,CX?1GOmq0etI<1GL^BNX.Er0ekI=1bk!r0etI=1,:XANX.Er0etL>1GO -mq0etI>0f(R@NX.Er0f(O?1,4dp1,1O?0f(R?NX.Bq0ekI>1GXsr0ekF<1GUaBNX.Bq0etL?1, -=jq0ekF=1,C[ANX.Bq0f(O@0f"ap0ekF>0f1U@NX.Eq1,CXA0en[o0etI<1G^dBNX.Er0ekI?1 -,4dp0etI=1,L^ANX.Er0etL@0en[o1,1O>1,L^@NX.Bq0ekI@0f"ap0ekF<1GggBNX.Eq1,1RA -0en[o0f(O?0ekL?NX.Bq1,CX>1bk!r0ekI?0ekL?NX.Br0etL=1bk!r0etL>1,1U@NX.Br0f(O ->1GOmq0etL?0etO?NX.Bp1G^a@1GOmq0f(O=1GL^ANX.?q0etL>1GXsr0ekI=1GL^ANX.?q0f( -O?1,=jq0ekI>1,:X@NX.Bq1,CX@1,4dp0ekI?0f(R?NX.Br0ekI>1GOmq0etL=1GUaANX.Br0e -tL?1,4dp0etL>1,C[@NX.Br0f(O@0en[o0etL?0f1U?NX.Bp1G^aB0en[o0f(O=1G^dANX.?q0 -etL@0f"ap0ekI=1G^dANX.Bq1,:UA0en[o0ekI>1,L^@NX.Br0ekI@0en[o0etL=1GggANX.Bp -1GL[B0en[o0f1U@0ekL>NX.?p1G^a?1bk!r0f(R?1,1U?NX.?q1,CX?1GOmq0ekL?1,1U?NX.? -o1c$jA1GOmq0f1U>1GL^@NX.?r0etL>1GOmq0etO>1GL^@NX.?r0f(O?1,4dp0etO?1,:X?NX. -?p1G^aA1,4dp0f(R>1GUa@NX.?q1,:U@1,4dp0ekL>1GUa@NX.?q1,CXA0en[o0ekL?1,C[?NX -.?o1c$jC0en[o0f1U>1G^d@NX.?r0etL@0en[o0etO>1G^d@NX.?p1GU^B0en[o0f(R>1Ggg@N -X.?o1bgdC0en[o0ekC>0ekL@NX.Eq0f1U>1bk!r1,1L>1,1U@NX.Bp0f1U?1GXsr0ekC<1GL^B -NX.Eq0etO>1bk!r0ekC=1,:XANX.Eq0f(R?1GOmq0ekC>0f(R@NX.Eq0f1U@1,4dp1,1L<1bgg -BNX.Bp0etO?1GXsr1,1L>1,C[@NX.Bp0f1UA0f"ap0ekC;1bpjCNX.Eq0ekL?1GOmq0ekC<1G^ -dBNX.Eq0etO@1,4dp0ekC=1,L^ANX.Eq0f(RA0en[o1,1L<1c$mBNX.Bp0etOA0f"ap0etI?0e -kL?NX.Bp1,L^?1bk!r1,:R?1,1U?NX.?o1,C[?1bt's1,:R@0etO>NX.?o1,L^@1GXsr0etI=1 -GL^ANX.?p0f(R?1GXsr0etI?0f(R?NX.Bp1,L^A1,4dp1,:R=1bggANX.?o1,1U?1bt's1,:R> -1GUa@NX.?o1,:X@1GXsr1,:R?1,C[?NX.?o1,C[A1,=jq1,:R@0f1U>NX.?o1,L^B0f"ap0etI -<1bpjBNX.?p0etO@1,=jq0etI>1,L^@NX.Bp1,C[B0en[o1,:R=1c$mANX.?o1,1UA1,=jq1,: -R>1Ggg@NX.?o1,:XB0f"ap0f(O@0ekL>NX.?o1Ggg@1bk!r0etL?1,1U?NX.?p1,L^@1GOmq0f -(O>1GL^@NX.?q0f(R?1GOmq0ekI>1GL^@NX.?q0f1U@1,4dp0ekI?1,:X?NX.?o1GggB1,4dp0 -etL=1bggANX.?p1,:X@1GOmq0etL?1,C[?NX.?p1,L^B0en[o0f(O=1bpjANX.?q0etO@1,4dp -0ekI=1bpjANX.?q0f(RA0en[o0ekI>1G^d@NX.?o1G^dC0en[o0etL=1c$mANX.?p1,:XB0en[ -o0ekC?0ekL?NX.Bp0f1X?1bk!r1,1L@0etO>NX.?o0f(U?1bt's0ekC>1,:X@NX.?o0f:[A1,= -jq1,1L=1bggANX.Bp0f(U@1GOmq1,1L?1,C[?NX.Bp0f:[B0en[o0ekC;2)-pCNX.?o0etR@1G -Xsr0ekC=1G^dANX.?o0f1XB0f"ap1,1L<2)6sBNX.Bp0etRA1,4dp1,1L>1Ggg@NX.?p0f:[?1 -bk!r0ekF?1,1U?NX.?o1,UdA1GOmq0etI>1GL^@NX.?p0f1X@1GOmq0etI@0f(R>NX.?o1,:[@ -1bk!r0ekF>1GUa@NX.?o1,LaB1,4dp0ekF@0f1U>NX.?p0ekO?1bk!r0etI=1bpjANX.?p0f(U -A1,4dp0etI?1,L^?NX.?o1,1XA1GOmq0ekF=1c$mANX.?o1,C^C0en[o0ekC@0ekL>NX.?o0f1 -[@1bk!r0ekC?1,:X?NX.?o0fCaB1,4dp0ekC<2)-pBNX.?o0f(XA1GOmq0ekC>1G^d@NX.?o0f -:^C0en[o0ekC;0etRCNX.Eq0ekC<1c(-t2)-g?0etR?NX.Bp0ekC=1Gk*t1bg^>0f(U@NX.?o0 -ekC>1,Y't1GLU=0f1XANX.Ks0ekC>1,4dp1,1L<0f:[BNX.Hr0ekC?0f"ap1GLX>0ekO@NX.?p -0ekC<1c13u1GU[>0etR@NX.Bp1,1L=1c(-t1bga?0etR?NX.Bq0ekC=1Gb$s1bpd?0f(U?NX.? -o1,1L>1Gk*t1GLX>0f(U@NX.?p0ekC>1,P!s1GU[>0f1X@NX.Bp1,1L?1,Fpr1bga?0f1X?NX. -Bq0ekC?0f+gq1bpd?0f:[?NX.?o1,1L@0f4mr1GLX>0f:[@NX.?p1,1L<2)C6u1GU^?0ekO?NX -.Bp1GLU=2):0t0f(O=0etRANX.Es0ekC<1bk!r1,:U>0etR@NX.?o1GLU>1c(-t1GL[?0etR?N -X.Br0ekC=1GXsr0etL=0f(UANX.Er1,1L>1GOmq1,1R>0f(U@NX.?q0ekC>1,Fpr1G^a?0f1X? -NX.Bq1,1L?1,=jq0ekI=0f1XANX.Eq1GLU@1,4dp1,CX>0f:[@NX.?p1,1L@0f+gq1GU^?0f:[ -?NX.Bp1GLUA0f"ap0f(R>0ekO@NX.Bq1GLU=2)1*s0ekL>0ekO@NX.?r0ekC<1bt's1,C[?0et -R?NX.?p1GLU>1bt's1,1U?0etR?NX.Bs0ekC=1GOmq0f(R>0f(U@NX.Bq1GLU?1GOmq0ekL>0f -(U@NX.?r0ekC>1,=jq1,C[?0f1X?NX.?p1GLU@1,=jq1,1U?0f1X?NX.Bs0ekC?0en[o0f(R>0 -f:[@NX.Bq1GLUA0en[o0ekL>0f:[@NX.?r1,1L<2)1*s0etR?0ekO?NX.?s0ekC<1bk!r0f(U? -0etR?NX.?o2)-g@1bk!r0f1X?0f(U?NX.?p1bg^@1GOmq0f:[?0f1X?NX.?q1GLU@1,4dp0ekO -?0f1X?NX.?r1,1L@0en[o0etR?0f:[?NX.Bp0etI<2)C6u1bg^?0ekO?NX.?o0ekF<2)L=!1GL -U=1,1XANX.?o0etI=1c13u1GLU>0etR@NX.Bp0ekF=1c(-t1bg^>1,:[@NX.Bp0etI>1Gb$s1b -g^?0f(U?NX.?o0ekF>1Gk*t1GLU=1,C^ANX.?o0etI?1,P!s1GLU>0f1X@NX.Bp0ekF?1,Fpr1 -bg^>1,La@NX.Bp0etI@0f+gq1bg^?0f:[?NX.?o0ekF@0f4mr1GLU=1,UdANX.Bq0etI<2):0t -0ekF=0ekOANX.Eq1,:R=2)1*s0etI<1,1XBNX.Er0ekF<2)1*s0etI=0etRANX.Er0etI=1bk! -r1,1O>0etR@NX.Bq0ekF=1bt's0ekF<1,:[BNX.Bq0etI>1GXsr0ekF=0f(UANX.Eq1,:R?1GO -mq0etI<1,C^BNX.Er0ekF>1GOmq0etI=0f1XANX.Er0etI?1,4dp1,1O>0f1X@NX.Bq0ekF?1, -=jq0ekF<1,LaBNX.Bq0etI@0f"ap0ekF=0f:[ANX.Eq1,:RA0en[o0etI<1,UdBNX.Er0ekF@0 -en[o1,1O=1,UdANX.Br0etI<2)1*s0etL>0ekO@NX.Bp1GU[>2)1*s0f(O=1,1XANX.?q0etI= -1bt's0ekI=1,1XANX.Bq1,:R>1bk!r0ekI>0etR@NX.Br0ekF=1bk!r0etL=1,:[ANX.Br0etI ->1GOmq0etL>0f(U@NX.Bp1GU[@1GOmq0f(O=1,C^ANX.?q0etI?1,=jq0ekI=1,C^ANX.Bq1,: -R@1,4dp0ekI>0f1X@NX.Br0ekF?1,4dp0etL=1,LaANX.Br0etI@0en[o0etL>0f:[@NX.Bp1G -U[B0en[o0f(O=1,UdANX.Bq1,1OA0en[o0ekI=1,UdANX.?q1,:R=2)1*s0ekL?0ekO?NX.?r0 -ekF<2)1*s0f1U?0etR?NX.?p1GLX>2)1*s0etO?0etR?NX.?q1,1O>1bk!r0f(R?0f(U?NX.?o -1bga@1bk!r0ekL?0f(U?NX.?r0ekF>1GOmq0f1U?0f1X?NX.?p1GLX@1GOmq0etO?0f1X?NX.? -q1,1O@1,4dp0f(R?0f:[?NX.?o1bgaB1,4dp0ekL?0f:[?NX.?r0ekF@0en[o0etO>1,Ud@NX. -Bp0f(O=2):0t0ekC<1,1XBNX.Eq0etL=2)1*s0ekC=0etRANX.Eq0f(O>1bk!r1,1L<1GLaBNX -.Bp0etL>1bt's1,1L>0f(U@NX.?o0ekI>1c(-t1GLU=1GUdANX.?o0etL?1Gb$s1GLU>1,C^@N -X.?o0f(O@1,Fpr1GLU?0f1X?NX.Bp0ekI?1GXsr1,1L=1,LaANX.Bp0f(OA0f"ap0ekC;1GgjC -NX.Eq0ekI@1,4dp0ekC<1,UdBNX.Eq0etLA0en[o1,:R?0ekO?NX.?o1,CX>2):0t0etI=1,1X -ANX.?p0f(O>1bt's1,1O?0etR?NX.Bq0ekI=2)1*s0ekF<1GLaBNX.Bq0etL>1bk!r0ekF=1,: -[ANX.Bq0f(O?1GOmq0ekF>0f(U@NX.?p0ekI>1bt's0etI=1,C^ANX.?p0f(O@1,=jq1,1O?0f -1X?NX.Bq0ekI?1GOmq0ekF<1G^gBNX.Bq0etL@1,4dp0ekF=1,LaANX.Bq0f(OA0en[o0ekF>0 -f:[@NX.?p0ekI@1,=jq0etI=1,UdANX.Bp1,:UB0en[o0etL?0ekO?NX.?q0etL=2)1*s0f(O? -0etR?NX.?o1GU^?2)1*s0ekI?0etR?NX.?p1,1R>2)1*s0etL>1,:[@NX.?p1,CX@1GOmq0f(O -=1GUdANX.?q0etL?1GOmq0ekI=1GUdANX.?q0f(O@1,4dp0ekI>1,C^@NX.?o1G^aB1,4dp0et -L=1G^gANX.?p1,:UA1,4dp0etL?0f:[?NX.?q0ekI@1,4dp0f(O>1,Ud@NX.?o1GL[B1,4dp0e -kI>1,Ud@NX.Bp0f1U>2)1*s0ekC=1,1XANX.?o0f1U?1bt's1,1L=1GLaANX.Bp0f(R?1bk!r1 -,1L?0f(U?NX.?o0ekL>2):0t0ekC<1GUdBNX.?o0f(R@1GXsr0ekC>0f1X@NX.Bp0ekL?1bk!r -1,1L=1G^gANX.Bp0f(RA1,4dp1,1L?0f:[?NX.?o0ekL@1GXsr0ekC<1GgjBNX.?o0f(RB0f"a -p0ekF?0ekO?NX.?p0f(R>2)1*s0etI?0etR?NX.?o1,:X?2)1*s0ekF>1,:[@NX.?o1,L^A1GO -mq0etI<1bgjBNX.?p0etO?1bk!r0etI>1,C^@NX.?p0f1UA1,4dp0ekF<1bpmBNX.?o1,:XA1G -Omq0ekF>1,La@NX.?o1,L^C0en[o0etI<1c$pBNX.?p0etOA1,4dp0etI>1,Ud@NX.?o0f1X?2 -)1*s0ekC?0etR?NX.?o0etR?2)1*s0ekC=1GUdANX.?o0f1XA1GOmq0ekC?0f1X?NX.?o0ekO@ -1bk!r0ekC<1c$pBNX.?o0f(UB1,4dp0ekC>1,Ud@NX.Bp0ekC<2)C6u1bg^>0etU@NX.?o0ekC -=1c13u1GLU=0f(XANX.Bp0ekC>1Gb$s1bg^>0f1[@NX.?o0ekC?1,P!s1GLU=0f:^ANX.Bp0ek -C@0f+gq1bg^>0fCa@NX.Bp1,1L<2DU9u1,:R=0etUANX.?o1,1L=2)C6u1GLX>0etU@NX.?p0e -kC=1c(-t1GU[>0f(X@NX.Bp1,1L>1bt's1,:R=0f1[ANX.?o1,1L?1Gb$s1GLX>0f1[@NX.?p0 -ekC?1,Fpr1GU[>0 f:^@N X.Bp1 ,1L@1 ,= jq1 ,:R=0f CaANX.? -o1,1LA0f+gq1GLX >0f Ca@NX .Bq1, 1L <2D L3t 0ekI -=0ekRANX.Br0ekC <2)1* s0 etL=0 etUA NX .Bp 1GLU> 2)1 *s0f( O=0f -(XANX.Bq1,1L>1b k!r0e kI= 0f( XANX .B r0e kC>1GO mq 0etL=0 f1[ -ANX.Bp1GLU@1GOm q0f(O =0f :^A N X.B q1, 1L@ 1,4dp0 ek I=0f:^ ANX -.Br0ekC@0en[o0e tL=0f CaA NX. Bp 1G LUB 0en [o0etO >0 ekR@NX .?q -1,1L=2)1*s0ekL> 0etU @NX .? r0 ekC =1b k!r 0etO ->0f(X@NX.?q1,1L ?1GO m q0 ek L>0 f1[ @NX. ?r0ek -C?1,4dp0etO>0f: ^@NX.? q1, 1 LA0 en [o0e kL> 0fCa@NX.Eq 0etI<2DL3t1 -,1L<1,1[BNX.Bp0 etI=2) :0t 0 ekC; 1,:^ CNX .Eq0ekF=2) 1*s0ekC<0f( -XBNX.Eq0etI>1bk !r1,1L <1, CaBN X.Bp 0et I?1GXsr0ek C;1,LdCNX.E -q0ekF?1GOmq0ekC <0f:^ BNX. Eq0et I@1, 4dp 1,1L<1,UgB NX.Bp0etIA0 -f"ap0etI=0ekRAN X.Bp1 ,:R=2 DL3t1 ,:R =1,1[ANX.? o1,1O=2DU9u -1,:R>0etU@NX.?o 1,:R>2) :0t0et I<1,: ^BN X.?p0etI>1 bt's1,1O>0f -(X@NX.Bq0ekF>1bk!r0ekF<1,CaBNX.Bq0etI?1GOmq0ekF=0f1[ANX.?p0ekF?1GXsr0etI=0 -f:^ANX.Bp1,:RA1,4dp1,:R=1,UgANX.?o1,1OA1,=jq1,:R>0fCa@NX.?o1,:RB0f"ap0f(O> -0ekR@NX.?o1GU[>2DL3t0etL=1,1[ANX.?p1,:R>2)1*s0f(O=1,:^ANX.?q0etI>1bk!r0ekI -=1,:^ANX.?o1GU[@1bk!r0etL=1,CaANX.?p1,:R@1GOmq0f(O=1,LdANX.?q0etI@1,4dp0ek -I=1,LdANX.?o1GU[B1,4dp0etL=1,UgANX.?p1,:RB0en[o0ekC=0ekRANX.Bp0etL=2DL3t1, -1L>0etU@NX.?o0ekI=2DSP\?'6usE+*d$FEo!5NW_'j0JSRj0JP79NW_'k0JJLi0JG49NW_'j0 -eeUj0JP:9NW_'k0en[k0JG17?'6usEc6/2BlnD=Efp`l1Pc$e!HNtsP,Wd]Bp(ZC1G<\iBcqGP -!KsFFD0p51EbTW@+DI!3I=$tW0JG17I?ITn1G<6JEc6.E@q0R&Bo!%XCkr@[9Th1bF(96/G9C+ -G!/L]4#CBrjEc6/b5)99'9TfI?FcnqE0p6@9!I^,%?'6usF(025>DNWB!Jgc4!/LZ3"+)\9P!5 -$bE+*j1ATD[0+E/H -% uk.co.terryburton.bwipp/code49 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp code49 0.0 2015050900 218104 234960 +%%BeginData: 1076 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/code49 { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /mode -1 def + /pos -1 def + /rows 0 def + /rowheight 8 def + /sepheight 1 def + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /mode mode cvi def + /pos pos cvi def + /rows rows cvi def + /rowheight rowheight cvi def + /sepheight sepheight cvi def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Convert input into bytes accounting for FNC characters + /s1 -1 def /s2 -2 def /fn1 -3 def /fn2 -4 def /fn3 -5 def /ns -6 def + /fncvals << + (FNC1) fn1 + (FNC2) fn2 + (FNC3) fn3 + >> def + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + % Character encodings + /charmap [ + (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) + (A) (B) (C) (D) (E) (F) (G) (H) (I) (J) (K) (L) (M) + (N) (O) (P) (Q) (R) (S) (T) (U) (V) (W) (X) (Y) (Z) + (-) (.) ( ) ($) (/) (+) (%) + s1 s2 fn1 fn2 fn3 ns + ] def + + % Invert charmap to give character to value map + /charvals 49 dict def + 0 1 48 { + /i exch def + charmap i get + dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals exch i put + } for + + % Shifted character encodings + /combos + [ (1 ) (1A) (1B) (1C) (1D) (1E) (1F) (1G) (1H) (1I) (1J) (1K) (1L) (1M) (1N) (1O) + (1P) (1Q) (1R) (1S) (1T) (1U) (1V) (1W) (1X) (1Y) (1Z) (11) (12) (13) (14) (15) + ( ) (16) (17) (18) ( $) ( %) (19) (10) (1-) (1.) (1$) ( +) (1/) ( -) ( .) ( /) + ( 0) ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) (1+) (21) (22) (23) (24) (25) + (26) ( A) ( B) ( C) ( D) ( E) ( F) ( G) ( H) ( I) ( J) ( K) ( L) ( M) ( N) ( O) + ( P) ( Q) ( R) ( S) ( T) ( U) ( V) ( W) ( X) ( Y) ( Z) (27) (28) (29) (20) (2-) + (2.) (2A) (2B) (2C) (2D) (2E) (2F) (2G) (2H) (2I) (2J) (2K) (2L) (2M) (2N) (2O) + (2P) (2Q) (2R) (2S) (2T) (2U) (2V) (2W) (2X) (2Y) (2Z) (2$) (2/) (2+) (2%) (2 ) + ] def + 0 1 127 { + /i exch def + combos i get dup 0 get /c1 exch def 1 get /c2 exch def + c1 49 eq { % s1 char + charvals i [ charvals s1 get charvals c2 get ] put + } if + c1 50 eq { % s2 char + charvals i [ charvals s2 get charvals c2 get ] put + } if + } for + + /encodealpha { + charvals exch get + dup type /arraytype ne {1 array astore} if + dup cws exch j exch putinterval + length j add /j exch def + } bind def + + /base48 { + 0 exch {48 sub exch 10 mul add} forall + [ 3 1 roll exch 1 sub {dup 48 mod exch 48 idiv} repeat ] + [ exch dup length 1 sub -1 0 {1 index exch get exch} for pop ] + dup cws exch j exch putinterval + length j add /j exch def + } bind def + + /encodenumeric { + /nums exch def + /pre nums length dup 5 mod dup 2 ne {sub} {sub 5 sub} ifelse def + 0 5 pre 1 sub {nums exch 5 getinterval 3 exch base48} for + /nums nums pre nums length pre sub getinterval def + nums length + dup 1 eq {nums i get encodealpha} if + dup 3 eq {2 nums base48} if + dup 4 eq {3 [49 48 nums aload pop] base48} if + 7 eq { + 3 [49 48 nums 0 4 getinterval aload pop] base48 + 2 nums 4 3 getinterval base48 + } if + } bind def + + % Pre-compute alphanumeric and numeric runlengths + /numericruns [ msglen {0} repeat 0 ] def + msglen 1 sub -1 0 { + /i exch def + msg i get + dup 48 ge exch 57 le and { + numericruns i numericruns i 1 add get 1 add put + } { + numericruns i 0 put + } ifelse + } for + + % Autoselect mode + mode -1 eq { + { % common exit + pos -1 ne {/mode 3 def exit} if + numericruns 0 get 5 ge {/mode 2 def exit} if + charvals msg 0 get get + dup type /arraytype ne {pop /mode 0 def exit} if + 0 get 43 eq {4} {5} ifelse /mode exch def + exit + } loop + } if + + /cws msglen 2 mul 1 add array def + /method (alpha) def /i -1 def /j -1 def + + % Handle start for each mode + mode 0 eq mode 1 eq or {/method (alpha) def /i 0 def /j 0 def} if + mode 2 eq {/method (numeric) def /i 0 def /j 0 def} if + mode 3 eq { + /posval [ + 12 22 + 13 23 33 + 14 24 34 44 + 15 25 35 45 55 + 16 26 36 46 56 66 + 17 27 37 47 57 67 77 + 18 28 38 48 58 68 78 88 + 19 29 39 49 59 69 79 89 99 + ] def + cws 0 0 1 43 {dup posval exch get pos ne {pop} if} for 1 add put + /method (alpha) def /i 0 def /j 1 def + } if + mode 4 eq mode 5 eq or { + cws 0 charvals msg 0 get get 1 get put + /method (alpha) def /i 1 def /j 1 def + } if + + % Encode remainder + { + i msglen eq {exit} if + { % not a loop but common exit point + method (alpha) eq { + numericruns i get 5 ge { + ns encodealpha + /method (numeric) def + exit + } if + msg i get encodealpha + /i i 1 add def + exit + } if + method (numeric) eq { + numericruns i get 5 lt { + ns encodealpha + /method (alpha) def + exit + } if + msg i numericruns i get getinterval encodenumeric + /i i numericruns i get add def + exit + } if + } loop + } loop + /cws cws 0 j getinterval def + + % Basic metrics for the each symbol + % r dcws + /metrics [ + [ 2 9 ] + [ 3 16 ] + [ 4 23 ] + [ 5 30 ] + [ 6 37 ] + [ 7 42 ] + [ 8 49 ] + ] def + + % Select metrics of an appropriate symbol + /urows rows def + /i 0 def + { % loop + /m metrics i get def + /r m 0 get def % Columns in symbol + /dcws m 1 get def % Data codewords in symbol + /okay true def + urows 0 ne urows r ne and {/okay false def} if + cws length dcws gt {/okay false def} if + okay {exit} if + /i i 1 add def + } loop + + % Extend cws to ncws codewords by addition of pad characters + /cws [ cws aload pop dcws cws length sub {48} repeat ] def + + % Populate code character array and add row check characters + /ccs r 8 mul array def + /j 0 def + 0 1 r 2 sub { + /i exch def + /cc cws j 7 getinterval def + ccs i 8 mul cc putinterval + ccs i 8 mul 7 add 0 cc {add} forall 49 mod put + /j j 7 add def + } for + j dcws lt { + ccs ccs length 8 sub cws j dcws j sub getinterval putinterval + } if + + % Place row count character + /cr7 r 2 sub 7 mul mode add def + ccs ccs length 2 sub cr7 put + + % Calculate the symbol check characters + [ 1 9 31 26 2 12 17 23 37 18 22 6 27 44 15 43 39 + 11 13 5 41 33 36 8 4 32 3 19 40 25 29 10 24 30 ] + dup [ exch 20 exch 0 32 getinterval aload pop ] /weightx exch def + dup [ exch 16 exch 1 32 getinterval aload pop ] /weighty exch def + [ exch 38 exch 2 32 getinterval aload pop ] /weightz exch def + /calccheck { + /weights exch def + /score 0 def + 0 1 r 1 sub 8 mul 2 idiv 1 sub { + /i exch def + ccs i 2 mul get 49 mul ccs i 2 mul 1 add get add + weights i 1 add get mul /score exch score add def + } for + score + } bind def + /lastrow ccs ccs length 8 sub 8 getinterval def + + % wr1 check character + r 7 ge { + cr7 weightz 0 get mul weightz calccheck add 2401 mod + dup 49 idiv exch 49 mod 2 array astore + lastrow 0 3 -1 roll putinterval + } if + /wr1 lastrow 0 get 49 mul lastrow 1 get add def + + % wr2 check character + cr7 weighty 0 get mul weighty calccheck add + wr1 weighty r 4 mul 3 sub get mul add + 2401 mod dup /wr2 exch def + dup 49 idiv exch 49 mod 2 array astore + lastrow 2 3 -1 roll putinterval + + % wr3 check character + cr7 weightx 0 get mul weightx calccheck add + wr1 weightx r 4 mul 3 sub get mul add + wr2 weightx r 4 mul 2 sub get mul add + 2401 mod + dup 49 idiv exch 49 mod 2 array astore + lastrow 4 3 -1 roll putinterval + + % Place last row check character + ccs ccs length 8 sub 7 getinterval 0 exch {add} forall 49 mod + ccs ccs length 1 sub 3 -1 roll put + + /patterns [ + [ % Even parity + (11521132) (25112131) (14212132) (25121221) (14221222) (12412132) (23321221) + (12421222) (21521221) (15112222) (15121312) (13312222) (24221311) (13321312) + (11512222) (22421311) (11521312) (25112311) (14212312) (23312311) (12412312) + (21512311) (16121131) (14321131) (12521131) (15212131) (15221221) (13412131) + (13421221) (11612131) (16112221) (16121311) (14312221) (14321311) (12512221) + (12521311) (15212311) (13412311) (11612311) (11131135) (31131133) (51131131) + (21122134) (41122132) (21131224) (41131222) (11113135) (31113133) (51113131) + (11122225) (31122223) (51122221) (11131315) (31131313) (51131311) (21113224) + (41113222) (21122314) (41122312) (11113315) (31113313) (51113311) (12131134) + (32131132) (21231133) (41231131) (22122133) (42122131) (11222134) (22131223) + (42131221) (11231224) (31231222) (12113134) (32113132) (12122224) (32122222) + (12131314) (32131312) (21231313) (41231311) (22113223) (42113221) (11213224) + (22122313) (42122311) (11222314) (31222312) (12113314) (32113312) (21213313) + (41213311) (13131133) (33131131) (22231132) (11331133) (31331131) (23122132) + (12222133) (23131222) (12231223) (32231221) (21331222) (13113133) (33113131) + (13122223) (33122221) (11313133) (13131313) (33131311) (11322223) (22231312) + (11331313) (31331311) (23113222) (12213223) (23122312) (12222313) (32222311) + (21322312) (13113313) (33113311) (22213312) (11313313) (31313311) (14131132) + (23231131) (12331132) (21431131) (24122131) (13222132) (24131221) (13231222) + (11422132) (22331221) (11431222) (14113132) (14122222) (12313132) (14131312) + (12322222) (23231311) (12331312) (21431311) (24113221) (13213222) (24122311) + (13222312) (11413222) (22322311) (11422312) (14113312) (23213311) (12313312) + (21413311) (15131131) (13331131) (14222131) (14231221) (12422131) (12431221) + (15113131) (15122221) (13313131) (15131311) (13322221) (11513131) (13331311) + (11522221) (14213221) (14222311) (12413221) (12422311) (15113311) (13313311) + (11513311) (11141134) (31141132) (21132133) (41132131) (21141223) (41141221) + (11123134) (31123132) (11132224) (31132222) (11141314) (31141312) (21114133) + (41114131) (21123223) (41123221) (21132313) (41132311) (11114224) (31114222) + (11123314) (31123312) (21114313) (41114311) (12141133) (32141131) (21241132) + (22132132) (11232133) (22141222) (11241223) (31241221) (12123133) (32123131) + (12132223) (32132221) (12141313) (32141311) (21241312) (22114132) (11214133) + (22123222) (11223223) (22132312) (11232313) (31232311) (12114223) (32114221) + (12123313) (32123311) (21223312) (22114312) (11214313) (31214311) (13141132) + (22241131) (11341132) (23132131) (12232132) (23141221) (12241222) (21341221) + (13123132) (13132222) (11323132) (13141312) (11332222) (22241311) (11341312) + (23114131) (12214132) (23123221) (12223222) (23132311) (12232312) (21332311) + (13114222) (13123312) (11314222) (22223311) (11323312) (23114311) (12214312) + (21314311) (14141131) (12341131) (13232131) (13241221) (11432131) (14123131) + (14132221) (12323131) (14141311) (12332221) (12341311) (13214131) (13223221) + (11414131) (13232311) (11423221) (11432311) (14114221) (14123311) (12314221) + (12323311) (13214311) (11414311) (11151133) (31151131) (21142132) (21151222) + (11133133) (31133131) (11142223) (31142221) (11151313) (31151311) (21124132) + (21133222) (21142312) (11115133) (31115131) (11124223) (31124221) (11133313) + (31133311) (21115222) (21124312) (12151132) (21251131) (22142131) (11242132) + (22151221) (11251222) (12133132) (12142222) (12151312) (21251311) (22124131) + (11224132) (22133221) (11233222) (22142311) (11242312) (12115132) (12124222) + (12133312) (21233311) (22115221) (11215222) (22124311) (11224312) (13151131) + (12242131) (12251221) (13133131) (13142221) (11333131) (13151311) (11342221) + (12224131) (12233221) (12242311) (13115131) (13124221) (11315131) (13133311) + (11324221) (11333311) (12215221) (12224311) (11161132) (21152131) (21161221) + (11143132) (11152222) (11161312) (21134131) (21143221) (21152311) (11125132) + (11134222) (11143312) (21116131) (21125221) (21134311) (12161131) (11252131) + (12143131) (12152221) (12161311) (11234131) (11243221) (11252311) (12125131) + (12134221) (12143311) (11216131) (11225221) (11234311) (11111236) (31111234) + (51111232) (21111325) (41111323) (61111321) (11111416) (31111414) (51111412) + (31211143) (51211141) (12111235) (32111233) (52111231) (21211234) (41211232) + (22111324) (42111322) (11211325) (31211323) (51211321) (12111415) (32111413) + (52111411) (21211414) (41211412) (12211144) (32211142) (21311143) (41311141) + (13111234) (33111232) (22211233) (42211231) (11311234) (31311232) (23111323) + (43111321) (12211324) (32211322) (21311323) (41311321) (13111414) (33111412) + (22211413) (42211411) (11311414) (31311412) (13211143) (33211141) (22311142) + (11411143) (31411141) (14111233) (34111231) (23211232) (12311233) (32311231) + (21411232) (24111322) (13211323) (33211321) (22311322) (11411323) (31411321) + (14111413) (34111411) (23211412) (12311413) (32311411) (21411412) (14211142) + (23311141) (12411142) (21511141) (15111232) (24211231) (13311232) (22411231) + (11511232) (25111321) (14211322) (23311321) (12411322) (21511321) (15111412) + (24211411) (13311412) (22411411) (11511412) (15211141) (13411141) (11611141) + (16111231) (14311231) (12511231) (15211321) (13411321) (11611321) (16111411) + (14311411) (12511411) (21121144) (41121142) (11112145) (31112143) (51112141) + (11121235) (31121233) (51121231) (21112234) (41112232) (21121324) (41121322) + (11112325) (31112323) (51112321) (11121415) (31121413) (51121411) (21112414) + (41112412) (22121143) (42121141) (11221144) (31221142) (12112144) (32112142) + (12121234) (32121232) (21221233) (41221231) (22112233) (42112231) (11212234) + (22121323) (42121321) (11221324) (31221322) (12112324) (32112322) (12121414) + (32121412) (21221413) (41221411) (22112413) (42112411) (11212414) (31212412) + (23121142) (12221143) (32221141) (21321142) (13112143) (33112141) (13121233) + (33121231) (11312143) (22221232) (11321233) (31321231) (23112232) (12212233) + (23121322) (12221323) (32221321) (21321322) (13112323) (33112321) (13121413) + (33121411) (11312323) (22221412) (11321413) (31321411) (23112412) (12212413) + (32212411) (21312412) (24121141) (13221142) (22321141) (11421142) (14112142) + (14121232) (12312142) (23221231) (12321232) (21421231) (24112231) (13212232) + (24121321) (13221322) (11412232) (22321321) (11421322) (14112322) (14121412) + (12312322) (23221411) (12321412) (21421411) (24112411) (13212412) (22312411) + (11412412) (14221141) (12421141) (15112141) (15121231) (13312141) (13321231) + (11512141) (11521231) (14212231) (14221321) (12412231) (12421321) (15112321) + (15121411) (13312321) (13321411) (11512321) (11521411) (14212411) (12412411) + (21131143) (41131141) (11122144) (31122142) (11131234) (31131232) (21113143) + (41113141) (21122233) (41122231) (21131323) (41131321) (11113234) (31113232) + (11122324) (31122322) (11131414) (31131412) (21113323) (41113321) (21122413) + (41122411) (11113414) (31113412) (22131142) (11231143) (31231141) (12122143) + (32122141) (12131233) (32131231) (21231232) (22113142) (11213143) (22122232) + (11222233) (22131322) (11231323) (31231321) (12113233) (32113231) (12122323) + (32122321) (12131413) (32131411) (21231412) (22113322) (11213323) (22122412) + (11222413) (31222411) (12113413) (32113411) (21213412) (23131141) (12231142) + (21331141) (13122142) (13131232) (11322142) (22231231) (11331232) (23113141) + (12213142) (23122231) (12222232) (23131321) (12231322) (21331321) (13113232) + (13122322) (11313232) (13131412) (11322322) (22231411) (11331412) (23113321) + (12213322) (23122411) (12222412) (21322411) (13113412) (22213411) (11313412) + (13231141) (11431141) (14122141) (14131231) (12322141) (12331231) (13213141) + (13222231) (11413141) (13231321) (11422231) (11431321) (14113231) (14122321) + (12313231) (14131411) (12322321) (12331411) (13213321) (13222411) (11413321) + (11422411) (14113411) (12313411) (21141142) (11132143) (31132141) (11141233) + (31141231) (21123142) (21132232) (21141322) (11114143) (31114141) (11123233) + (31123231) (11132323) (31132321) (11141413) (31141411) (21114232) (21123322) + (21132412) (11114323) (31114321) (11123413) (31123411) (22141141) (11241142) + (12132142) (12141232) (21241231) (22123141) (11223142) (22132231) (11232232) + (22141321) (11241322) (12114142) (12123232) (12132322) (12141412) (21241411) + (22114231) (11214232) (22123321) (11223322) (22132411) (11232412) (12114322) + (12123412) (21223411) (12241141) (13132141) (13141231) (11332141) (11341231) + (12223141) (12232231) (12241321) (13114141) (13123231) (11314141) (13132321) + (11323231) (13141411) (11332321) (11341411) (12214231) (12223321) (12232411) + (13114321) (13123411) (11314321) (11323411) (21151141) (11142142) (11151232) + (21133141) (21142231) (21151321) (11124142) (11133232) (11142322) (11151412) + (21115141) (21124231) (21133321) (21142411) (11115232) (11124322) (11133412) + (11251141) (12142141) (12151231) (11233141) (11242231) (11251321) (12124141) + (12133231) (12142321) (12151411) (11215141) (11224231) (11233321) (11242411) + (12115231) (12124321) (12133411) (11152141) (11161231) (11134141) (11143231) + (11152321) (11161411) (11116141) (11125231) (11134321) (11143411) (21111244) + (41111242) (11111335) (31111333) (51111331) (21111424) (41111422) (11111515) + (31111513) (51111511) (21211153) (41211151) (22111243) (42111241) (11211244) + (31211242) (12111334) (32111332) (21211333) (41211331) (22111423) (42111421) + (11211424) (31211422) (12111514) (32111512) (21211513) (41211511) (22211152) + (11311153) (31311151) (23111242) (12211243) (32211241) (21311242) (13111333) + (33111331) (22211332) (11311333) (31311331) (23111422) (12211423) (32211421) + (21311422) (13111513) (33111511) (22211512) (11311513) (31311511) (23211151) + (12311152) (21411151) (24111241) (13211242) (22311241) (11411242) (14111332) + (23211331) (12311332) (21411331) (24111421) (13211422) (22311421) (11411422) + (14111512) (23211511) (12311512) (21411511) (13311151) (11511151) (14211241) + (12411241) (15111331) (13311331) (11511331) (14211421) (12411421) (15111511) + (13311511) (11511511) (31121152) (21112153) (41112151) (21121243) (41121241) + (11112244) (31112242) (11121334) (31121332) (21112333) (41112331) (21121423) + (41121421) (11112424) (31112422) (11121514) (31121512) (21112513) (41112511) + (12121153) (32121151) (21221152) (22112152) (11212153) (22121242) (11221243) + (31221241) (12112243) (32112241) (12121333) (32121331) (21221332) (22112332) + (11212333) (22121422) (11221423) (31221421) (12112423) (32112421) (12121513) + (32121511) (21221512) (22112512) (11212513) (31212511) (13121152) (22221151) + (11321152) (23112151) (12212152) (23121241) (12221242) (21321241) (13112242) + (13121332) (11312242) (22221331) (11321332) (23112331) (12212332) (23121421) + (12221422) (21321421) (13112422) (13121512) (11312422) (22221511) (11321512) + (23112511) (12212512) (21312511) (14121151) (12321151) (13212151) (13221241) + (11412151) (11421241) (14112241) (14121331) (12312241) (12321331) (13212331) + (13221421) (11412331) (11421421) (14112421) (14121511) (12312421) (12321511) + (13212511) (11412511) (11131153) (31131151) (21122152) (21131242) (11113153) + (31113151) (11122243) (31122241) (11131333) (31131331) (21113242) (21122332) + (21131422) (11113333) (31113331) (11122423) (31122421) (11131513) (31131511) + (21113422) (21122512) (12131152) (21231151) (22122151) (11222152) (22131241) + (11231242) (12113152) (12122242) (12131332) (21231331) (22113241) (11213242) + (22122331) (11222332) (22131421) (11231422) (12113332) (12122422) (12131512) + (21231511) (22113421) (11213422) (22122511) (11222512) (13131151) (11331151) + (12222151) (12231241) (13113151) (13122241) (11313151) (13131331) (11322241) + (11331331) (12213241) (12222331) (12231421) (13113331) (13122421) (11313331) + (13131511) (11322421) (11331511) (12213421) (12222511) (11141152) (21132151) + (21141241) (11123152) (11132242) (11141332) (21114151) (21123241) (21132331) + (21141421) (11114242) (11123332) (11132422) (11141512) (21114331) (21123421) + (21132511) (12141151) (11232151) (11241241) (12123151) (12132241) (12141331) + (11214151) (11223241) (11232331) (11241421) (12114241) (12123331) (12132421) + (12141511) (11214331) (11223421) (11232511) (11151151) (11133151) (11142241) + (11151331) (11115151) (11124241) (11133331) (11142421) (11151511) (11111254) + (31111252) (21111343) (41111341) (11111434) (31111432) (21111523) (41111521) + (11111614) (31111612) (31211161) (12111253) (32111251) (21211252) (22111342) + (11211343) (31211341) (12111433) (32111431) (21211432) (22111522) (11211523) + (31211521) (12111613) (32111611) (21211612) (12211162) (21311161) (13111252) + (22211251) (11311252) (23111341) (12211342) (21311341) (13111432) (22211431) + (11311432) (23111521) (12211522) (21311521) (13111612) (22211611) (11311612) + (13211161) (11411161) (14111251) (12311251) (13211341) (11411341) (14111431) + (12311431) (13211521) (11411521) (14111611) (12311611) (21121162) (11112163) + (31112161) (11121253) (31121251) (21112252) (21121342) (11112343) (31112341) + (11121433) (31121431) (21112432) (21121522) (11112523) (31112521) (11121613) + (31121611) (22121161) (11221162) (12112162) (12121252) (21221251) (22112251) + (11212252) (22121341) (11221342) (12112342) (12121432) (21221431) (22112431) + (11212432) (22121521) (11221522) (12112522) (12121612) (21221611) (12221161) + (13112161) (13121251) (11312161) (11321251) (32121115) (52121113) (21221116) + (41221114) (61221112) (22112116) (42112114) (31212115) (51212113) (13121116) + (33121114) (22221115) (42221113) (11321116) (31321114) (51321112) (23112115) + (43112113) (12212116) (32212114) (52212112) (21312115) (41312113) (61312111) + (14121115) (34121113) (23221114) (43221112) (12321115) (32321113) (52321111) + (21421114) (41421112) (24112114) (13212115) (33212113) (22312114) (42312112) + (11412115) (31412113) (51412111) (15121114) (24221113) (13321114) (33321112) + (22421113) (42421111) (11521114) (31521112) (25112113) (14212114) (34212112) + (23312113) (43312111) (12412114) (32412112) (21512113) (41512111) (16121113) + (25221112) (14321113) (34321111) (23421112) (12521113) (32521111) (15212113) + (24312112) (13412113) (33412111) (22512112) (11612113) (31612111) (31131115) + (51131113) (21122116) (41122114) (61122112) (31113115) (51113113) (12131116) + (32131114) (52131112) (21231115) (41231113) (61231111) (22122115) (42122113) + (11222116) (31222114) (51222112) (12113116) (32113114) (52113112) (21213115) + (41213113) (61213111) (13131115) (33131113) (22231114) (42231112) (11331115) + (31331113) (51331111) (23122114) (43122112) (12222115) (32222113) (52222111) + (21322114) (41322112) (13113115) (33113113) (22213114) (42213112) (11313115) + (31313113) (51313111) (14131114) (34131112) (23231113) (43231111) (12331114) + (32331112) (21431113) (41431111) (24122113) (13222114) (33222112) (22322113) + (42322111) (11422114) (31422112) (14113114) (34113112) (23213113) (43213111) + (12313114) (32313112) (21413113) (41413111) (15131113) (24231112) (13331113) + (33331111) (22431112) (25122112) (14222113) (34222111) (23322112) (12422113) + (32422111) (21522112) (15113113) (24213112) (13313113) (33313111) (22413112) + (11513113) (31513111) (16131112) (25231111) (14331112) (23431111) (15222112) + (24322111) (13422112) (22522111) (16113112) (25213111) (14313112) (23413111) + (12513112) (21613111) (11141116) (31141114) (51141112) (21132115) (41132113) + (61132111) (11123116) (31123114) (51123112) (21114115) (41114113) (61114111) + (12141115) (32141113) (52141111) (21241114) (41241112) (22132114) (42132112) + (11232115) (31232113) (51232111) (12123115) (32123113) (52123111) (21223114) + (41223112) (22114114) (42114112) (11214115) (31214113) (51214111) (13141114) + (33141112) (22241113) (42241111) (11341114) (31341112) (23132113) (43132111) + (12232114) (32232112) (21332113) (41332111) (13123114) (33123112) (22223113) + (42223111) (11323114) (31323112) (23114113) (43114111) (12214114) (32214112) + (21314113) (41314111) (14141113) (34141111) (23241112) (12341113) (32341111) + (24132112) (13232113) (33232111) (22332112) (11432113) (31432111) (14123113) + (34123111) (23223112) (12323113) (32323111) (21423112) (24114112) (13214113) + (33214111) (22314112) (11414113) (31414111) (15141112) (24241111) (13341112) + (25132111) (14232112) (23332111) (12432112) (15123112) (24223111) (13323112) + (22423111) (11523112) (25114111) (14214112) (23314111) (12414112) (21514111) + (16141111) (14341111) (15232111) (13432111) (16123111) (14323111) (12523111) + (15214111) (13414111) (11614111) (11151115) (31151113) (51151111) (21142114) + (41142112) (11133115) (31133113) (51133111) (21124114) (41124112) (11115115) + (31115113) (51115111) (12151114) (32151112) (21251113) (41251111) (22142113) + (42142111) (11242114) (31242112) (12133114) (32133112) (21233113) (41233111) + (22124113) (42124111) (11224114) (31224112) (12115114) (32115112) (21215113) + (41215111) (13151113) (33151111) (22251112) (23142112) (12242113) (32242111) + (21342112) (13133113) (33133111) (22233112) (11333113) (31333111) (23124112) + (12224113) (32224111) (21324112) (13115113) (33115111) (22215112) (11315113) + (31315111) (14151112) (23251111) (24142111) (13242112) (22342111) (14133112) + (23233111) (12333112) (21433111) (24124111) (13224112) (22324111) (11424112) + (14115112) (23215111) (12315112) (21415111) (15151111) (14242111) (15133111) + (13333111) (14224111) (12424111) (15115111) (13315111) (11515111) (11161114) + (31161112) (21152113) (41152111) (11143114) (31143112) (21134113) (41134111) + (11125114) (31125112) (21116113) (41116111) (12161113) (32161111) (22152112) + (11252113) (31252111) (12143113) (32143111) (21243112) (22134112) (11234113) + (31234111) (12125113) (32125111) (21225112) (22116112) (11216113) (31216111) + (13161112) (23152111) (12252112) (13143112) (22243111) (11343112) (23134111) + (12234112) (21334111) (13125112) (22225111) (11325112) (23116111) (12216112) + (21316111) (14161111) (13252111) (14143111) (12343111) (13234111) (11434111) + (14125111) (12325111) (13216111) (11416111) (31111216) (51111214) (31211125) + (51211123) (32111215) (52111213) (21211216) (41211214) (61211212) (12211126) + (32211124) (52211122) (21311125) (41311123) (61311121) (13111216) (33111214) + (22211215) (42211213) (11311216) (31311214) (51311212) (13211125) (33211123) + (22311124) (42311122) (11411125) (31411123) (51411121) (14111215) (34111213) + (23211214) (43211212) (12311215) (32311213) (52311211) (21411214) (41411212) + (14211124) (34211122) (23311123) (43311121) (12411124) (32411122) (21511123) + (41511121) (15111214) (24211213) (13311214) (33311212) (22411213) (42411211) + (11511214) (31511212) (15211123) (24311122) (13411123) (33411121) (22511122) + (11611123) (31611121) (16111213) (25211212) (14311213) (34311211) (23411212) + (12511213) (32511211) (21611212) (21121126) (41121124) (61121122) (31112125) + (51112123) (31121215) (51121213) (21112216) (41112214) (61112212) (22121125) + (42121123) (11221126) (31221124) (51221122) (12112126) (32112124) (52112122) + (12121216) (32121214) (52121212) (21221215) (41221213) (61221211) (22112215) + (42112213) (11212216) (31212214) (51212212) (23121124) (43121122) (12221125) + (32221123) (52221121) (21321124) (41321122) (13112125) (33112123) (13121215) + (33121213) (11312125) (22221214) (42221212) (11321215) (31321213) (51321211) + (23112214) (43112212) (12212215) (32212213) (52212211) (21312214) (41312212) + (24121123) (13221124) (33221122) (22321123) (42321121) (11421124) (31421122) + (14112124) (34112122) (14121214) (34121212) (12312124) (23221213) (43221211) + (12321214) (32321212) (21421213) (41421211) (24112213) (13212214) (33212212) + (22312213) (42312211) (11412214) (31412212) (25121122) (14221123) (34221121) + (23321122) (12421123) (32421121) (21521122) (15112123) (15121213) (13312123) + (24221212) (13321213) (33321211) (11512123) (22421212) (11521213) (31521211) + (25112212) (14212213) (34212211) (23312212) (12412213) (32412211) (21512212) + (15221122) (24321121) (13421122) (22521121) (16112122) (16121212) (14312122) + (25221211) (14321212) (12512122) (23421211) (12521212) (15212212) (24312211) + (13412212) (22512211) (11612212) (21131125) (41131123) (61131121) (11122126) + (31122124) (51122122) (11131216) (31131214) (51131212) (21113125) (41113123) + (61113121) (21122215) (41122213) (61122211) (11113216) (31113214) (51113212) + (22131124) (42131122) (11231125) (31231123) (51231121) (12122125) (32122123) + (52122121) (12131215) (32131213) (52131211) (21231214) (41231212) (22113124) + (42113122) (11213125) (22122214) (42122212) (11222215) (31222213) (51222211) + (12113215) (32113213) (52113211) (21213214) (41213212) (23131123) (43131121) + (12231124) (32231122) (21331123) (41331121) (13122124) (33122122) (13131214) + (33131212) (11322124) (22231213) (42231211) (11331214) (31331212) (23113123) + (43113121) (12213124) (23122213) (43122211) (12222214) (32222212) (21322213) + (41322211) (13113214) (33113212) (22213213) (42213211) (11313214) (31313212) + (24131122) (13231123) (33231121) (22331122) (11431123) (31431121) (14122123) + (34122121) (14131213) (34131211) (12322123) (23231212) (12331213) (32331211) + (21431212) (24113122) (13213123) (24122212) (13222213) (33222211) (11413123) + (22322212) (11422213) (31422211) (14113213) (34113211) (23213212) (12313213) + (32313211) (21413212) (25131121) (14231122) (23331121) (12431122) (15122122) + (15131212) (13322122) (24231211) (13331212) (11522122) (22431211) (25113121) + (14213122) (25122211) (14222212) (12413122) (23322211) (12422212) (21522211) + (15113212) (24213211) (13313212) (22413211) (11513212) (15231121) (13431121) + (16122121) (16131211) (14322121) (14331211) (12522121) (15213121) (15222211) + (13413121) (13422211) (11613121) (16113211) (14313211) (12513211) (21141124) + (41141122) (11132125) (31132123) (51132121) (11141215) (31141213) (51141211) + (21123124) (41123122) (21132214) (41132212) (11114125) (31114123) (51114121) + (11123215) (31123213) (51123211) (21114214) (41114212) (22141123) (42141121) + (11241124) (31241122) (12132124) (32132122) (12141214) (32141212) (21241213) + (41241211) (22123123) (42123121) (11223124) (22132213) (42132211) (11232214) + (31232212) (12114124) (32114122) (12123214) (32123212) (21223213) (41223211) + (22114213) (42114211) (11214214) (31214212) (23141122) (12241123) (32241121) + (21341122) (13132123) (33132121) (13141213) (33141211) (11332123) (22241212) + (11341213) (31341211) (23123122) (12223123) (23132212) (12232213) (32232211) + (21332212) (13114123) (33114121) (13123213) (33123211) (11314123) (22223212) + (11323213) (31323211) (23114212) (12214213) (32214211) (21314212) (24141121) + (13241122) (22341121) (14132122) (14141212) (12332122) (23241211) (12341212) + (24123121) (13223122) (24132211) (13232212) (11423122) (22332211) (11432212) + (14114122) (14123212) (12314122) (23223211) (12323212) (21423211) (24114211) + (13214212) (22314211) (11414212) (14241121) (15132121) (15141211) (13332121) + (13341211) (14223121) (14232211) (12423121) (12432211) (15114121) (15123211) + (13314121) (13323211) (11514121) (11523211) (14214211) (12414211) (21151123) + (41151121) (11142124) (31142122) (11151214) (31151212) (21133123) (41133121) + (21142213) (41142211) (11124124) (31124122) (11133214) (31133212) (21115123) + (41115121) (21124213) (41124211) (11115214) (31115212) (22151122) (11251123) + (31251121) (12142123) (32142121) (12151213) (32151211) (21251212) (22133122) + (11233123) (22142212) (11242213) (31242211) (12124123) (32124121) (12133213) + (32133211) (21233212) (22115122) (11215123) (22124212) (11224213) (31224211) + (12115213) (32115211) (21215212) (23151121) (12251122) (13142122) (13151212) + (11342122) (22251211) (23133121) (12233122) (23142211) (12242212) (21342211) + (13124122) (13133212) (11324122) (22233211) (11333212) (23115121) (12215122) + (23124211) (12224212) (21324211) (13115212) (22215211) (11315212) (13251121) + (14142121) (14151211) (12342121) (13233121) (13242211) (11433121) (14124121) + (14133211) (12324121) (12333211) (13215121) (13224211) (11415121) (11424211) + (14115211) (12315211) (21161122) (11152123) (31152121) (11161213) (31161211) + (21143122) (21152212) (11134123) (31134121) (11143213) (31143211) (21125122) + (21134212) (11116123) (31116121) (11125213) (31125211) (22161121) (12152122) + (12161212) (22143121) (11243122) (22152211) (11252212) (12134122) (12143212) + (21243211) (22125121) (11225122) (22134211) (11234212) (12116122) (12125212) + (21225211) (13152121) (13161211) (12243121) (12252211) (13134121) (13143211) + (11334121) (11343211) (12225121) (12234211) (13116121) (13125211) (11316121) + (11325211) (21111226) (41111224) (61111222) (31111315) (51111313) (21211135) + (41211133) (61211131) (22111225) (42111223) (11211226) (31211224) (51211222) + (12111316) (32111314) (52111312) (21211315) (41211313) (61211311) (22211134) + (42211132) (11311135) (31311133) (51311131) (23111224) (43111222) (12211225) + (32211223) (52211221) (21311224) (41311222) (13111315) (33111313) (22211314) + (42211312) (11311315) (31311313) (51311311) (23211133) (43211131) (12311134) + (32311132) (21411133) (41411131) (24111223) (13211224) (33211222) (22311223) + (42311221) (11411224) (31411222) (14111314) (34111312) (23211313) (43211311) + (12311314) (32311312) (21411313) (41411311) (24211132) (13311133) (33311131) + (22411132) (11511133) (31511131) (25111222) (14211223) (34211221) (23311222) + (12411223) (32411221) (21511222) (15111313) (24211312) (13311313) (33311311) + (22411312) (11511313) (31511311) (25211131) (14311132) (23411131) (12511132) + (21611131) (15211222) (24311221) (13411222) (22511221) (11611222) (16111312) + (25211311) (14311312) (23411311) (12511312) (21611311) (31121134) (51121132) + (21112135) (41112133) (61112131) (21121225) (41121223) (61121221) (11112226) + (31112224) (51112222) (11121316) (31121314) (51121312) (21112315) (41112313) + (61112311) (12121135) (32121133) (52121131) (21221134) (41221132) (22112134) + (42112132) (11212135) (22121224) (42121222) (11221225) (31221223) (51221221) + (12112225) (32112223) (52112221) (12121315) (32121313) (52121311) (21221314) + (41221312) (22112314) (42112312) (11212315) (31212313) (51212311) (13121134) + (33121132) (22221133) (42221131) (11321134) (31321132) (23112133) (43112131) + (12212134) (23121223) (43121221) (12221224) (32221222) (21321223) (41321221) + (13112224) (33112222) (13121314) (33121312) (11312224) (22221313) (42221311) + (11321314) (31321312) (23112313) (43112311) (12212314) (32212312) (21312313) + (41312311) (14121133) (34121131) (23221132) (12321133) (32321131) (21421132) + (24112132) (13212133) (24121222) (13221223) (33221221) (11412133) (22321222) + (11421223) (31421221) (14112223) (34112221) (14121313) (34121311) (12312223) + (23221312) (12321313) (32321311) (21421312) (24112312) (13212313) (33212311) + (22312312) (11412313) (31412311) (15121132) (24221131) (13321132) (22421131) + ] [ % Odd parity + (22121116) (42121114) (31221115) (51221113) (32112115) (52112113) (21212116) + (41212114) (61212112) (23121115) (43121113) (12221116) (32221114) (52221112) + (21321115) (41321113) (61321111) (13112116) (33112114) (22212115) (42212113) + (11312116) (31312114) (51312112) (24121114) (13221115) (33221113) (22321114) + (42321112) (11421115) (31421113) (51421111) (14112115) (34112113) (23212114) + (43212112) (12312115) (32312113) (52312111) (21412114) (41412112) (25121113) + (14221114) (34221112) (23321113) (43321111) (12421114) (32421112) (21521113) + (41521111) (15112114) (24212113) (13312114) (33312112) (22412113) (42412111) + (11512114) (31512112) (15221113) (24321112) (13421113) (33421111) (22521112) + (16112113) (25212112) (14312113) (34312111) (23412112) (12512113) (32512111) + (21612112) (21131116) (41131114) (61131112) (31122115) (51122113) (21113116) + (41113114) (61113112) (22131115) (42131113) (11231116) (31231114) (51231112) + (12122116) (32122114) (52122112) (21222115) (41222113) (61222111) (22113115) + (42113113) (11213116) (31213114) (51213112) (23131114) (43131112) (12231115) + (32231113) (52231111) (21331114) (41331112) (13122115) (33122113) (22222114) + (42222112) (11322115) (31322113) (51322111) (23113114) (43113112) (12213115) + (32213113) (52213111) (21313114) (41313112) (24131113) (13231114) (33231112) + (22331113) (42331111) (11431114) (31431112) (14122114) (34122112) (23222113) + (43222111) (12322114) (32322112) (21422113) (41422111) (24113113) (13213114) + (33213112) (22313113) (42313111) (11413114) (31413112) (25131112) (14231113) + (34231111) (23331112) (12431113) (32431111) (15122113) (24222112) (13322113) + (33322111) (22422112) (11522113) (31522111) (25113112) (14213113) (34213111) + (23313112) (12413113) (32413111) (21513112) (15231112) (24331111) (13431112) + (16122112) (25222111) (14322112) (23422111) (12522112) (15213112) (24313111) + (13413112) (22513111) (11613112) (21141115) (41141113) (61141111) (11132116) + (31132114) (51132112) (21123115) (41123113) (61123111) (11114116) (31114114) + (51114112) (22141114) (42141112) (11241115) (31241113) (51241111) (12132115) + (32132113) (52132111) (21232114) (41232112) (22123114) (42123112) (11223115) + (31223113) (51223111) (12114115) (32114113) (52114111) (21214114) (41214112) + (23141113) (43141111) (12241114) (32241112) (21341113) (41341111) (13132114) + (33132112) (22232113) (42232111) (11332114) (31332112) (23123113) (43123111) + (12223114) (32223112) (21323113) (41323111) (13114114) (33114112) (22214113) + (42214111) (11314114) (31314112) (24141112) (13241113) (33241111) (22341112) + (14132113) (34132111) (23232112) (12332113) (32332111) (21432112) (24123112) + (13223113) (33223111) (22323112) (11423113) (31423111) (14114113) (34114111) + (23214112) (12314113) (32314111) (21414112) (25141111) (14241112) (23341111) + (15132112) (24232111) (13332112) (22432111) (25123111) (14223112) (23323111) + (12423112) (21523111) (15114112) (24214111) (13314112) (22414111) (11514112) + (15241111) (16132111) (14332111) (15223111) (13423111) (16114111) (14314111) + (12514111) (21151114) (41151112) (11142115) (31142113) (51142111) (21133114) + (41133112) (11124115) (31124113) (51124111) (21115114) (41115112) (22151113) + (42151111) (11251114) (31251112) (12142114) (32142112) (21242113) (41242111) + (22133113) (42133111) (11233114) (31233112) (12124114) (32124112) (21224113) + (41224111) (22115113) (42115111) (11215114) (31215112) (23151112) (12251113) + (32251111) (13142113) (33142111) (22242112) (11342113) (31342111) (23133112) + (12233113) (32233111) (21333112) (13124113) (33124111) (22224112) (11324113) + (31324111) (23115112) (12215113) (32215111) (21315112) (24151111) (13251112) + (14142112) (23242111) (12342112) (24133111) (13233112) (22333111) (11433112) + (14124112) (23224111) (12324112) (21424111) (24115111) (13215112) (22315111) + (11415112) (14251111) (15142111) (13342111) (14233111) (12433111) (15124111) + (13324111) (11524111) (14215111) (12415111) (21161113) (41161111) (11152114) + (31152112) (21143113) (41143111) (11134114) (31134112) (21125113) (41125111) + (11116114) (31116112) (22161112) (12152113) (32152111) (21252112) (22143112) + (11243113) (31243111) (12134113) (32134111) (21234112) (22125112) (11225113) + (31225111) (12116113) (32116111) (21216112) (23161111) (13152112) (22252111) + (23143111) (12243112) (21343111) (13134112) (22234111) (11334112) (23125111) + (12225112) (21325111) (13116112) (22216111) (11316112) (14152111) (13243111) + (14134111) (12334111) (13225111) (11425111) (14116111) (12316111) (41111215) + (61111213) (21211126) (41211124) (61211122) (22111216) (42111214) (31211215) + (51211213) (22211125) (42211123) (11311126) (31311124) (51311122) (23111215) + (43111213) (12211216) (32211214) (52211212) (21311215) (41311213) (61311211) + (23211124) (43211122) (12311125) (32311123) (52311121) (21411124) (41411122) + (24111214) (13211215) (33211213) (22311214) (42311212) (11411215) (31411213) + (51411211) (24211123) (13311124) (33311122) (22411123) (42411121) (11511124) + (31511122) (25111213) (14211214) (34211212) (23311213) (43311211) (12411214) + (32411212) (21511213) (41511211) (25211122) (14311123) (34311121) (23411122) + (12511123) (32511121) (21611122) (15211213) (24311212) (13411213) (33411211) + (22511212) (11611213) (31611211) (31121125) (51121123) (21112126) (41112124) + (61112122) (21121216) (41121214) (61121212) (31112215) (51112213) (12121126) + (32121124) (52121122) (21221125) (41221123) (61221121) (22112125) (42112123) + (11212126) (22121215) (42121213) (11221216) (31221214) (51221212) (12112216) + (32112214) (52112212) (21212215) (41212213) (61212211) (13121125) (33121123) + (22221124) (42221122) (11321125) (31321123) (51321121) (23112124) (43112122) + (12212125) (23121214) (43121212) (12221215) (32221213) (52221211) (21321214) + (41321212) (13112215) (33112213) (22212214) (42212212) (11312215) (31312213) + (51312211) (14121124) (34121122) (23221123) (43221121) (12321124) (32321122) + (21421123) (41421121) (24112123) (13212124) (24121213) (13221214) (33221212) + (11412124) (22321213) (42321211) (11421214) (31421212) (14112214) (34112212) + (23212213) (43212211) (12312214) (32312212) (21412213) (41412211) (15121123) + (24221122) (13321123) (33321121) (22421122) (11521123) (31521121) (25112122) + (14212123) (25121212) (14221213) (34221211) (12412123) (23321212) (12421213) + (32421211) (21521212) (15112213) (24212212) (13312213) (33312211) (22412212) + (11512213) (31512211) (16121122) (25221121) (14321122) (23421121) (12521122) + (15212122) (15221212) (13412122) (24321211) (13421212) (11612122) (22521211) + (16112212) (25212211) (14312212) (23412211) (12512212) (21612211) (11131126) + (31131124) (51131122) (21122125) (41122123) (61122121) (21131215) (41131213) + (61131211) (11113126) (31113124) (51113122) (11122216) (31122214) (51122212) + (21113215) (41113213) (61113211) (12131125) (32131123) (52131121) (21231124) + (41231122) (22122124) (42122122) (11222125) (22131214) (42131212) (11231215) + (31231213) (51231211) (12113125) (32113123) (52113121) (12122215) (32122213) + (52122211) (21222214) (41222212) (22113214) (42113212) (11213215) (31213213) + (51213211) (13131124) (33131122) (22231123) (42231121) (11331124) (31331122) + (23122123) (43122121) (12222124) (23131213) (43131211) (12231214) (32231212) + (21331213) (41331211) (13113124) (33113122) (13122214) (33122212) (11313124) + (22222213) (42222211) (11322214) (31322212) (23113213) (43113211) (12213214) + (32213212) (21313213) (41313211) (14131123) (34131121) (23231122) (12331123) + (32331121) (21431122) (24122122) (13222123) (24131212) (13231213) (33231211) + (11422123) (22331212) (11431213) (31431211) (14113123) (34113121) (14122213) + (34122211) (12313123) (23222212) (12322213) (32322211) (21422212) (24113212) + (13213213) (33213211) (22313212) (11413213) (31413211) (15131122) (24231121) + (13331122) (22431121) (25122121) (14222122) (25131211) (14231212) (12422122) + (23331211) (12431212) (15113122) (15122212) (13313122) (24222211) (13322212) + (11513122) (22422211) (11522212) (25113211) (14213212) (23313211) (12413212) + (21513211) (16131121) (14331121) (15222121) (15231211) (13422121) (13431211) + (16113121) (16122211) (14313121) (14322211) (12513121) (12522211) (15213211) + (13413211) (11613211) (11141125) (31141123) (51141121) (21132124) (41132122) + (21141214) (41141212) (11123125) (31123123) (51123121) (11132215) (31132213) + (51132211) (21114124) (41114122) (21123214) (41123212) (11114215) (31114213) + (51114211) (12141124) (32141122) (21241123) (41241121) (22132123) (42132121) + (11232124) (22141213) (42141211) (11241214) (31241212) (12123124) (32123122) + (12132214) (32132212) (21232213) (41232211) (22114123) (42114121) (11214124) + (22123213) (42123211) (11223214) (31223212) (12114214) (32114212) (21214213) + (41214211) (13141123) (33141121) (22241122) (11341123) (31341121) (23132122) + (12232123) (23141212) (12241213) (32241211) (21341212) (13123123) (33123121) + (13132213) (33132211) (11323123) (22232212) (11332213) (31332211) (23114122) + (12214123) (23123212) (12223213) (32223211) (21323212) (13114213) (33114211) + (22214212) (11314213) (31314211) (14141122) (23241121) (12341122) (24132121) + (13232122) (24141211) (13241212) (11432122) (22341211) (14123122) (14132212) + (12323122) (23232211) (12332212) (21432211) (24114121) (13214122) (24123211) + (13223212) (11414122) (22323211) (11423212) (14114212) (23214211) (12314212) + (21414211) (15141121) (13341121) (14232121) (14241211) (12432121) (15123121) + (15132211) (13323121) (13332211) (11523121) (14214121) (14223211) (12414121) + (12423211) (15114211) (13314211) (11514211) (11151124) (31151122) (21142123) + (41142121) (21151213) (41151211) (11133124) (31133122) (11142214) (31142212) + (21124123) (41124121) (21133213) (41133211) (11115124) (31115122) (11124214) + (31124212) (21115213) (41115211) (12151123) (32151121) (21251122) (22142122) + (11242123) (22151212) (11251213) (31251211) (12133123) (32133121) (12142213) + (32142211) (21242212) (22124122) (11224123) (22133212) (11233213) (31233211) + (12115123) (32115121) (12124213) (32124211) (21224212) (22115212) (11215213) + (31215211) (13151122) (22251121) (23142121) (12242122) (23151211) (12251212) + (13133122) (13142212) (11333122) (22242211) (11342212) (23124121) (12224122) + (23133211) (12233212) (21333211) (13115122) (13124212) (11315122) (22224211) + (11324212) (23115211) (12215212) (21315211) (14151121) (13242121) (13251211) + (14133121) (14142211) (12333121) (12342211) (13224121) (13233211) (11424121) + (11433211) (14115121) (14124211) (12315121) (12324211) (13215211) (11415211) + (11161123) (31161121) (21152122) (21161212) (11143123) (31143121) (11152213) + (31152211) (21134122) (21143212) (11125123) (31125121) (11134213) (31134211) + (21116122) (21125212) (12161122) (22152121) (11252122) (22161211) (12143122) + (12152212) (21252211) (22134121) (11234122) (22143211) (11243212) (12125122) + (12134212) (21234211) (22116121) (11216122) (22125211) (11225212) (13161121) + (12252121) (13143121) (13152211) (11343121) (12234121) (12243211) (13125121) + (13134211) (11325121) (11334211) (12216121) (12225211) (31111225) (51111223) + (21111316) (41111314) (61111312) (31211134) (51211132) (12111226) (32111224) + (52111222) (21211225) (41211223) (61211221) (22111315) (42111313) (11211316) + (31211314) (51211312) (12211135) (32211133) (52211131) (21311134) (41311132) + (13111225) (33111223) (22211224) (42211222) (11311225) (31311223) (51311221) + (23111314) (43111312) (12211315) (32211313) (52211311) (21311314) (41311312) + (13211134) (33211132) (22311133) (42311131) (11411134) (31411132) (14111224) + (34111222) (23211223) (43211221) (12311224) (32311222) (21411223) (41411221) + (24111313) (13211314) (33211312) (22311313) (42311311) (11411314) (31411312) + (14211133) (34211131) (23311132) (12411133) (32411131) (21511132) (15111223) + (24211222) (13311223) (33311221) (22411222) (11511223) (31511221) (25111312) + (14211313) (34211311) (23311312) (12411313) (32411311) (21511312) (15211132) + (24311131) (13411132) (22511131) (11611132) (16111222) (25211221) (14311222) + (23411221) (12511222) (21611221) (15211312) (24311311) (13411312) (22511311) + (11611312) (21121135) (41121133) (61121131) (11112136) (31112134) (51112132) + (11121226) (31121224) (51121222) (21112225) (41112223) (61112221) (21121315) + (41121313) (61121311) (11112316) (31112314) (51112312) (22121134) (42121132) + (11221135) (31221133) (51221131) (12112135) (32112133) (52112131) (12121225) + (32121223) (52121221) (21221224) (41221222) (22112224) (42112222) (11212225) + (22121314) (42121312) (11221315) (31221313) (51221311) (12112315) (32112313) + (52112311) (21212314) (41212312) (23121133) (43121131) (12221134) (32221132) + (21321133) (41321131) (13112134) (33112132) (13121224) (33121222) (11312134) + (22221223) (42221221) (11321224) (31321222) (23112223) (43112221) (12212224) + (23121313) (43121311) (12221314) (32221312) (21321313) (41321311) (13112314) + (33112312) (22212313) (42212311) (11312314) (31312312) (24121132) (13221133) + (33221131) (22321132) (11421133) (31421131) (14112133) (34112131) (14121223) + (34121221) (12312133) (23221222) (12321223) (32321221) (21421222) (24112222) + (13212223) (24121312) (13221313) (33221311) (11412223) (22321312) (11421313) + (31421311) (14112313) (34112311) (23212312) (12312313) (32312311) (21412312) + (25121131) (14221132) (23321131) (12421132) (21521131) (15112132) (15121222) + (13312132) (24221221) (13321222) (11512132) (22421221) (11521222) (25112221) + (14212222) (25121311) (14221312) (12412222) (23321311) (12421312) (21521311) + (15112312) (24212311) (13312312) (22412311) (11512312) (15221131) (13421131) + (16112131) (16121221) (14312131) (14321221) (12512131) (12521221) (15212221) + (15221311) (13412221) (13421311) (11612221) (16112311) (14312311) (12512311) + (21131134) (41131132) (11122135) (31122133) (51122131) (11131225) (31131223) + (51131221) (21113134) (41113132) (21122224) (41122222) (21131314) (41131312) + (11113225) (31113223) (51113221) (11122315) (31122313) (51122311) (21113314) + (41113312) (22131133) (42131131) (11231134) (31231132) (12122134) (32122132) + (12131224) (32131222) (21231223) (41231221) (22113133) (42113131) (11213134) + (22122223) (42122221) (11222224) (22131313) (42131311) (11231314) (31231312) + (12113224) (32113222) (12122314) (32122312) (21222313) (41222311) (22113313) + (42113311) (11213314) (31213312) (23131132) (12231133) (32231131) (21331132) + (13122133) (33122131) (13131223) (33131221) (11322133) (22231222) (11331223) + (31331221) (23113132) (12213133) (23122222) (12222223) (23131312) (12231313) + (32231311) (21331312) (13113223) (33113221) (13122313) (33122311) (11313223) + (22222312) (11322313) (31322311) (23113312) (12213313) (32213311) (21313312) + (24131131) (13231132) (22331131) (11431132) (14122132) (14131222) (12322132) + (23231221) (12331222) (21431221) (24113131) (13213132) (24122221) (13222222) + (24131311) (11413132) (13231312) (11422222) (22331311) (11431312) (14113222) + (14122312) (12313222) (23222311) (12322312) (21422311) (24113311) (13213312) + (22313311) (11413312) (14231131) (12431131) (15122131) (15131221) (13322131) + (13331221) (11522131) (14213131) (14222221) (12413131) (14231311) (12422221) + (12431311) (15113221) (15122311) (13313221) (13322311) (11513221) (11522311) + (14213311) (12413311) (21141133) (41141131) (11132134) (31132132) (11141224) + (31141222) (21123133) (41123131) (21132223) (41132221) (21141313) (41141311) + (11114134) (31114132) (11123224) (31123222) (11132314) (31132312) (21114223) + (41114221) (21123313) (41123311) (11114314) (31114312) (22141132) (11241133) + (31241131) (12132133) (32132131) (12141223) (32141221) (21241222) (22123132) + (11223133) (22132222) (11232223) (22141312) (11241313) (31241311) (12114133) + (32114131) (12123223) (32123221) (12132313) (32132311) (21232312) (22114222) + (11214223) (22123312) (11223313) (31223311) (12114313) (32114311) (21214312) + (23141131) (12241132) (21341131) (13132132) (13141222) (11332132) (22241221) + (11341222) (23123131) (12223132) (23132221) (12232222) (23141311) (12241312) + (21341311) (13114132) (13123222) (11314132) (13132312) (11323222) (22232311) + (11332312) (23114221) (12214222) (23123311) (12223312) (21323311) (13114312) + (22214311) (11314312) (13241131) (14132131) (14141221) (12332131) (12341221) + (13223131) (13232221) (11423131) (13241311) (11432221) (14114131) (14123221) + (12314131) (14132311) (12323221) (12332311) (13214221) (13223311) (11414221) + (11423311) (14114311) (12314311) (21151132) (11142133) (31142131) (11151223) + (31151221) (21133132) (21142222) (21151312) (11124133) (31124131) (11133223) + (31133221) (11142313) (31142311) (21115132) (21124222) (21133312) (11115223) + (31115221) (11124313) (31124311) (22151131) (11251132) (12142132) (12151222) + (21251221) (22133131) (11233132) (22142221) (11242222) (22151311) (11251312) + (12124132) (12133222) (12142312) (21242311) (22115131) (11215132) (22124221) + (11224222) (22133311) (11233312) (12115222) (12124312) (21224311) (12251131) + (13142131) (13151221) (11342131) (12233131) (12242221) (12251311) (13124131) + (13133221) (11324131) (13142311) (11333221) (11342311) (12215131) (12224221) + (12233311) (13115221) (13124311) (11315221) (11324311) (21161131) (11152132) + (11161222) (21143131) (21152221) (21161311) (11134132) (11143222) (11152312) + (21125131) (21134221) (21143311) (11116132) (11125222) (11134312) (12152131) + (12161221) (11243131) (11252221) (12134131) (12143221) (12152311) (11225131) + (11234221) (11243311) (12116131) (12125221) (12134311) (21111235) (41111233) + (61111231) (11111326) (31111324) (51111322) (21111415) (41111413) (61111411) + (21211144) (41211142) (22111234) (42111232) (11211235) (31211233) (51211231) + (12111325) (32111323) (52111321) (21211324) (41211322) (22111414) (42111412) + (11211415) (31211413) (51211411) (22211143) (42211141) (11311144) (31311142) + (23111233) (43111231) (12211234) (32211232) (21311233) (41311231) (13111324) + (33111322) (22211323) (42211321) (11311324) (31311322) (23111413) (43111411) + (12211414) (32211412) (21311413) (41311411) (23211142) (12311143) (32311141) + (21411142) (24111232) (13211233) (33211231) (22311232) (11411233) (31411231) + (14111323) (34111321) (23211322) (12311323) (32311321) (21411322) (24111412) + (13211413) (33211411) (22311412) (11411413) (31411411) (24211141) (13311142) + (22411141) (11511142) (25111231) (14211232) (23311231) (12411232) (21511231) + (15111322) (24211321) (13311322) (22411321) (11511322) (25111411) (14211412) + (23311411) (12411412) (21511411) (14311141) (12511141) (15211231) (13411231) + (11611231) (16111321) (14311321) (12511321) (15211411) (13411411) (11611411) + (31121143) (51121141) (21112144) (41112142) (21121234) (41121232) (11112235) + (31112233) (51112231) (11121325) (31121323) (51121321) (21112324) (41112322) + (21121414) (41121412) (11112415) (31112413) (51112411) (12121144) (32121142) + (21221143) (41221141) (22112143) (42112141) (11212144) (22121233) (42121231) + (11221234) (31221232) (12112234) (32112232) (12121324) (32121322) (21221323) + (41221321) (22112323) (42112321) (11212324) (22121413) (42121411) (11221414) + (31221412) (12112414) (32112412) (21212413) (41212411) (13121143) (33121141) + (22221142) (11321143) (31321141) (23112142) (12212143) (23121232) (12221233) + (32221231) (21321232) (13112233) (33112231) (13121323) (33121321) (11312233) + (22221322) (11321323) (31321321) (23112322) (12212323) (23121412) (12221413) + (32221411) (21321412) (13112413) (33112411) (22212412) (11312413) (31312411) + (14121142) (23221141) (12321142) (21421141) (24112141) (13212142) (24121231) + (13221232) (11412142) (22321231) (11421232) (14112232) (14121322) (12312232) + (23221321) (12321322) (21421321) (24112321) (13212322) (24121411) (13221412) + (11412322) (22321411) (11421412) (14112412) (23212411) (12312412) (21412411) + (15121141) (13321141) (11521141) (14212141) (14221231) (12412141) (12421231) + (15112231) (15121321) (13312231) (13321321) (11512231) (11521321) (14212321) + (14221411) (12412321) (12421411) (15112411) (13312411) (11512411) (11131144) + (31131142) (21122143) (41122141) (21131233) (41131231) (11113144) (31113142) + (11122234) (31122232) (11131324) (31131322) (21113233) (41113231) (21122323) + (41122321) (21131413) (41131411) (11113324) (31113322) (11122414) (31122412) + (21113413) (41113411) (12131143) (32131141) (21231142) (22122142) (11222143) + (22131232) (11231233) (31231231) (12113143) (32113141) (12122233) (32122231) + (12131323) (32131321) (21231322) (22113232) (11213233) (22122322) (11222323) + (22131412) (11231413) (31231411) (12113323) (32113321) (12122413) (32122411) + (21222412) (22113412) (11213413) (31213411) (13131142) (22231141) (11331142) + (23122141) (12222142) (23131231) (12231232) (21331231) (13113142) (13122232) + (11313142) (13131322) (11322232) (22231321) (11331322) (23113231) (12213232) + (23122321) (12222322) (23131411) (12231412) (21331411) (13113322) (13122412) + (11313322) (22222411) (11322412) (23113411) (12213412) (21313411) (14131141) + (12331141) (13222141) (13231231) (11422141) (11431231) (14113141) (14122231) + (12313141) (14131321) (12322231) (12331321) (13213231) (13222321) (11413231) + (13231411) (11422321) (11431411) (14113321) (14122411) (12313321) (12322411) + (13213411) (11413411) (11141143) (31141141) (21132142) (21141232) (11123143) + (31123141) (11132233) (31132231) (11141323) (31141321) (21114142) (21123232) + (21132322) (21141412) (11114233) (31114231) (11123323) (31123321) (11132413) + (31132411) (21114322) (21123412) (12141142) (21241141) (22132141) (11232142) + (22141231) (11241232) (12123142) (12132232) (12141322) (21241321) (22114141) + (11214142) (22123231) (11223232) (22132321) (11232322) (22141411) (11241412) + (12114232) (12123322) (12132412) (21232411) (22114321) (11214322) (22123411) + (11223412) (13141141) (11341141) (12232141) (12241231) (13123141) (13132231) + (11323141) (13141321) (11332231) (11341321) (12214141) (12223231) (12232321) + (12241411) (13114231) (13123321) (11314231) (13132411) (11323321) (11332411) + (12214321) (12223411) (11151142) (21142141) (21151231) (11133142) (11142232) + (11151322) (21124141) (21133231) (21142321) (21151411) (11115142) (11124232) + (11133322) (11142412) (21115231) (21124321) (21133411) (12151141) (11242141) + (11251231) (12133141) (12142231) (12151321) (11224141) (11233231) (11242321) + (11251411) (12115141) (12124231) (12133321) (12142411) (11215231) (11224321) + (11233411) (11161141) (11143141) (11152231) (11161321) (11125141) (11134231) + (11143321) (11152411) (11111245) (31111243) (51111241) (21111334) (41111332) + (11111425) (31111423) (51111421) (21111514) (41111512) (31211152) (12111244) + (32111242) (21211243) (41211241) (22111333) (42111331) (11211334) (31211332) + (12111424) (32111422) (21211423) (41211421) (22111513) (42111511) (11211514) + (31211512) (12211153) (32211151) (21311152) (13111243) (33111241) (22211242) + (11311243) (31311241) (23111332) (12211333) (32211331) (21311332) (13111423) + (33111421) (22211422) (11311423) (31311421) (23111512) (12211513) (32211511) + (21311512) (13211152) (22311151) (11411152) (14111242) (23211241) (12311242) + (21411241) (24111331) (13211332) (22311331) (11411332) (14111422) (23211421) + (12311422) (21411421) (24111511) (13211512) (22311511) (11411512) (14211151) + (12411151) (15111241) (13311241) (11511241) (14211331) (12411331) (15111421) + (13311421) (11511421) (14211511) (12411511) (21121153) (41121151) (11112154) + (31112152) (11121244) (31121242) (21112243) (41112241) (21121333) (41121331) + (11112334) (31112332) (11121424) (31121422) (21112423) (41112421) (21121513) + (41121511) (11112514) (31112512) (22121152) (11221153) (31221151) (12112153) + (32112151) (12121243) (32121241) (21221242) (22112242) (11212243) (22121332) + (11221333) (31221331) (12112333) (32112331) (12121423) (32121421) (21221422) + (22112422) (11212423) (22121512) (11221513) (31221511) (12112513) (32112511) + (21212512) (23121151) (12221152) (21321151) (13112152) (13121242) (11312152) + (22221241) (11321242) (23112241) (12212242) (23121331) (12221332) (21321331) + (13112332) (13121422) (11312332) (22221421) (11321422) (23112421) (12212422) + (23121511) (12221512) (21321511) (13112512) (22212511) (11312512) (13221151) + (11421151) (14112151) (14121241) (12312151) (12321241) (13212241) (13221331) + (11412241) (11421331) (14112331) (14121421) (12312331) (12321421) (13212421) + (13221511) (11412421) (11421511) (14112511) (12312511) (21131152) (11122153) + (31122151) (11131243) (31131241) (21113152) (21122242) (21131332) (11113243) + (31113241) (11122333) (31122331) (11131423) (31131421) (21113332) (21122422) + (21131512) (11113423) (31113421) (11122513) (31122511) (22131151) (11231152) + (12122152) (12131242) (21231241) (22113151) (11213152) (22122241) (11222242) + (22131331) (11231332) (12113242) (12122332) (12131422) (21231421) (22113331) + (11213332) (22122421) (11222422) (22131511) (11231512) (12113422) (12122512) + (21222511) (12231151) (13122151) (13131241) (11322151) (11331241) (12213151) + (12222241) (12231331) (13113241) (13122331) (11313241) (13131421) (11322331) + (11331421) (12213331) (12222421) (12231511) (13113421) (13122511) (11313421) + (11322511) (21141151) (11132152) (11141242) (21123151) (21132241) (21141331) + (11114152) (11123242) (11132332) (11141422) (21114241) (21123331) (21132421) + (21141511) (11114332) (11123422) (11132512) (11241151) (12132151) (12141241) + (11223151) (11232241) (11241331) (12114151) (12123241) (12132331) (12141421) + (11214241) (11223331) (11232421) (11241511) (12114331) (12123421) (12132511) + (11142151) (11151241) (11124151) (11133241) (11142331) (11151421) (11115241) + (11124331) (11133421) (11142511) (21111253) (41111251) (11111344) (31111342) + (21111433) (41111431) (11111524) (31111522) (21111613) (41111611) (21211162) + (22111252) (11211253) (31211251) (12111343) (32111341) (21211342) (22111432) + (11211433) (31211431) (12111523) (32111521) (21211522) (22111612) (11211613) + (31211611) (22211161) (11311162) (23111251) (12211252) (21311251) (13111342) + (22211341) (11311342) (23111431) (12211432) (21311431) (13111522) (22211521) + (11311522) (23111611) (12211612) (21311611) (12311161) (13211251) (11411251) + (14111341) (12311341) (13211431) (11411431) (14111521) (12311521) (13211611) + (11411611) (31121161) (21112162) (21121252) (11112253) (31112251) (11121343) + (31121341) (21112342) (21121432) (11112433) (31112431) (11121523) (31121521) + (21112522) (21121612) (12121162) (21221161) (22112161) (11212162) (22121251) + (11221252) (12112252) (12121342) (21221341) (22112341) (11212342) (22121431) + (11221432) (12112432) (12121522) (21221521) (22112521) (11212522) (22121611) + (11221612) (13121161) (11321161) (12212161) (12221251) (13112251) (13121341) + (11312251) (11321341) (12212341) (12221431) (13112431) (13121521) (11312431) + (11321521) (12212521) (12221611) (11131162) (21122161) (21131251) (11113162) + ] + ] def + + /parity [ + (1001) (0101) (1100) (0011) (1010) (0110) (1111) (0000) + ] def + + % Derive the bits for each row + /rowbits r array def + 0 1 r 1 sub { + /i exch def + /p i r 1 sub ne {parity i get} {(0000)} ifelse def + /ccrow ccs i 8 mul 8 getinterval def + /scrow [ + 0 2 7 {ccrow exch 2 getinterval aload pop exch 49 mul add} for + ] def + /sbs [ + 10 1 1 + 0 1 3 { + /j exch def + patterns p j get 48 sub get scrow j get get {48 sub} forall + } for + 4 1 + ] def + mark + 1 sbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall + counttomark 1 sub array astore exch pop exch pop + rowbits i 3 -1 roll put + } for + + % Populate the bitmap + /pixs [ + 81 sepheight mul {1} repeat + 0 1 r 2 sub { + /i exch def + rowheight {rowbits i get aload pop} repeat + sepheight {10 {0} repeat 70 {1} repeat 0} repeat + } for + rowheight {rowbits r 1 sub get aload pop} repeat + 81 sepheight mul {1} repeat + ] def + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx 81 + /pixy pixs length 81 idiv + /height pixs length 81 idiv 72 div + /width 81 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/code49 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER code49-- @@ -4534,49 +12288,157 @@ E+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: 3493 % --EXOP: height=0.5 includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp channelcode 0.0 0 0 0 -%%BeginData: 41 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\E,[F>BOPd rASbjpA7\)9 -A4($=Ea`I"ATEeW6YKnGDImW,6Z6LH+Dl7BF"HllC"-Qc -B!KmJ$AU&<!g6ZA"HllMG]mM3F_)\;@<-!lFHSe605kuT+BsX(L]N -;=H]g@0P!5%%P!3?<5*AQeP"8l7!+T\NDMS@WCm%JT1OYEc06Uc?F_)\=@;L'tL]NY>Ou%NL<. -0p0P')q1P')q1I?G)'1GASu!rA7^o[04S[,@r!2k+C1-dB -l7EsF_#&nBOt[hHS95SA25q`>9I,m>p*>o>p*@-%>YFK"GdA?",Ht`+BsX2L]WA@L]`GGL_,@F -L]Ld(>DNZC&;UpS#`'1N"GdD@!f.#9!F6gPL]N;7L_,@TL]`GAL]WAp*@-'Sm< -V(5NEU%u:XM"c*;;#`&eC'o2sJ#D`Cd+BsX'L^&YJL^8e;L]`G>L]iMBL^f.OL]WA:L_>LLL]L -d(>p*TbEbo<)P"UroL]E52L]M$pFCC>AL]N[q@5*AQp!KsFF5&G4K1,G(WP"UsSOo -]uo8;J(FC5;t'DI[TqAM7P,ARfM=5*@^MP#O)U@WNYr+D,>*A7]eE!g7\:@<>q@!g7\9BOt[hO -ogeh?'6usFEhmM@UX:nAT!Y;Ou%moL]LsnEbo<)L]N[9IurF-:!g!KmJ ->!g6H.BOtmjBQSZcK3^->@WNYr+EM"5P%'4JOo^@?P#?X_!.C#_>q^;EF%`IG]\1=Ch[ -O"NWs!)DKKH105kfO+E)4@Bl@m1+?ht3A8c@-A9)+&P&N'-Eb0-)Bl7KjEfsCb3IR&#Ou"b$BO -PdrASbjpA7^o`P%64gCG'+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbF -DtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/channelcode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp channelcode 0.0 2015050900 68302 68105 +%%BeginData: 149 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/channelcode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /shortfinder false def + /includetext false def + /includecheck false def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + + % Validate the input + barcode length 2 lt barcode length 7 gt or { + /bwipp.channelcodeBadLength (Channel Code must be 2 to 7 digits) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.channelcodeBadCharacter (Channel Code must contain only digits) //raiseerror exec + } if + } forall + barcode cvi [ 26 292 3493 44072 576688 7742862 ] barcode length 2 sub get gt { + /bwipp.channelcodeTooBig (The Channel Code value is too big for the number of channels) //raiseerror exec + } if + + /nextb { + dup + dup s exch get exch + dup b exch 1 sub get exch + dup s exch 1 sub get exch + b exch 2 sub get exch + add add add 4 gt {1} {2} ifelse + 1 index chan 2 add lt { + dup 1 4 index { + b 3 index 2 index put + 3 index exch sub 1 add 4 index 3 index 1 add nexts + } for + } { + dup 3 index le { + b 2 index 4 index put + value target eq { + /out [ + 3 1 10 {dup s exch get exch b exch get} for + ] 0 chan 2 mul getinterval def + } if + /value value 1 add def + } if + } ifelse + pop pop pop pop + } bind def + + /nexts { + dup chan 2 add lt {1} {1 index} ifelse 1 3 index { + s 2 index 2 index put + 2 index exch sub 1 add 3 index 2 index nextb + } for + pop pop pop + } bind def + + /encode { + /chan exch def + /target exch def + /value 0 def + /out -1 def + /b [ 1 1 1 0 0 0 0 0 0 0 0 ] def + /s [ 0 1 1 0 0 0 0 0 0 0 0 ] def + chan dup 3 nexts + out + } bind def + + /barlen barcode length def + + % Determine finder + /finder shortfinder { [ 1 1 1 1 1 ] } { [ 1 1 1 1 1 1 1 1 1 ] } ifelse def + + % Encode the main data + /data barcode cvi barlen 1 add encode def + + % Determine check data + /check [] def + includecheck { + /mod23 [ + [] [] + [ 13 12 4 9 3 1 ] + [ 13 2 12 3 18 16 4 1 ] + [ 11 16 17 8 20 4 10 2 5 1 ] + [ 1 4 16 18 3 12 2 8 9 13 6 1 ] + [ 20 16 22 13 15 12 5 4 8 9 21 3 7 1 ] + [ 2 6 18 8 1 3 9 4 12 13 16 2 6 18 8 1 ] + ] barlen get def + 0 + 0 1 data length 1 sub { + dup data exch get 1 sub exch mod23 exch get mul add + } for + 23 mod 3 encode /check exch def + } if + + % Construct the symbol + /sbs [ + finder aload pop + data aload pop + check aload pop + ] def + + % Create the human readable text + /txt barlen array def + 0 1 barlen 1 sub { + /i exch def + txt i [barcode i 1 getinterval 0 0 () 0] put + } for + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt txt + /textxalign (center) + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/channelcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER channelcode-- @@ -4587,36 +12449,101 @@ DtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> % --EXAM: 11099 % --EXOP: inkspread=-0.25 showborder borderleft=0 borderright=0 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp flattermarken 0.0 0 0 0 -%%BeginData: 28 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%52X=FD 5Z2F- 8_M 1G< 3 GEa s#u AWf 6?1G<9 WD KKE0@< Wi+ -@;L!rOu"b*DI[L* A7]jo G]Y '?@ ;L !r Ou" b5A U&KFD5Z2F *j(NAmoLsAW -f3'P!FGY<0B5(@Z mRN0o c8tP )XR(F _-_! H]f tD5*C&O5*@ ^MH]ft&Eckr -V1OYEdI?J0)*g/N :DfBf 4Df0W Z5*@^ MP# Q@=FD5Z2F* j'+I?I/TFCf -]=AoDR/+EV1>FCo H/FHS5= 1GE,[FACghF-ATDWrEbf6(6=FClBOPpi@ru:&N[@53@-FCAm$+E).6Gp$X3B5)I/0/%?SBldisEcQ)=P!=AX<.0p$04f$2F!+\I">DMa30"+q0ekVI"> -DSc2N@no1GLbI">DYe1l_\m2)-nI">D_g16)Jk2_d%I">Dei0TH8i3A<-mOu"b#@<,jk@<-FL$ -8F:l1c70M3&r[U1G<3GEbo<)+C\c"@rGmhP%'S106:TD+C\c"Ch7L?"HmSaV33VfFEhmM@UX:n -AT!Y;Ou%moL]LsnEbo<)L]N[FCf]=F(or3+C1.TI?I,`4>1_dDD*Y`ASu9IurF-:!g!KmJ>!g6H.BOtmjBQSZcK3^->@WNYr+ -EM"5P%'4JOo^@?P#?X_!.C#_>q^;EF%QOF -% uk.co.terryburton.bwipp/flattermarken 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp flattermarken 0.0 2015050900 59248 59148 +%%BeginData: 93 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/flattermarken { + + 20 dict begin % Confine variable to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 0.3 def + + % Validate the input + barcode { + dup 48 lt exch 57 gt or { + /bwipp.flattermarkenBadCharacter (Flattermarken must contain only digits) //raiseerror exec + } if + } forall + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + % Validate the input + barcode { + dup 48 lt exch 57 gt or { + /bwipp.flattermarkenBadCharacter (Flattermarken must contain only digits) //raiseerror exec + } if + } forall + + % Create an array containing the character mappings + /encs + [ (0018) (0117) (0216) (0315) (0414) (0513) (0612) (0711) (0810) + (0900) + ] def + + % Create a string of the available characters + /barchars (1234567890) def + + /barlen barcode length def % Length of the code + + /sbs barlen 4 mul string def + /txt barlen array def + + 0 1 barlen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + barcode i 1 getinterval barchars exch search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + /enc encs indx get def % Get the indxth encoding + sbs i 4 mul enc putinterval % Put encoded digit into sbs + txt i [barcode i 1 getinterval i 9 mul textyoffset textfont textsize] put + } for + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + /txt txt + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/flattermarken dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER flattermarken-- @@ -4627,26 +12554,60 @@ Ch[cu@<.N1Ou[rR%[&V$Ao(mtFCfK0@<--pDNZuBA1r(@/n8fPFCfK5H"(o:FDl%L@WuO*E$/\ % --EXAM: 331132131313411122131311333213114131131221323 % --EXOP: height=0.5 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp raw 0.0 0 0 0 -%%BeginData: 18 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4 aVtcOu 8C 3DfBf4 Df0 -WCP,i2'Cia0N4aW >WI? IQm 30 Ia 6V3 3Qn !Bl U*FE -2M8P!+/T/Wr;\Fc nqO1 O XV 5/ Tc# UAW eitP #ZpnA -We*t3A5;iFD5Z2F -8_M1O YEc D fBf 4D f0WC Ou% NL8M=agBkM +$+D>>#B4uC -M09S,#@<,jrA7^+ N3/B;P As, ? 63Kd 4%Ed KHK GA2#8/okBE 6=FClBOPpi@ -ru:&N[%G1G9CaFF *&O7Df 0Z* Bl5& 3DJX S@A 8,[jFE8QZ+ EVNE3A3%+@; -0doATDg0EfrY8P# Qjm8N ]*gE b0,A0 61WA Ch[ cu@<+#B@WN Yr+C\c"@rGm -hH\aA=WI9q$>q]Z #F!+[ 0@UX: eDe*F B@Y b&J!Jgf?;L <(gBkM+$I?K -4g04JC3+Bost@<, jrA7^p5 L]NY>L ]W`;H \_Z MP(R$nDfBe @DfBf4Df0V= -5!C*"Df0Z-Eaa0TE%`kbASu -% uk.co.terryburton.bwipp/raw 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp raw 0.0 2015050900 55514 55371 +%%BeginData: 52 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/raw { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /height 1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + + % Validate input + barcode { + dup 49 lt exch 57 gt or { + /bwipp.rawBadCharacter (Raw must contain only digits 1 to 9) //raiseerror exec + } if + } forall + + % Return the arguments + << + /ren //renlinear + /sbs [barcode {48 sub} forall] + /bhs [barcode length 1 add 2 idiv {height} repeat] + /bbs [barcode length 1 add 2 idiv {0} repeat] + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/raw dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER raw-- @@ -4657,32 +12618,84 @@ L@WuO*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: FATDAFTDAD % --EXOP: % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp daft 0.0 0 0 0 -%%BeginData: 24 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4a Vt cOu8C3 DfB -f4Df0WCP,i2'Cia 0N4a W>W I? IQ m30 Ia6 V33 Qn!B -lU*FE2M8P!+/T/W r;\F c nq O1 OXV 5/T c#UA WeitP -#ZpnAWe*t3A5;iF D5Z2F- 8_M 1 OYE cD fBf4 Df0 WCOu%NL8M= agBkM+$+D>> -#B4uCM09S,#@<,j rA7^+N 3/B t cD3@ )G3/ Bk` D3@)G3/C%e D3@)=<0D*]" -HinN"FDe2GA2#8/ nAC&F@ 'DH 6YKn K@:O CjE fMe@5t4frD 09oA+Cf>-FC -Am$+E).6Gp$U1@< ,ddFC fK6+ @Ib'5 qF-J +CT .u+B1!IEa` ['AS#n&DfV" -*I?IQXP"@<9@<-0 qDBNC sEas# uAWgM c1G <3HF!+q#Eb o<)OpR:-04J -U9+C\c"Ch7LI$'I *#!/LYb @<-0qD MS=VW I$: 4P!5$b04f$ 2+C\c"@rGmh -+DHW4P"_#pASu"1_dDD*Y`A -SuGL]N[D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDt -YuCM@[!I?IP~> -% uk.co.terryburton.bwipp/daft 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp daft 0.0 2015050900 58288 58222 +%%BeginData: 76 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/daft { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /height 0.175 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /height height cvr def + + barcode { + dup 68 ne exch dup 65 ne exch dup 70 ne exch 84 ne and and and { + /bwipp.daftBadCharacter (DAFT must contain only characters D, A, F and T) //raiseerror exec + } if + } forall + + /barlen barcode length def + + /bbs barlen array def + /bhs barlen array def + 0 1 barlen 1 sub { + /i exch def + /enc barcode i 1 getinterval def + enc (D) eq { + bbs i 0 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (A) eq { + bbs i 3 height mul 8 div put + bhs i 5 height mul 8 div put + } if + enc (F) eq { + bbs i 0 height mul 8 div put + bhs i 8 height mul 8 div put + } if + enc (T) eq { + bbs i 3 height mul 8 div put + bhs i 2 height mul 8 div put + } if + } for + + % Return the arguments + << + /ren //renlinear + /bbs bbs + /bhs bhs + /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/daft dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER daft-- @@ -4693,34 +12706,80 @@ YuCM@[!I?IP~> % --EXAM: fima % --EXOP: backgroundcolor=DD000011 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp symbol 0.0 0 0 0 -%%BeginData: 26 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4 aV tc Ou8 C3D fBf4Df 0W CP,i2' Cia -0N4aW>WI?IQm30I a6V3 3Qn !B lU *FE 2M8 P!+ /T/W -r;\FcnqO1OXV5/T c#UA W ei tP #Zp nAW e*t3 A5;iF -D5Z2F-8_M1OYEcD fBf4Df 0WC O u%N L8 M>.1 D.7 F"F!*S-04n p8@='YK@WNY -rMEh^Q!/a#Q!!%m A&-)]f 5r8 Q AMEh ^Q!/ a'! !!%mA&-)]f 5S*nqMEh^Q! -*taD04JU9+Bs^f+ 92D!59 Kq+ ME`3 `!/` u`! !%m@+92CIO u"b#@WNYrL] -E52L]E52L]C_D1O YDr04 np8@ XBbL@ WNYr MEh ^Q!/a%o!!% mA&-)]f5S*n -qMEh^Q!/a%_!!%m A&-)] f5S*n qMEh^ Q!/ a%o!!%mA&- )]9Ou"b#BQG -;#ME`3`!/`u`!!% m@+92D! 59Kq+M E`3`! /`u `!!$;f1G<3 HF!+\C!/LW2 -!/LW2!/LV\Ou%NL%PMF.D.@oGF(025>DbZW!!%mA&-)]f5S*nqMEoeo!/a#Q!!%mAfDko/5S*n -qMEoeo!/a#Q!!%mA&-)]f5S*nq?'6us@VBg*>DbWf!!%m@+92D!59Kq+ME`3`!/`u`!!%m@+92 -CIOu"b#@WNYrL]E52L]E52L]E52?'7!lOq'-WBl.C-06:TD+Bs^g&-)]f5S*nqMEh^Q!/a#Q!! - %mA&-)]f5hH&:MEh^Q!/a%o!!%mA&-)]f5S*nqMEh^Q!/a#Q!!%mA&-)]9Ou"b#BQG;#ME`3` -!/`u`!!%m@+92D!59Kq+ME`3`!/`u`!!%m@+92CIOu"b#@WNYrL]E52L]E52L]E52L]C_D1OYD -r5!G,cF*VV3DesJ;@UX:eDe*FB@$5JU04K->E,[FNH#7#/CfP@gDJs`:;gE4hDetFR%@W-((+C\c"@rGmhP"Us&4? -P9;ASs.SEb0-)Bl7KjE\DKCF!,O5F"_!9F!+q*F"_!3F!+q$F"_HNF -% uk.co.terryburton.bwipp/symbol 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp symbol 0.0 2015050900 58044 57965 +%%BeginData: 72 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/symbol { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /symbols << + /fima { + /sbs [2.25 2.25 2.25 11.25 2.25 11.25 2.25 2.25 2.25] def + /bhs [.625 .625 .625 .625 .625] def + /bbs [0 0 0 0 0] def + } bind + /fimb { + /sbs [2.25 6.75 2.25 2.25 2.25 6.25 2.25 2.25 2.25 6.75 2.25] def + /bhs [.625 .625 .625 .625 .625 .625] def + /bbs [0 0 0 0 0 0] def + } bind + /fimc { + /sbs [2.25 2.25 2.25 6.75 2.25 6.75 2.25 6.75 2.25 2.25 2.25] def + /bhs [.625 .625 .625 .625 .625 .625] def + /bbs [0 0 0 0 0 0] def + } bind + /fimd { + /sbs [2.25 2.25 2.25 2.25 2.25 6.75 2.25 6.75 2.25 2.25 2.25 2.25 2.25] def + /bhs [.625 .625 .625 .625 .625 .625 .625] def + /bbs [0 0 0 0 0 0 0] def + } bind + >> def + + % Valiate input + symbols barcode known not { + /bwipp.symbolUnknownSymbol (Unknown symbol name provided) //raiseerror exec + } if + + symbols barcode get exec + + % Return the arguments + << + /ren //renlinear + /sbs sbs + /bhs bhs + /bbs bbs + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/symbol dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER symbol-- @@ -4729,779 +12788,2758 @@ E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> % --REQUIRES preamble raiseerror renmatrix-- % --DESC: PDF417 % --EXAM: This is PDF417 -% --EXOP: +% --EXOP: columns=2 % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp pdf417 0.0 0 0 0 -%%BeginData: 310 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ DP!5 %OP! 5$b I=%,/FE2M8 Ou%NL+F _u#;O t;bP 061 uTF!,LAGB8 ouOu"b3Dg-& -@Cige?Dg-&@Cikg nOu%& cEcYf =05Yc C+C \c"@rGmhP% 'TNOu"b+L]E -So@UX:eDe*F+NWE ILNI-gJ D0'?Q5 &-6EP 'N4 "C6AUR!KmI :C6CcD1QlmD -3/@Qj"-Q?@/8]H@P!3W:!KsFF5*C/R30Ia,"-TX>"-Pj29RV8N3,N_LP!3WD5*C2S@VV&,05?Y -6Ou"b#@<,jrA7Zm#F(^:/C6D8R1Qk"OP#ZpnAUT_@Eaa0=04\L5@s;u:@UX:eDe*FB@Zh%\1G< -Hu!0T,kC5;kQ1OEgY@UX:eDe*FB@Zim$P!FGY<%ha*+C\c"@rGmh+DHW4Oo^@@P"_#iOu$WWFC -TN9+DN$/GER2(Bcq,G"HieK1GCkr+T!KmbP -1Lsp9@sP&+T9Ebo<)L^'#WOo^@>Oo^^POu$W -WFCTN9L]E/3Kp$\/P#[;9IB`Eas#uAKY]C#*NeY"-N\@"-Q?)I?I0-Ou"b-F(986>9Ia'@ -WR\6P')pOL&h:;Cm"g^5(in:!!&0uOo^@@H]g@C",)hPP!4U&KT]5]P(R&'1G<6^F,1!_$'I)\ -F(99I!0TulF(99I!0U!0!BcN]Oo]':F,0sT!g6Z?",)hPP'D]`KT]5LF(99I!Kp*=!GumfF,0g -Z983M!P&-9^D0'3.L]NZ3L&jE"Cm"g/GB8QBL]W`AL'**lC6Egr",)h8Cia*-L]W`4Oo]E@@rm -G+P"UTFP&-9^D0'3.L]NZ3L&uphCm"g9F(99I!g632!BcN]Oo]':F,0mR!g6Z?",)hPP'D]`KT -]5LF(99I"-Q9IB`Eas#uAKYGjEbo< -)+ED%1P,WJ5D3@S>I?I0-P'MJ=<+BEJHS8oQOu%NL<+Bi_F_u#;L]NZ2@rH1+D/OEN*g0 -rp"FDe3+Cf>+F_u#;Ou%NL<%i87D'3VW!Jgc>!Fp%aF_u#;OuAI7Ot;bPEZfC@GB8pZEc6/CLg -#sMOp$+bEZfC@GB8p'I?IQML]`fPHS9Dq"-PHgP#O)O@OpR:-@s+Dlo8Oo\c0DBNeZWJCSDN;qH\_ZMP(R&'1Pc'f!Gd$8Bp(ZC1Lk?7AnH*,Bcpo(AS,Oq+DHW4P,XU -;P'C\s!KsFP"UN3Tl_DeDe3NmF!,6@C6GQP!KsFF99O+ -G"/1lmP,XTFL'+-4C6EgiP":"a88a4aDBN_X!IKth@s9I.'!!1WcKE)&/KE)&F^4ZIeUqhW -`!Rbq?!!2=HKE)%K@"\L\dPum[!D#J/!!/lLKE)&$*/":m80EQc!MgQc!!,V%KE)%Mi.M(2ds- -NG!U7=O!!,d/KE)%ME.e2ldl`9`!DHmS!!/rVKE)&%*eXLo9JD,"!N$ii!!,jQKE)%NG_?%te% -UJ8!D[Te!!/u[KE)$J3.q84V]LKk!Ddrn!!0"3KE)$K4G3\8:EG/h!M[A_!!1JdKE)&:]S$7cU -0rWS!RWl[!!2;TKE)$@5_K+&;1 -#aTaZSS!C@'F!!/btKE)$?@"\L\Tt#aU!RT\V!!,G@KE)%HS:gkC6PtIV!MPO,!!,FqKE)$?#( -usWU#(G&!CMm#!!,ANKE)%GY_2uWcs25(!C7i]!!/a[KE)&":4rTJ5nJ\L!MGC)!!,@kKE)%GL -4fO-5m2i@!CR!!22+KE)&D -^4ZIePe_qP!QoA7!!21DKE)%;@"\L\auG%S!TbAU!!+K5KE)%;0SBE,-m40C!LDYs!!18fKE)& -7^4ZIe/AQo=!L@\X!!18*KE)$(@"\L\Q8jNt!A#pX!!+VfKE)$*i.M(2Q["/`!R&31!!+]kKE) - %>4G3\8/i\La!A5@F!!+`tKE)%>^4ZIe00Fmf!AD0?!!1fhKE)&?E.e2lp:Q%Y!SUq7!!2IHK -E)&HSqI(EZp99E!ST5\!!2I,KE)%[+G9^qg),JC!UUAM!!0Gtk!H4Q_!!1b\KE)&>\:ah_p0NCP!O=tD!!1b,KE)&>S:gkCZ64f#!SJ9KE)&*N._03Ym?!_!SE-[!!0>-KE)%X!e^OS+[C\\!KaO=!!1/GKE)$_5_K+<+WuF':6!?cuI!!+4pKE)$]fRs5*@E -aB)!Fa!$!!1_'KE)&*-A2@"YX4!C!K\jc!!+35KE)$\aFjNo@)R]u!FWct!!.tmKE)%lE.e2li -k0pE!K(9Gfm!!*kNKE)%2E.e2l -`Opj(!>]'r!!/!;KE)%lSqI(E(,1CA!K.qN!!*iPKE)#g%"nT](N>$-!K4UD!!*lqKE)%2SqI( -E(EA).!>iD%!!*n-KE)%t@"\L\k.$'E!V9WN!!/NRKE)%t0SBE,k+%))!Lb-a!!1=]KE)&8Ne@ -B5RLk,P!R2%+!!/MoKE)%t#(usWM-tu:!Q;L$!!2(cKE)%B@"\L\M(jS_!Q:L]!!+uCKE)#c+G -9^qc('Fe!Q:"O!!+u#KE)%B(k_kiM%#%;!B(LB!!*]!!1$pKE)$3@ -"\L\'/5(>!R9JS!!,#4KE)%BS:gkCM2m5h!B1jK!!*`AKE)$3%"nT]'=`\q!K#Zd!!,$gKE)#d -S:gkC2k5O$!>CKH!!*biKE)$3hLkk0h*?Vn!Ud1F!!2h!KE)&/+G9^qm[/Y-!V]?B!!1meKE)& -@N._03h$AZ6!Ub\q!!1mYKE)%@5_K+-@p!I"g&!!*Z5KE)#bY_2uWLtmX`!Ags5!!*\!KE)%/c@c/uGHc`#!Ag*r!!/M5 -KE)$sR"PG?]?Z'0!>1'>!!+m1KE)#bgk5Y.1YdW`!>3V1!!.+[P -!!.0/KE)&.:kSfLmOX"k!Sg5!!!2L7KE)&.7"bO@gd6Yo!LQ]:!!1:pKE)%_d"DB"Qq2l1!R)m -D!!0UNKE)&.AqU-b\AX%#!LQ3,!!0UHKE)#a:kSfLLb+2Z!AMlR!!*X%KE)%/-A2@"ER9@=!AM -TJ!!/I!KE)$maFjNo\E8GE!>%SN!!.)XKE)$,_LqmiEPdA/!ANkn!!.*+KE)$mk(E^8mM:HU!S -elP!!1:ZKE)%?,_Q-uQm.1`!>$Z4!!+ceKE)$lk_&p:&0cc-!AIu9!!.d]KE)#[5_K+ssP!!.H5KE)$5k(E^8Hfft]!UhFi!!2h[KE -)&A,_Q-umimDb!R<*H!!26uKE)&0BS6?dml#h!!T%@?!!1@hKE)&0@Y=^^N$s>Z!QGn.!!/U'K -E)%3,_Q-u]]b"K!M!\R!!/$&KE)%cjFdL6S77-O!PIEF!!*?RKE)%+(5)Yg(heR&!K8pi!!,(C -KE)#iA:sp`#U4p%!Im!!PEN-!!0`QKE)#i1kYi03-9fR!I46i!!.?8KE)#V5_K+<"X&Hu!J6\l!!* -67KE)#V#_W0Y"U'JY!.!!*3nKE)%)-A2@"*RKH>!=[&&!!*3jKE)#naFjNo%)df!!?>%-E3C!?Lp*@)!!2b#KE)&L\:ah_l9L"&!VJ."!!2qdKE)&<+G9^qob`>^!W%h0!!2?rKE -)&G%"nT]l3N%C!VHYM!!2?fKE)&=@"\L\osfYT!W(Z+!!1Y9KE)&=0SBE,opg[8!S/BH!!2C&K -E)&GNe@B5ee!K7!UC/I!!1XVKE)&=#(usWec^X+!S:_4!!2DqKE)&GhLkk0Y!@X?!S9#Y!!2DU -KE)%U+G9^qf,0/@!UGc!!!056KE)&)%"nT]XpB[\!S7O/!!05*KE)%V@"\L\f=6J6!UJTq!!-C -kKE)%V0SBE,f:7Ko!F?n%!!08?KE)&)Ne@B5?4_bi!Nuob!!-C3KE)%V#(usW?XSNe!O'"d!!1 -^.KE)$[0SBE,YFL7G!FH[s!!09`KE)$[%"nT]?atah!O(@5!!-GsKE)$[Ne@B5ks0n%!VEUL!! -2q$KE)&;+G9^qoU(:3!W#QE!!2l!!1OOKE)&%!e^OSVa,n8!Rn9+ -!!2?>KE)%N+G9^qe!Pdg!U7m_!!/u/KE)&%N._03V[.qU!RldV!!/u#KE)%N!e^OS:I'R5!N3/ -T!!1R(KE)$K+G9^qVjN,;!Ro>I!!,k,KE)%NN._03:C)UR!N1[*!!,juKE)$KY_2uWVqcq*!Df -)9!!0"CKE)$KN._03:PON&!DhL(!!,m@KE)&:TS*:GoN6bH!W"F%!!2;FKE)&F9S?>6cao\!MSY/!!,I*KE)$?_Lqmi6g -TI+!CQ"&!!2:3KE)&F(5)YgkTkf]!U(_\!!1G[KE)&:2M;&2ct%e0!RP;/!!/bVKE)&"G(]hrT -]Cb+!MJG*!!,CLKE)%Gp4NDH60*\!!C>^u!!29tKE)&:&qg5ccnpCU!RNTT!!/a7KE)%GEeFDn -jZnJ!!V3IJ!!2n#KE)&7+G9^qnsG(1!VoKD!!20mKE)&DN._03jTpM>!V1tu!!20aKE)&7!e^O -Sb+G9 ^qbF! q_ !Th U[!!/D tKE)%rN -._03QO&6E!R$4N! !/D hKE)% >!e^O S0 0k0 j!L L$D! -!19uKE)$++G9^qQ ^EF+! R& cA!!+ _aKE )% >N. _030* m42 !LJOo !!+_ -UKE)$+Y_2uWQe[5 o!ABg n!! /G3 KE)$ +N ._0 308>,[ !A E5]!!+ auK -E)&HTS*:GqcJLO! Gh1X! !2e TKE ) &M9 S]!VV >& !!2sdK E)$ -dr.G%Np4S)!!VV+ u!!2/ RKE )&D =G -Y Tq( @=# !UZP5! !2 /BKE)& MDM -.ujm>uu$!VX`j!! 2X[K E)& ?L kG a/j Fi0 d!U YPn! -!2/4KE)&?JqO+)a e4:e ! T_ md !!2 Y.K E)&- TS*:G -acM/U!T_IX!!1i9 KE)&?b _,r s jMl iQ !S`E `!! 12pKE)&-KS 0=+ab#0G!S` -3Z!!/:VKE)%pfRs 5*jR.[ $!O n _T!! /:FK E)% pb_,rs[uc7 C!SbhO!!13] -KE)%^LkGa/PD"Sh !Om`8! !/: 8KE) %^Jq O+) -_Q+m!L)/h !!140KE)$kT -S*:G-]iu]!L(`\! !.#"K E)%^ b_,rs PK&7 U!H 3dI!!+I#KE )$kKS0=+-\@ -!O!@QNQ!!/;OKE) $kfRs 5*-d7 5D!H6 28! !+IeKE)$k` e4aFjNop1AsX!URaX!!2.IKE)&>_LqmiaO#S?!T\'M!!1 -d"KE)%oaFjNojCX&F!SPPI!!2HKKE)&+`.S*kaMNT1!SP>C!!/5/KE)%om">?>Zd=@*!KkHV!! -11'KE)%ZaFjNog#dqf!OK^t!!/5!KE)%Z_Lqmi,LD)D!Kl`%!!-`ZKE)#taFjNoOlh;s!GBK,! -!0FgKE)$c`.S*k,Jo*6!GB9&!!+>2KE)$cm">?>,NaXZ!GCPJ!!2dAKE)&M(5)Yg@f1lZ!VRdl -!!-PXKE)&H,(opsj=#Z]!V."Z!!2G"KE)&H2M;&2lstbL!TYGX!!2FqKE)%oBS6?dj>MYk!SHU -h!!1/OKE)&*jFdL6aC9f&!SHCb!!/2FKE)%oG(]hrZ06i@!SI+!!!0@cKE)%7ie.:4Z/UE:!?p -Z[!!/2TKE)$_k_&p:+ln:V!Ft2D!!+8&KE)$_ie.:4+ngQh!FthV!!2d-KE)$]IY7\%p(E#Y!T -XrJ!!2FCKE)&6&qg5clnX4o!Q[*N!!1_oKE)%o15#W.fQ)WF!K_DV!!0=rKE)%7EeFDnYk!GI! -?h#f!!-O#KE)#qnq6uD@If'O!VQkR!!2-fKE)&>)MA(ka;T^3!SBGd!!/0BKE)%WH@u8!ih1r) -!V'9F!!2ktKE)&4OG!T7nP"T9!TJog!!2UZKE)&4KS0=+idug`!QC^b!!2*3KE)&CDM.uj`K5` -Q!TM=V!!1&pKE)&4`e4? ->S'Zfg!K"mN!!1%#KE)%BaFjNoc/sZZ!Lq#\!!.qnKE)%B_Lqmi'@;C4!K$/r!!,%*KE)#daFj -NoM<9Hk!B8)Q!!/SOKE)$3`.S*k'>fD&!B7lK!!*c"KE)$3m">?>'BXrJ!B9.o!!2tqKE)$qn: -UcB])73]!W/[G!!.3:KE)%aIY7\%qkA`D!H`^B!!.1*KE)&E."hR$q3H[6!AaS+!!2h-KE)&M[ -Y+V]G5R!n!A]+W!!2h)KE)&E,(opsG(,)E!V^&V!!2(-KE)&C(5)Ygk%KDJ!TGAX!!2NOKE)&I -G(]hriZa$U!Uf$%!!24kKE)&@ie.:4`+Xf(!TH"j!!1=-KE)%kA:sp`h<9Ll!R0VX!!1#IKE)& -/jFdL6bi49U!Suag!!.o>KE)%kG(]hrRHT;(!Jofi!!0^qKE)%@jFdL6LuO'f!P@EG!!/MIKE) - %bie.:4&a4lJ!JpH&!!+n>KE)#bjFdL6GNa\[!Aiei!!*\kKE)$sjFdL61ZF&f!I*OV!!*]*K -E)$/p4NDHqila6!HRsg!!0WZKE)&MP(Wf9EdWN?!HLAW!!2[*KE)$-IY7\%pG@O'!V6qW!!..i -KE)&I15#W.iY7%G!Tl4l!!2'lKE)&@FG'Vpjt_Si!Uau]!!1"pKE)%sFG'Vp`%luG!Sm=#!!1; -aKE)&.nq6uDLie:M!LWM4!!.mrKE)%`oRm2FR.>n1!P.cS!!*Z'KE)$-oRm2F&FtJS!H[md!!+ -hFKE)$onq6uDqhg%,!HEL?!!.('KE)&E$A8B[pDS\b!TFH>!!24#KE)&@3eRJ6`#=:/!R*TX!! -1l$KE)%/3eRJ6R!ODc!P%uZ!!*XWKE)$,qLehLEVb=g!H>c+!!2%TKE)&BXFpQSiCJV%!Uut>! -!2%HKE)&36A,=>_U*r9!T@jJ!!0sXKE)&3AqU-b_Sh*-!Q)^,!!.f#KE)%im">?>KueoI!Q*uP -!!.elKE)%,_Lqmi$daP,!JTln!!*JKKE)%,k(E^8$cI\u!=Qbt!!*JoKE)#\k(E^8nYh*@!Vk6 -!!!+#9KE)&CUkA^K)Ld>>!V)n;!!2%,KE)&BQ@o5=j(O)G!T>;W!!2+jKE)&3,(opsj'mZA!Q& -N'!!2%:KE)%mk_&p:_IS<"!QO2R!!0rGKE)%mie.:4K]n'h!Q'#5!!/)CKE)%+jFdL6NT>`m!J -KHc!!/)=KE)#Zk_&p:K_C'!!?:6U!!*DeKE)#ljFdL6$0$UKE)&KdY%T$3dcS\!BNDt!!2VSKE)#jIY7\%o+!!,01KE)&EZ@i2Yi=pqF -!TQ"i!!2$kKE)&9FG'Vpj"c8f!U"KV!!0qnKE)%mFG'Vp_D6cE!RC=j!!1)[KE)%unq6uDKQMk -I!K?Z(!!.anKE)%DoRm2FN:MW%!M/e7!!*AtKE)#joRm2F#kEWK!B]q,!!*u.KE)$7nq6uDHLQ -Rf!PNl6!!.CjKE)%d5(in:H9?i\!I>f?!!2o!!0e0KE)#YH@u8!)#Amc!BL"0!!.@iKE)%c^4ZIeGs$`[!I5`>!!,'nKE)$u^4ZIe -GeA\0!I12h!!.=NKE)&2W.Y-Oi1u#+!T9]*!!0oLKE)&2[Y+V]_.83!!Pr5u!!.]8KE)%hG(]h -rK&hRb!J9;!!0nmKE)%jFG'Vp_(pZD!Q/r2!!.[nKE)%-oRm2FJoZME!J^/u!!*5pKE)#^oR -m2F"S.3G!=eUQ!!2l[KE)#nI"VJ#*Bo,V!V"6b!!2WDKE)&2MM(s1iL5E"!TUbE!!0nSKE)%j3 -eRJ6a*NC=!J3@c!!.h#KE)%5qLehL"F>_$!=\gX!!+,:KE)$9G_?%tT"]jX!BiPu!!,5(KE)#m -^4ZIe4hcRL!I\p?!!0gHKE)%$3.q84^7KuX!IYr@!!.KXKE)$8]S$7cICt45!Bcs,!!.M>KE)% -#\:ah_^0ZHm!IUDj!!.J-KE)$8?A&:ZI,9MV!IS.*!!.IBKE)%#/qa3*^pJap!Pl!o!!.XmKE) - %(EeFDn!q_-G!_E(XI[Gcg!P_B_!!.P- -KE)%%L4fO-5$Wa@!IigW!!,8YKE)%%c@c/uITV7'!P^7?!!.OBKE)%%7YCaB4t_Kg!Iep>!!.O -"KE)%%-A2@"%pjnh!?YR"!!+0:KE)$;=G-YTT<p*@)!!0.YKE)&'pk/VJ;o"%d!NGRA!!1UIKE)$Mi.M(2W;)#G!RuRO!!,pcKE)%OI"VJ#:j -@Wn!W(/r!!-<^KE)%Tpk/VJqT+DG!!2EJKE)&)`.S*kf><1@!O'k'!!1^<&!TiNu!!2ZaKE)&7jFdL6jl1pn!R'\[!!23TKE)%rjFdL6bMn0T!LN#'!!1: -:KE)%>jFdL6Qfi!H*:L!!2fcKE)&DEeFDnDgm?>!VZ); -!!20QKE)&?oRm2FjRRs(!U]H2!!146KE)&-oRm2Famt)b!Sd0u!!/;UKE)%:nq6uDA\`s!!OD3 -J!!1c#KE)$`i.M(2Z?V$&!SKYi!!-VLKE)%Y4G3\8A2o5B!OqLehLaSLPi!SR=&!!/5YKE)$^i.M(2Z$:p%! -SG,>!!-PJKE)%X4G3\8@Q9#@!O3]!!!-OKKE)$^%YOf_+aAY?!Kb$K!!-SSKE)#r4G3\8@m#DE -!?iM;!!-RNKE)#r^4ZIeA%mTr!F]r#!!0=:KE)$]3.q84Yb$LJ!FZt$!!-L\S!>bH`!!/",KE)&JZ@i2Y(4 -:c8!>[kP!!2V3KE)#hIY7\%nT'9_!TNa)!!2*MKE)%loRm2F`U\Z^!K6T'!!/#KKE)$1^k;[gR -dbt1!R6"F!!+q7KE)%AG_?%tbs$d\!AnbK!!/NNKE)$03.q84RN@+^!AkdL!!+ndKE)#cn:UcB -M0ssV!B0G#!!*^WKE)%05(in:2L'lT!Ll9+!!+u?KE)#c*eXLo2BIMO!Vi+:!!*a\KE)&K\qC% -a2gg8Y!>@YM!!,#BKE)&C3eRJ6o6Q&i!TJEY!!26YKE)%kqLehLc2*(n!K$Z+!!0[hKE)&/G_? - %tm_4>S!Hc,1!!0ZMKE)&/4G3\8FC9b%!P17D!!1msKE)$p0SBE,\f?A'!H]03!!0Y@KE)$p% -"nT]1>mfc!L\1c!!1.GI!!.:gKE)$/4G3\8&KZT*!I$YZ!!+ksKE)$ -s*eXLo&\`nu!AhHC!!.;XKE)$n^k;[g\T!3%!Sk>@!!.+JKE)%`3.q84gn'0!!HKlI!!0VMKE) -$n(k_ki\IO8m!HJU%!!.*EKE)$-E.e2lR(S(P!HW45!!+f6KE)%?SqI(EF#\gQ!P+eT!!.-\KE -)$-%YOf_Et3j'!>)ns!!+geKE)#aSqI(EF1d/+!AU1!!!./4KE)$m@"\L\\@@1l!Sh"7!!.'nK -E)%_S:gkCE>X?/!P"/C!!.'JKE)$m#(usW0Xuc9!LR2H!!.)LKE)$,S:gkCEL_[^!AKOe!!.)" -KE)#a?A&:Z0]%H_!HHtL!!.&CKE)%_>_E(XE0u:Y!OtmX!!.%tKE)$lL4fO-0O082!H?hI!!+c -KKE)$lc@c/uE*.bn!Osb8!!.%4KE)$l7YCaB0J8"Y!H;q0!!.$iKE)$l-A2@"$Li]K!JPoS!!* -FOKE)%,5(in:$9WtA!=Bm$!!*ITKE)#\5(in:n@F8Q!TA?X!!0t5KE)%,qLehL)W68K!KD>W!! -1*RKE)#kE.e2lNBDjo!?*qN!!/'#KE)#k*/":m)@hE#!=="(!!.beKE)#lG_?%t#s'!!1r:KE)%!&;1#a]aTPo!I>$)!!0b;KE)%!"G?aU3FIL?!M -$ZQ!!1AOKE)%"@"\L\3A?*d!M#[5!!.F#KE)%dS:gkCS;r7&!IGZ:!!,(gKE)%"%"nT]3q>[!!.GVKE)$5S:gkC(lj7L!IL>i!!,*?KE)%"Ne@B5#[W/a -!>s[H!!,+:KE)%"hLkk0GsI#_!PGXi!!1q]KE)$u+G9^q]U4?P!T$S)!!.?VKE)%cN._03GmK' -'!PF/?!!.?JKE)$u!e^OS33\&9!M!DJ!!.ALKE)$4R"PG?S5+_;!I:&c!!0aXKE)$uN._033/3 -(d!I9EQ!!*pAKE)$4gk5Y.(f#_a!I_E(X4WoCX!M5[3!!1D@KE)$9& -;1#aSrA=&!Bg^A!!/[GKE)$9"G?aU4T^9:!?A=s!!/*bKE)$9Y_2uW*12BZ!KKp.!!,6MKE)%E -c@c/u4cG$o!??iI!!,6;KE)#]>_E(X*8H2I!=V_V!!,7!PX/=!!,3TKE)%E=G-YTcRskN!I^Vo!!,3DKE) - %E9S4A^\2!M1iq!!.JoKE)$88;$sDSgK*j!IVtA!!0f -GKE)%#`.S*k4@4]$!IVb;!!+&jKE)$8CkMch*%$==!IX6e!!,2oKE)%#k(E^8^*nX7!T+ZG!!0 -eZKE)%e,(ops4=Gj_!M1'[!!.I\KE)$8,_Q-uHt7m1!B_QZ!!.IVKE)#m(5)Yg4>qim!IT'D!! -0eJKE)%e&qg5c4;H!="R;! -!*.-KE)#WhLkk0%^:Td!Jap5!!*RsKE)%.:4rTJ%ZH&@!=jj;!!*:/KE)#_gk5Y.##9gO!=mD. -!!+.6KE)%6=G-YTa0('q!?R>U!!/-SKE)#oLkGa/O%+d&!?QoI!!+-mKE)#_=G-YTLG"5[!?Tm -H!!/-uKE)#ob_,rs%Ru*O!?T76!!*9VKE)#_DM.uj*q"[]!M<2A!!1EIKE)%F8;$sDc_c?q!M; -c5!!/]YKE)#o:kSfLO">qa!C"k`!!/^.KE)%6-A2@"50/BW!?OX^!!,:%KE)#o6A,=>5/MsQ!= -gZ6!!+-WKE)#_-A2@"54!q&!?Pj+!!,:GKE)&1W.Y-On(*-l!T0]+!!1uOKE)%F."hR$c^'4a! -P`<$!!/];KE)%fA:sp`T-Apg!P`)s!!+,hKE)%6(5)Yg5%oTL!?NM>!!.Q4KE)$:A:sp`*[67; -!Ij*_!!,8mKE)%%ie.:4%Mj]t!?O.P!!,9,KE)%%p4NDHhirco!T0&n!!/]+KE)%f1kYi0T+Ze -W!P^CC!!+,TKE)$:1kYi0*YO,+!If-D!!,8=KE)%%EeFDnhhm'e!M9^P!!0hQKE)#o$A8B[4rT -(S!Id(_!!*1,KE)#T:4rTJ#?ZWZ!J@P.!!*#:tN.!=s""!!*'KE)%*eq=#(#Gd"Q!=,?P!!*1fKE)#X[Y+ -V]LX^tW!Jf*V!!*=hKE)#`["JD[#Ej`?!=uJh!!1.*>p*F91G<6^FDkW&FE;dO@r-:/FCfK6P! -5%%P!5%%06WLBOu$Ou%N50628NA;Ch-P&,pdOo^@NOo^@NOo^@OOo^_% -I?IS`E+sQ<+ED[?A0>oUCm#*f1Pc$e!HNtsP,Wd]Bp(ZC1MMXIP%odQP!+.FCh%Z3BnukS;MZB -WCiY=4P,X6>P#@GDOu"b3@s9&0L]`fP%p-\Ou"b3@s9&0L]`f;N_'D1O -YEcBnukSC5;qS4aShu@s9&0L]`fN@r,_"ASd/)P -&-9^EejaZWJCY>C6AU\1OYEcE+sQ<+ED[?A0>TLCg2\rL]N;4L]N;4L]N;4L]N;3L]N;3L]N;3 -L]N;3L]E52Ch%Z3BnukSC1DI0DdmF&F*i=u8Rlsc+CcO.P&+Wk9RCK0"-RD/GB@b4BlnECI?I0 -MP"B/%D/`onFF/f EI=$! EG9CU U"-RD /G B@b 4BlnEC I?I0X!J -gc4!Jgc4!Jgc4!J g`3 !Jg`3 !/LW2 !J g`3 !Jg `3!/ -LZ(P#YeNH$tiH4? P9;AS s. SEb0- *@2D8ufF< GL@FD 5Z2 F!* Y 1+C oD. FC] E#GEQn u0 61WAD. .O, -Bm>e?Ou[rR%[&V$ E+EQ; 0fP 7TP %6 4g CG' +8/ p(ZFEd ;, :Ecc5; /n0 -$=E,Zq1AS,XoATD @'Df p)1 AW h2 !3A 5Gb FDt YuCM -@[!P.H"'F`V,9E+ *6lB l 7R 3P #M~> -% uk.co.terryburton.bwipp/pdf417 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp pdf417 0.0 2015050900 188276 197810 +%%BeginData: 873 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/pdf417 { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /compact false def + /eclevel -1 def + /columns 0 def + /rows 0 def + /rowmult 3 def + /encoding (auto) def + /ccc false def + /raw false def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /eclevel eclevel cvi def + /columns columns cvi def + /rows rows cvi def + /rowmult rowmult cvr def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + raw {/encoding (raw) def} if + + % Convert input into array of codewords + encoding (raw) eq { + /datcws barcode length array def + /i 0 def /j 0 def + { % loop + i barcode length eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + datcws j cw put + /i i 4 add def + /j j 1 add def + } loop + /datcws datcws 0 j getinterval def + } if + + /barcode [ barcode {} forall ] def + /barlen barcode length def + + ccc {/encoding (ccc) def} if + + /encb { + /in exch def + /inlen in length def + /out inlen 6 idiv 5 mul inlen 6 mod add array def + 0 1 inlen 6 idiv 1 sub { + /k exch def + /msbs [ in k 6 mul 3 getinterval aload pop ] def + /mscs [ + msbs aload pop exch 256 mul add exch 65536 mul add + 3 {dup 900 mod exch 900 idiv} repeat + ] def + /lsbs [ in k 6 mul 3 add 3 getinterval aload pop ] def + /lscs [ + lsbs aload pop exch 256 mul add exch 65536 mul add + 3 {dup 900 mod exch 900 idiv} repeat + ] def + lscs 0 get mscs 0 get 316 mul add + out k 5 mul 4 add 2 index 900 mod put + 900 idiv lscs 1 get add mscs 0 get 641 mul add mscs 1 get 316 mul add + out k 5 mul 3 add 2 index 900 mod put + 900 idiv lscs 2 get add mscs 0 get 20 mul add mscs 1 get 641 mul add mscs 2 get 316 mul add + out k 5 mul 2 add 2 index 900 mod put + 900 idiv lscs 3 get add mscs 1 get 20 mul add mscs 2 get 641 mul add + out k 5 mul 1 add 2 index 900 mod put + 900 idiv mscs 2 get 20 mul add + out k 5 mul 3 -1 roll 900 mod put + } for + /rem inlen 6 mod def + rem 0 ne { + out out length rem sub + [ in inlen rem sub rem getinterval aload pop ] + putinterval + } if + out + } bind def + + encoding (byte) eq encoding (ccc) eq or { + /datcws barlen 6 idiv 5 mul barlen 6 mod add 1 add array def + datcws 0 barlen 6 mod 0 eq {924} {901} ifelse put + datcws 1 barcode encb putinterval + encoding (ccc) eq {/datcws [920 datcws aload pop] def} if + } if + + encoding (auto) eq { + + % Modes and text submodes + /T 0 def /N 1 def /B 2 def + /A 0 def /L 1 def /M 2 def /P 3 def + + % Special function characters for mode switching + /tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def + + % Special function characters for text mode + /al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def + + % Character maps for each state + /charmaps [ + % A L M P + [ (A) (a) (0) (;) ] % 0 + [ (B) (b) (1) (<) ] % 1 + [ (C) (c) (2) (>) ] % 2 + [ (D) (d) (3) (@) ] % 3 + [ (E) (e) (4) ([) ] % 4 + [ (F) (f) (5) 92 ] % 5 + [ (G) (g) (6) (]) ] % 6 + [ (H) (h) (7) (_) ] % 7 + [ (I) (i) (8) (`) ] % 8 + [ (J) (j) (9) (~) ] % 9 + [ (K) (k) (&) (!) ] % 10 + [ (L) (l) 13 13 ] % 11 + [ (M) (m) 9 9 ] % 12 + [ (N) (n) (,) (,) ] % 13 + [ (O) (o) (:) (:) ] % 14 + [ (P) (p) (#) 10 ] % 15 + [ (Q) (q) (-) (-) ] % 16 + [ (R) (r) (.) (.) ] % 17 + [ (S) (s) ($) ($) ] % 18 + [ (T) (t) (/) (/) ] % 19 + [ (U) (u) (+) (") ] % 20 + [ (V) (v) (%) (|) ] % 21 + [ (W) (w) (*) (*) ] % 22 + [ (X) (x) (=) 40 ] % 23 + [ (Y) (y) (^) 41 ] % 24 + [ (Z) (z) pl (?) ] % 25 + [ ( ) ( ) ( ) ({) ] % 26 + [ ll as ll (}) ] % 27 + [ ml ml al (') ] % 28 + [ ps ps ps al ] % 29 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 30 dict 30 dict 30 dict 30 dict ] def + /alltext 104 dict def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 3 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + dup charvals j get exch i put + alltext exch -1 put + } for + } for + + /e 10000 def % "Empty" + + /latlen [ % Bit length of latch between submodes + % To: A L M P From + [ 0 1 1 2 ] % A + [ 2 0 1 2 ] % L + [ 1 1 0 1 ] % M + [ 1 2 2 0 ] % P + ] def + + /latseq [ % Latch sequences between submodes + % To: A L M P From + [ [] [ll] [ml] [ml pl] ] % A + [ [ml al] [] [ml] [ml pl] ] % L + [ [al] [ll] [] [pl] ] % M + [ [al] [al ll] [al ml] [] ] % P + ] def + + /shftlen [ % Bit length of shift to submode + % To: A L M P From + [ e e e 1 ] % A + [ 1 e e 1 ] % L + [ e e e 1 ] % M + [ e e e e ] % P + ] def + + % Determine runlengths of digits + /numdigits [ barlen {0} repeat 0 ] def + /numtext [ barlen {0} repeat 0 ] def + /numbytes [ barlen {0} repeat 0 ] def + barlen 1 sub -1 0 { + /i exch def + barcode i get dup 48 ge exch 57 le and { + numdigits i numdigits i 1 add get 1 add put + } if + alltext barcode i get known numdigits i get 13 lt and { + numtext i numtext i 1 add get 1 add put + } if + numtext i get 5 lt numdigits i get 13 lt and { + numbytes i numbytes i 1 add get 1 add put + } if + } for + /numdigits numdigits 0 barlen getinterval def + /numtext numtext 0 barlen getinterval def + /numbytes numbytes 0 barlen getinterval def + + /seq [] def /seqlen 0 def /state T def /p 0 def { % loop + p barlen eq {exit} if + /n numdigits p get def + n 13 ge { + /seq [ + seq aload pop + nl + [ barcode p n getinterval aload pop ] + ] def + /state N def + /p p n add def + /seqlen seqlen 1 add n add def + } { % next + /t numtext p get def + t 5 ge { + /seq [ + seq aload pop + state T ne {tl} if + [ barcode p t getinterval aload pop ] + ] def + /state T def + /p p t add def + /seqlen seqlen 1 add t add def % ish + } { % next + /b numbytes p get def + b 1 eq state T eq and { + /seq [ + seq aload pop + bs + [ barcode p get ] + ] def + /p p b add def + /seqlen seqlen 2 add def + } { % next + /seq [ + seq aload pop + b 6 mod 0 ne {bl} {bl6} ifelse + [ barcode p b getinterval aload pop ] + ] def + /state B def + /p p b add def + /seqlen seqlen 1 add b add def + } ifelse } ifelse } ifelse + } loop + + /latchcws << + tl 900 bl 901 bl6 924 nl 902 bs 913 + >> def + + % Submode encoding functions + /enca {charvals A get exch get} bind def + /encl {charvals L get exch get} bind def + /encm {charvals M get exch get} bind def + /encp {charvals P get exch get} bind def + /textencfuncs [ /enca /encl /encm /encp ] def + + /addtotext { + text exch l exch put + /l l 1 add def + } bind def + + /enct { + + /in exch def + + /curlen [ e e e e ] def + curlen submode 0 put + /curseq [ [] [] [] [] ] def + + % Derive the optimal sequences ending in each submode + in { + + /char exch def + + % Check for optimisations in the current sequences by latching from x to y + { % loop + /imp false def + [ A L M P ] { + /x exch def + [ A L M P ] { + /y exch def + /cost curlen x get latlen x get y get add def + cost curlen y get lt { + curlen y cost put + curseq y [ + curseq x get aload pop + latseq x get y get aload pop + ] put + /imp true def + } if + } forall + } forall + imp not {exit} if % Repeat unless no improvement + } loop + + % Determine optimal next sequences for each valid encoding + /nxtlen [ e e e e ] def + /nxtseq 4 array def + + [ A L M P ] { + /x exch def + + { % loop for common exit + + charvals x get char known not {exit} if + + % Extend directly + /cost curlen x get 1 add def + cost nxtlen x get lt { + nxtlen x cost put + nxtseq x [ curseq x get aload pop char ] put + } if + + % Optimise for direct shifts from y to x + [ A L M P ] { + /y exch def + x y ne { + /cost curlen y get shftlen y get x get add 1 add def + cost nxtlen y get lt { + nxtlen y cost put + nxtseq y [ + curseq y get aload pop + x A eq {as} {ps} ifelse + char + ] put + } if + } if + } forall + + exit + } loop + + } forall + + /curlen nxtlen def + /curseq nxtseq def + + } forall + + % Select the optimal sequence + /minseq e def + [ A L M P ] { + /k exch def + curlen k get minseq lt { + /minseq curlen k get def + /txtseq curseq k get def + } if + } forall + + % Encode the sequence + /text minseq array def + /k 0 def /l 0 def { + k txtseq length ge {exit} if + + /char txtseq k get def + + % Encode character + char textencfuncs submode get load exec addtotext + /k k 1 add def + + % Encode shifted next character + char as eq char ps eq or { + txtseq k get char as eq {enca} {encp} ifelse addtotext + /k k 1 add def + } if + + % Latches to new submode + char al eq {/submode A def} if + char ll eq {/submode L def} if + char ml eq {/submode M def} if + char pl eq {/submode P def} if + } loop + + text length 2 mod 1 eq { + submode P eq { + /pad al encp def + /submode A def + } { + /pad ps textencfuncs submode get load exec def + } ifelse + /text [ text aload pop pad ] def + } if + + /out text length 2 idiv array def + 0 1 out length 1 sub { + /k exch def + out k text k 2 mul get 30 mul text k 2 mul 1 add get add put + } for + + out + + } bind def + + /encn { + /in exch def + /out [] def + 0 44 in length 1 sub { + /k exch def + /gmod [ + 1 in k in length k sub dup 44 gt {pop 44} if getinterval + {48 sub} forall + ] def + /cwn [] def { + /dv 900 def + /gmul [] def /val 0 def { + gmod length 0 eq {exit} if + /val val 10 mul gmod 0 get add def + /gmod gmod 1 gmod length 1 sub getinterval def + val dv lt { + gmul length 0 ne { + /gmul [ gmul aload pop 0 ] def + } if + } { + /gmul [ gmul aload pop val dv idiv ] def + } ifelse + /val val dv mod def + } loop + /dv val def + /cwn [ dv cwn aload pop ] def + /gmod gmul def + gmul length 0 eq {exit} if + } loop + /out [ out aload pop cwn aload pop ] def + } for + out + } bind def + + /encfuncs [ /enct /encn /encb ] def + + /addtocws { + dup datcws j 3 -1 roll putinterval + length j add /j exch def + } bind def + + % Encode the sequence + /state T def /submode A def + /datcws seqlen array def + /i 0 def /j 0 def { + i seq length ge {exit} if + /chars seq i get def + chars type /arraytype eq { % Encode data according to mode + chars encfuncs state get load exec addtocws + } { % Encode the latch to new state or byte shift + [ latchcws chars get ] addtocws + chars tl eq {/state T def /submode A def} if + chars nl eq {/state N def} if + chars bl eq chars bl6 eq or {/state B def} if + chars bs eq { + /i i 1 add def + seq i get encb addtocws + } if + } ifelse + /i i 1 add def + } loop + /datcws datcws 0 j getinterval def + } if + + % Determine the error correction level if unspecified + /m datcws length def + eclevel -1 eq { + m 40 le {/eclevel 2 def} if + m 41 ge m 160 le and {/eclevel 3 def} if + m 161 ge m 320 le and {/eclevel 4 def} if + m 321 ge {/eclevel 5 def} if + } if + + % Reduce the error level so that it does not cause an excessive number of codewords + /maxeclevel 928 1 sub m sub ln 2 ln div cvi 1 sub def + eclevel maxeclevel gt {/eclevel maxeclevel def} if + /k 2 eclevel 1 add exp cvi def + + % To determine size of matrix, number of columns if given by user... + columns 0 eq {/columns m k add 3 div sqrt round cvi def} if + columns 1 ge columns 30 le and {/c columns def} if + + % ... and rows is greater of those required and that given by user within limits + /r m k add 1 add columns div ceiling cvi def % Required + r rows lt rows 90 le and {/r rows def} if + r 3 lt {/r 3 def} if + + % Opportunistically raise the error level if a better fit to the matrix is possible + /maxeclevel c r mul 1 sub m sub ln 2 ln div cvi 1 sub 8 2 copy gt {exch} if pop def + maxeclevel eclevel gt { + /eclevel maxeclevel def + /k 2 eclevel 1 add exp cvi def + } if + + % Create codewords array with one extra working space element and add padding + /n c r mul k sub def + /cws c r mul 1 add array def + cws 0 n put + cws 1 datcws putinterval + cws m 1 add [ n m sub 1 sub {900} repeat ] putinterval + cws n [ k {0} repeat 0 ] putinterval + + % Calculate the log and anti-log tables + /rsalog [ 1 928 {dup 3 mul 929 mod} repeat ] def + /rslog 929 array def + 1 1 928 {dup rsalog exch get exch rslog 3 1 roll put} for + + % Function to calculate the product in the field + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add 928 mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate the coefficients + /coeffs [ 1 k {0} repeat ] def + 1 1 k { + /i exch def + coeffs i coeffs i 1 sub get put + i 1 sub -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod add 929 mod put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + coeffs length 1 sub -2 0 {coeffs exch 2 copy get 929 exch sub put} for + + % Derive the error codewords + 0 1 n 1 sub { + /t exch cws exch get cws n get add 929 mod def + 0 1 k 1 sub { + /j exch def + cws n j add cws n j add 1 add get 929 t coeffs k j sub 1 sub get mul 929 mod sub add 929 mod put + } for + } for + n 1 n k add { dup cws exch 929 cws 5 -1 roll get sub 929 mod put } for + + % Trim the working space from the end of the codewords + /cws cws 0 cws length 1 sub getinterval def + + % Base 10 encoding of the bar space successions for the codewords in each cluster + /clusters [ + [ + 120256 125680 128380 120032 125560 128318 108736 119920 108640 86080 108592 86048 + 110016 120560 125820 109792 120440 125758 88256 109680 88160 89536 110320 120700 + 89312 110200 120638 89200 110140 89840 110460 89720 110398 89980 128506 119520 + 125304 128190 107712 119408 125244 107616 119352 84032 107568 119324 84000 107544 + 83984 108256 119672 125374 85184 108144 119612 85088 108088 119582 85040 108060 + 85728 108408 119742 85616 108348 85560 108318 85880 108478 85820 85790 107200 + 119152 125116 107104 119096 125086 83008 107056 119068 82976 107032 82960 82952 + 83648 107376 119228 83552 107320 119198 83504 107292 83480 83468 83824 107452 + 83768 107422 83740 83900 106848 118968 125022 82496 106800 118940 82464 106776 + 118926 82448 106764 82440 106758 82784 106936 119006 82736 106908 82712 106894 + 82700 82694 106974 82830 82240 106672 118876 82208 106648 118862 82192 106636 + 82184 106630 82180 82352 82328 82316 82080 118830 106572 106566 82050 117472 + 124280 127678 103616 117360 124220 103520 117304 124190 75840 103472 75808 104160 + 117624 124350 76992 104048 117564 76896 103992 76848 76824 77536 104312 117694 + 77424 104252 77368 77340 77688 104382 77628 77758 121536 126320 128700 121440 + 126264 128670 111680 121392 126236 111648 121368 126222 111632 121356 103104 117104 + 124092 112320 103008 117048 124062 112224 121656 126366 93248 74784 102936 117006 + 93216 112152 93200 75456 103280 117180 93888 75360 103224 117150 93792 112440 + 121758 93744 75288 93720 75632 103356 94064 75576 103326 94008 112542 93980 + 75708 94140 75678 94110 121184 126136 128606 111168 121136 126108 111136 121112 + 126094 111120 121100 111112 111108 102752 116920 123998 111456 102704 116892 91712 + 74272 121244 116878 91680 74256 102668 91664 111372 102662 74244 74592 102840 + 116958 92000 74544 102812 91952 111516 102798 91928 74508 74502 74680 102878 + 92088 74652 92060 74638 92046 92126 110912 121008 126044 110880 120984 126030 + 110864 120972 110856 120966 110852 110850 74048 102576 116828 90944 74016 102552 + 116814 90912 111000 121038 90896 73992 102534 90888 110982 90884 74160 102620 + 91056 74136 102606 91032 111054 91020 74118 91014 91100 91086 110752 120920 + 125998 110736 120908 110728 120902 110724 110722 73888 102488 116782 90528 73872 + 102476 90512 110796 102470 90504 73860 90500 73858 73944 90584 90572 90566 + 120876 120870 110658 102444 73800 90312 90308 90306 101056 116080 123580 100960 + 116024 70720 100912 115996 70688 100888 70672 70664 71360 101232 116156 71264 + 101176 116126 71216 101148 71192 71180 71536 101308 71480 101278 71452 71612 + 71582 118112 124600 127838 105024 118064 124572 104992 118040 124558 104976 118028 + 104968 118022 100704 115896 123486 105312 100656 115868 79424 70176 118172 115854 + 79392 105240 100620 79376 70152 79368 70496 100792 115934 79712 70448 118238 + 79664 105372 100750 79640 70412 79628 70584 100830 79800 70556 79772 70542 + 70622 79838 122176 126640 128860 122144 126616 128846 122128 126604 122120 126598 + 122116 104768 117936 124508 113472 104736 126684 124494 113440 122264 126670 113424 + 104712 117894 113416 122246 104706 69952 100528 115804 78656 69920 100504 115790 + 96064 78624 104856 117966 96032 113560 122318 100486 96016 78600 104838 96008 + 69890 70064 100572 78768 70040 100558 96176 78744 104910 96152 113614 70022 + 78726 70108 78812 70094 96220 78798 122016 126552 128814 122000 126540 121992 + 126534 121988 121986 104608 117848 124462 113056 104592 126574 113040 122060 117830 + 113032 104580 113028 104578 113026 69792 100440 115758 78240 69776 100428 95136 + 78224 104652 100422 95120 113100 69764 95112 78212 69762 78210 69848 100462 + 78296 69836 95192 78284 69830 95180 78278 69870 95214 121936 126508 121928 + 126502 121924 121922 104528 117804 112848 104520 117798 112840 121958 112836 104514 + 112834 69712 100396 78032 69704 100390 94672 78024 104550 94664 112870 69698 + 94660 78018 94658 78060 94700 94694 126486 121890 117782 104484 104482 69672 + 77928 94440 69666 77922 99680 68160 99632 68128 99608 115342 68112 99596 + 68104 99590 68448 99768 115422 68400 99740 68376 99726 68364 68358 68536 + 99806 68508 68494 68574 101696 116400 123740 101664 116376 101648 116364 101640 + 116358 101636 67904 99504 115292 72512 67872 116444 115278 72480 101784 116430 + 72464 67848 99462 72456 101766 67842 68016 99548 72624 67992 99534 72600 + 101838 72588 67974 68060 72668 68046 72654 118432 124760 127918 118416 124748 + 118408 124742 118404 118402 101536 116312 105888 101520 116300 105872 118476 116294 + 105864 101508 105860 101506 105858 67744 99416 72096 67728 116334 80800 72080 + 101580 99398 80784 105932 67716 80776 72068 67714 72066 67800 99438 72152 + 67788 80856 72140 67782 80844 72134 67822 72174 80878 126800 128940 126792 + 128934 126788 126786 118352 124716 122576 126828 124710 122568 126822 122564 118338 + 122562 101456 116268 105680 101448 116262 114128 105672 118374 114120 122598 101442 + 114116 105666 114114 67664 99372 71888 67656 99366 80336 71880 101478 97232 + 80328 105702 67650 97224 114150 71874 97220 67692 71916 67686 80364 71910 + 97260 80358 97254 126760 128918 126756 126754 118312 124694 122472 126774 122468 + 118306 122466 101416 116246 105576 101412 113896 105572 101410 113892 105570 113890 + 67624 99350 71784 101430 80104 71780 67618 96744 80100 71778 96740 80098 + 96738 71798 96758 126738 122420 122418 105524 113780 113778 71732 79988 96500 + 96498 66880 66848 98968 66832 66824 66820 66992 66968 66956 66950 67036 + 67022 100000 99984 115532 99976 115526 99972 99970 66720 98904 69024 100056 + 98892 69008 100044 69000 100038 68996 66690 68994 66776 98926 69080 100078 + 69068 66758 69062 66798 69102 116560 116552 116548 116546 99920 102096 116588 + 115494 102088 116582 102084 99906 102082 66640 68816 66632 98854 73168 68808 + 66628 73160 68804 66626 73156 68802 66668 68844 66662 73196 68838 73190 + 124840 124836 124834 116520 118632 124854 118628 116514 118626 99880 115478 101992 + 116534 106216 101988 99874 106212 101986 106210 66600 98838 68712 99894 72936 + 68708 66594 81384 72932 68706 81380 72930 66614 68726 72950 81398 128980 + 128978 124820 126900 124818 126898 116500 118580 116498 122740 118578 122738 99860 + 101940 99858 106100 101938 114420 + ] [ + 128352 129720 125504 128304 129692 125472 128280 129678 125456 128268 125448 128262 + 125444 125792 128440 129758 120384 125744 128412 120352 125720 128398 120336 125708 + 120328 125702 120324 120672 125880 128478 110144 120624 125852 110112 120600 125838 + 110096 120588 110088 120582 110084 110432 120760 125918 89664 110384 120732 89632 + 110360 120718 89616 110348 89608 110342 89952 110520 120798 89904 110492 89880 + 110478 89868 90040 110558 90012 89998 125248 128176 129628 125216 128152 129614 + 125200 128140 125192 128134 125188 125186 119616 125360 128220 119584 125336 128206 + 119568 125324 119560 125318 119556 119554 108352 119728 125404 108320 119704 125390 + 108304 119692 108296 119686 108292 108290 85824 108464 119772 85792 108440 119758 + 85776 108428 85768 108422 85764 85936 108508 85912 108494 85900 85894 85980 + 85966 125088 128088 129582 125072 128076 125064 128070 125060 125058 119200 125144 + 128110 119184 125132 119176 125126 119172 119170 107424 119256 125166 107408 119244 + 107400 119238 107396 107394 83872 107480 119278 83856 107468 83848 107462 83844 + 83842 83928 107502 83916 83910 83950 125008 128044 125000 128038 124996 124994 + 118992 125036 118984 125030 118980 118978 106960 119020 106952 119014 106948 106946 + 82896 106988 82888 106982 82884 82882 82924 82918 124968 128022 124964 124962 + 118888 124982 118884 118882 106728 118902 106724 106722 82408 106742 82404 82402 + 124948 124946 118836 118834 106612 106610 124224 127664 129372 124192 127640 129358 + 124176 127628 124168 127622 124164 124162 117568 124336 127708 117536 124312 127694 + 117520 124300 117512 124294 117508 117506 104256 117680 124380 104224 117656 124366 + 104208 117644 104200 117638 104196 104194 77632 104368 117724 77600 104344 117710 + 77584 104332 77576 104326 77572 77744 104412 77720 104398 77708 77702 77788 + 77774 128672 129880 93168 128656 129868 92664 128648 129862 92412 128644 128642 + 124064 127576 129326 126368 124048 129902 126352 128716 127558 126344 124036 126340 + 124034 126338 117152 124120 127598 121760 117136 124108 121744 126412 124102 121736 + 117124 121732 117122 121730 103328 117208 124142 112544 103312 117196 112528 121804 + 117190 112520 103300 112516 103298 112514 75680 103384 117230 94112 75664 103372 + 94096 112588 103366 94088 75652 94084 75650 75736 103406 94168 75724 94156 + 75718 94150 75758 128592 129836 91640 128584 129830 91388 128580 91262 128578 + 123984 127532 126160 123976 127526 126152 128614 126148 123970 126146 116944 124012 + 121296 116936 124006 121288 126182 121284 116930 121282 102864 116972 111568 102856 + 116966 111560 121318 111556 102850 111554 74704 102892 92112 74696 102886 92104 + 111590 92100 74690 92098 74732 92140 74726 92134 128552 129814 90876 128548 + 90750 128546 123944 127510 126056 128566 126052 123938 126050 116840 123958 121064 + 116836 121060 116834 121058 102632 116854 111080 121078 111076 102626 111074 74216 + 102646 91112 74212 91108 74210 91106 74230 91126 128532 90494 128530 123924 + 126004 123922 126002 116788 120948 116786 120946 102516 110836 102514 110834 73972 + 90612 73970 90610 128522 123914 125978 116762 120890 102458 110714 123552 127320 + 129198 123536 127308 123528 127302 123524 123522 116128 123608 127342 116112 123596 + 116104 123590 116100 116098 101280 116184 123630 101264 116172 101256 116166 101252 + 101250 71584 101336 116206 71568 101324 71560 101318 71556 71554 71640 101358 + 71628 71622 71662 127824 129452 79352 127816 129446 79100 127812 78974 127810 + 123472 127276 124624 123464 127270 124616 127846 124612 123458 124610 115920 123500 + 118224 115912 123494 118216 124646 118212 115906 118210 100816 115948 105424 100808 + 115942 105416 118246 105412 100802 105410 70608 100844 79824 70600 100838 79816 + 105446 79812 70594 79810 70636 79852 70630 79846 129960 95728 113404 129956 + 95480 113278 129954 95356 95294 127784 129430 78588 128872 129974 95996 78462 + 128868 127778 95870 128866 123432 127254 124520 123428 126696 128886 123426 126692 + 124514 126690 115816 123446 117992 115812 122344 117988 115810 122340 117986 122338 + 100584 115830 104936 100580 113640 104932 100578 113636 104930 113634 70120 100598 + 78824 70116 96232 78820 70114 96228 78818 96226 70134 78838 129940 94968 + 113022 129938 94844 94782 127764 78206 128820 127762 95102 128818 123412 124468 + 123410 126580 124466 126578 115764 117876 115762 122100 117874 122098 100468 104692 + 100466 113140 104690 113138 69876 78324 69874 95220 78322 95218 129930 94588 + 94526 127754 128794 123402 124442 126522 115738 117818 121978 100410 104570 112890 + 69754 78074 94714 94398 123216 127148 123208 127142 123204 123202 115408 123244 + 115400 123238 115396 115394 99792 115436 99784 115430 99780 99778 68560 99820 + 68552 99814 68548 68546 68588 68582 127400 129238 72444 127396 72318 127394 + 123176 127126 123752 123172 123748 123170 123746 115304 123190 116456 115300 116452 + 115298 116450 99560 115318 101864 99556 101860 99554 101858 68072 99574 72680 + 68068 72676 68066 72674 68086 72694 129492 80632 105854 129490 80508 80446 + 127380 72062 127924 127378 80766 127922 123156 123700 123154 124788 123698 124786 + 115252 116340 115250 118516 116338 118514 99444 101620 99442 105972 101618 105970 + 67828 72180 67826 80884 72178 80882 97008 114044 96888 113982 96828 96798 + 129482 80252 130010 97148 80190 97086 127370 127898 128954 123146 123674 124730 + 126842 115226 116282 118394 122618 99386 101498 105722 114170 67706 71930 80378 + 96632 113854 96572 96542 80062 96702 96444 96414 96350 123048 123044 123042 + 115048 123062 115044 115042 99048 115062 99044 99042 67048 99062 67044 67042 + 67062 127188 68990 127186 123028 123316 123026 123314 114996 115572 114994 115570 + 98932 100084 98930 100082 66804 69108 66802 69106 129258 73084 73022 127178 + 127450 123018 123290 123834 114970 115514 116602 98874 99962 102138 66682 68858 + 73210 81272 106174 81212 81182 72894 81342 97648 114364 97592 114334 97564 + 97550 81084 97724 81054 97694 97464 114270 97436 97422 80990 97502 97372 + 97358 97326 114868 114866 98676 98674 66292 66290 123098 114842 115130 98618 + 99194 66170 67322 69310 73404 73374 81592 106334 81564 81550 73310 81630 + 97968 114524 97944 114510 97932 97926 81500 98012 81486 97998 97880 114478 + 97868 97862 81454 97902 97836 97830 69470 73564 73550 81752 106414 81740 + 81734 73518 81774 81708 81702 + ] [ + 109536 120312 86976 109040 120060 86496 108792 119934 86256 108668 86136 129744 + 89056 110072 129736 88560 109820 129732 88312 109694 129730 88188 128464 129772 + 89592 128456 129766 89340 128452 89214 128450 125904 128492 125896 128486 125892 + 125890 120784 125932 120776 125926 120772 120770 110544 120812 110536 120806 110532 + 84928 108016 119548 84448 107768 119422 84208 107644 84088 107582 84028 129640 + 85488 108284 129636 85240 108158 129634 85116 85054 128232 129654 85756 128228 + 85630 128226 125416 128246 125412 125410 119784 125430 119780 119778 108520 119798 + 108516 108514 83424 107256 119166 83184 107132 83064 107070 83004 82974 129588 + 83704 107390 129586 83580 83518 128116 83838 128114 125172 125170 119284 119282 + 107508 107506 82672 106876 82552 106814 82492 82462 129562 82812 82750 128058 + 125050 119034 82296 106686 82236 82206 82366 82108 82078 76736 103920 117500 + 76256 103672 117374 76016 103548 75896 103486 75836 129384 77296 104188 129380 + 77048 104062 129378 76924 76862 127720 129398 77564 127716 77438 127714 124392 + 127734 124388 124386 117736 124406 117732 117730 104424 117750 104420 104418 112096 + 121592 126334 92608 111856 121468 92384 111736 121406 92272 111676 92216 111646 + 92188 75232 103160 117118 93664 74992 103036 93424 112252 102974 93304 74812 + 93244 74782 93214 129332 75512 103294 129908 129330 93944 75388 129906 93820 + 75326 93758 127604 75646 128756 127602 94078 128754 124148 126452 124146 126450 + 117236 121844 117234 121842 103412 103410 91584 111344 121212 91360 111224 121150 + 91248 111164 91192 111134 91164 91150 74480 102780 91888 74360 102718 91768 + 111422 91708 74270 91678 129306 74620 129850 92028 74558 91966 127546 128634 + 124026 126202 116986 121338 102906 90848 110968 121022 90736 110908 90680 110878 + 90652 90638 74104 102590 91000 74044 90940 74014 90910 74174 91070 90480 + 110780 90424 110750 90396 90382 73916 90556 73886 90526 90296 110686 90268 + 90254 73822 90334 90204 90190 71136 101112 116094 70896 100988 70776 100926 + 70716 70686 129204 71416 101246 129202 71292 71230 127348 71550 127346 123636 + 123634 116212 116210 101364 101362 79296 105200 118140 79072 105080 118078 78960 + 105020 78904 104990 78876 78862 70384 100732 79600 70264 100670 79480 105278 + 79420 70174 79390 129178 70524 129466 79740 70462 79678 127290 127866 123514 + 124666 115962 118266 100858 113376 122232 126654 95424 113264 122172 95328 113208 + 122142 95280 113180 95256 113166 95244 78560 104824 117950 95968 78448 104764 + 95856 113468 104734 95800 78364 95772 78350 95758 70008 100542 78712 69948 + 96120 78652 69918 96060 78622 96030 70078 78782 96190 94912 113008 122044 + 94816 112952 122014 94768 112924 94744 112910 94732 94726 78192 104636 95088 + 78136 104606 95032 113054 95004 78094 94990 69820 78268 69790 95164 78238 + 95134 94560 112824 121950 94512 112796 94488 112782 94476 94470 78008 104542 + 94648 77980 94620 77966 94606 69726 78046 94686 94384 112732 94360 112718 + 94348 94342 77916 94428 77902 94414 94296 112686 94284 94278 77870 94318 + 94252 94246 68336 99708 68216 99646 68156 68126 68476 68414 127162 123258 + 115450 99834 72416 101752 116414 72304 101692 72248 101662 72220 72206 67960 + 99518 72568 67900 72508 67870 72478 68030 72638 80576 105840 118460 80480 + 105784 118430 80432 105756 80408 105742 80396 80390 72048 101564 80752 71992 + 101534 80696 71964 80668 71950 80654 67772 72124 67742 80828 72094 80798 + 114016 122552 126814 96832 113968 122524 96800 113944 122510 96784 113932 96776 + 113926 96772 80224 105656 118366 97120 80176 105628 97072 114076 105614 97048 + 80140 97036 80134 97030 71864 101470 80312 71836 97208 80284 71822 97180 + 80270 97166 67678 71902 80350 97246 96576 113840 122460 96544 113816 122446 + 96528 113804 96520 113798 96516 96514 80048 105564 96688 80024 105550 96664 + 113870 96652 80006 96646 71772 80092 71758 96732 80078 96718 96416 113752 + 122414 96400 113740 96392 113734 96388 96386 79960 105518 96472 79948 96460 + 79942 96454 71726 79982 96494 96336 113708 96328 113702 96324 96322 79916 + 96364 79910 96358 96296 113686 96292 96290 79894 96310 66936 99006 66876 + 66846 67006 68976 100028 68920 99998 68892 68878 66748 69052 66718 69022 + 73056 102072 116574 73008 102044 72984 102030 72972 72966 68792 99934 73144 + 68764 73116 68750 73102 66654 68830 73182 81216 106160 118620 81184 106136 + 118606 81168 106124 81160 106118 81156 81154 72880 101980 81328 72856 101966 + 81304 106190 81292 72838 81286 68700 72924 68686 81372 72910 81358 114336 + 122712 126894 114320 122700 114312 122694 114308 114306 81056 106072 118574 97696 + 81040 106060 97680 114380 106054 97672 81028 97668 81026 97666 72792 101934 + 81112 72780 97752 81100 72774 97740 81094 97734 68654 72814 81134 97774 + 114256 122668 114248 122662 114244 114242 80976 106028 97488 80968 106022 97480 + 114278 97476 80962 97474 72748 81004 72742 97516 80998 97510 114216 122646 + 114212 114210 80936 106006 97384 80932 97380 80930 97378 72726 80950 97398 + 114196 114194 80916 97332 80914 97330 66236 66206 67256 99166 67228 67214 + 66142 67294 69296 100188 69272 100174 69260 69254 67164 69340 67150 69326 + 73376 102232 116654 73360 102220 73352 102214 73348 73346 69208 100142 73432 + 102254 73420 69190 73414 67118 69230 73454 106320 118700 106312 118694 106308 + 106306 73296 102188 81616 106348 102182 81608 73284 81604 73282 81602 69164 + 73324 69158 81644 73318 81638 122792 126934 122788 122786 106280 118678 114536 + 106276 114532 106274 114530 73256 102166 81512 73252 98024 81508 73250 98020 + 81506 98018 69142 73270 81526 98038 122772 122770 106260 114484 106258 114482 + 73236 81460 73234 97908 81458 97906 122762 106250 114458 73226 81434 97850 + 66396 66382 67416 99246 67404 67398 66350 67438 69456 100268 69448 100262 + 69444 69442 67372 69484 67366 69478 102312 116694 102308 102306 69416 100246 + 73576 102326 73572 69410 73570 67350 69430 73590 118740 118738 102292 106420 + 102290 106418 69396 73524 69394 81780 73522 81778 118730 102282 106394 69386 + 73498 81722 66476 66470 67496 99286 67492 67490 66454 67510 100308 100306 + 67476 69556 67474 69554 116714 + ] + ] def + + % Return the 17 bits for a codeword in a given cluster + /cwtobits { + clusters exch get exch get /v exch def + [ 17 {0} repeat v 2 17 string cvrs {48 sub} forall ] + dup length 17 sub 17 getinterval + } bind def + + % Populate bitmap for the image + compact { + /rwid 17 c mul 17 add 17 add 1 add def + } { + /rwid 17 c mul 17 add 17 add 17 add 18 add def + } ifelse + /pixs rwid r mul array def + + 0 1 r 1 sub { + /i exch def + + i 3 mod 0 eq { + /lcw i 3 idiv 30 mul r 1 sub 3 idiv add def + /rcw i 3 idiv 30 mul c add 1 sub def + } if + i 3 mod 1 eq { + /lcw i 3 idiv 30 mul eclevel 3 mul add r 1 sub 3 mod add def + /rcw i 3 idiv 30 mul r 1 sub 3 idiv add def + } if + i 3 mod 2 eq { + /lcw i 3 idiv 30 mul c add 1 sub def + /rcw i 3 idiv 30 mul eclevel 3 mul add r 1 sub 3 mod add def + } if + + pixs rwid i mul [ + 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 + lcw i 3 mod cwtobits {} forall + cws c i mul c getinterval { i 3 mod cwtobits {} forall } forall + compact { + 1 + } { + rcw i 3 mod cwtobits {} forall + 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 + } ifelse + ] putinterval + + } for + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx rwid + /pixy r + /height r 72 div rowmult mul + /width rwid 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/pdf417 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER pdf417-- +% --BEGIN ENCODER pdf417compact-- +% --REQUIRES preamble raiseerror renmatrix pdf417-- +% --DESC: Compact PDF417 +% --EXAM: This is compact PDF417 +% --EXOP: columns=2 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp pdf417compact 0.0 2015050900 60668 60355 +%%BeginData: 43 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /pdf417 dup /uk.co.terryburton.bwipp findresource put +begin +/pdf417compact { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Get the result of encoding with pdf417 with compact option + options (dontdraw) true put + options (compact) true put + + /args barcode options //pdf417 exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/pdf417compact dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER pdf417compact-- + % --BEGIN ENCODER micropdf417-- % --REQUIRES preamble raiseerror renmatrix-- % --DESC: MicroPDF417 % --EXAM: MicroPDF417 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp micropdf417 0.0 0 0 0 -%%BeginData: 333 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\X4aVtcOu8C3D fBf4Df 0WC P ,i2 'C ia0N 4aW >WI?IQm30I a6V33Qn!BlU -*FE2M8P!+/T/Wr; \FcnqO 1OX V 5/Tc #UAW eit P#ZpnAWe*t 3A5;iFD5Z2F --8_M1OYEcDfBf4D f0WCOu %NL 8M=R lCis T4F !+t2CisT4F -8);1G 4@UX: eDe*F B@ZmR N1G O o[4NP !5$ bP')pIL]E5 5P"_#iD0'?Q -5&,lSP,XU.P'E-LP%'4LP,X6>P!5%&I=%,:D0'?Q5&-6EP'N4"C6ATNC6CcD1G<3GEas#uAKYi -2B8?P&P"_#pP!FGYOu%NLAM7S&FCTN9+Cno&@sOpR:-A79RiGB8Q?L'*s/ -G^XolA79RiGB4m9@<-0qDMSL[;MYL>CgpgnCh7L?#*N_a!Jgc>!KmbP1Lsp9@s9IB`Eas#uAKY]C#*NeY"-Q?)I?I0-Ou" -b.F(986>9Id(@WR\6P')pOL&h:;Cm"g^5(in:!!&0uOo^@@H]g@C",)hPP!4U&KT]5]P(R&'1G -!GumfF,0gZ98F:FCm"g9F(9 -9I!Kp*1!eHMNOo]E@@rmG-P"UN14HaND!Fp=pL]WA6P$!G@KT^)5G_QD<6IA79RiGB8oKP'(&n1OYEcI?IS`D.Rg0Bk)3,>9I.+!Jh -,>#D`D:!/Lqe+BsX&L^o4GL^8e:L^79/>DN<9&Vp[J,_uGV,[DNsL]N;GL^8eML]E5E>p*@-!J -hSK#`&eC!/M4m+BsX&L`D3VL`)!KL`p%H>DN?:#`&bB!Jg`3!F6gPL]WA?L^Akp*@-! -f.>B$&AkC!/Lnd+BsX'L_5FMLa7cVLa67K>DN?:'Sm-Q'8QXE'3u_bL]WAKL^f.HL]E5C>p*@- -!f.bN%u;0\!/Mk*+BsX(L^&YDL]N;4L]Ld(>DNB;#`&tH#D`V@#@/HVL]`G?L_,@QL_#:P>p*@ --",IAA&r7E])2K/9+BsX(L_#:VLa@j'La?=L>DNB;'SmZ`!Jh>D+^H3pL]`GOL`hKSL^AkL>p* -@-",J(U-AWCm*Jc"I+BsX(LaIp/L_#:`LbE$V>DNB;/;Q';!JhVL0jPo+L]iM:L^8eiL_GRp>p -*@-"Gd8<%#=q?!Jgb^+BsX)L^8eHL^/_@L^.3.>DNE<$A]7L%u:aP%p^;^L]iMBL_>L]L`)!d> -p*@-"GdSE'o4/l-&DNE<)MfMl!Jh&<&R?M`L]iMVLaIomL`M9t ->p*@-"GeC\/;Ogm+,DRU+BsX)Lb+?;L]N;LLbW0X?'6us@q/qaATVs,@ribs+BsX'L]rS;LaRu -YL_F&:>DN?:#)ED>p*@-!f.,<"c*G?!/N%/+BsX'L^AkAL^o -4@Lb;sU>DN?:$A\nB.u41](L8.fL]WA@L^/_ML]E5f>p*@-",I)9"GdGA.u5!I+BsX(L]rSDNB;#)EJ>"c+I\&R?M`L]`Gp*@-",I5=#Da+N!Jhn)+BsX)L]`G9L -a\&nLbrB[>DNE<"Gd5;.u5!t"'m$RL]iM;L^&YfL`2'R>p*@-"Gd8<#DaR[%Yu`C+BsX)L^/_A -L`M9XLacUP?'7!R@ps^;D.Rg0Bk)3,@q/qaATVs,@rmehI?IP_F`MDEF!,LAGB8p'06LcCCi^_ -/DesQ5DKCss0564BOu%G1G$K05kW7Gp$^-Cia0N1OYEcF^o?+F,0gZD09?,Ci^_/P&6?bHS9;Q@I?IP_Bcq,G!KmJH1OYEt05VhB@OpR:-@s+Di6*+Dr<=P,We_",))cK3aXc@s;u:DBN.+CO:j;I?K5=!*t -b5062,BCiDN<7"/("(3/@["Ck`%cP%oE.K3aWr062,MDeFe,Too_F1Pc'f!JU]LH]g@/F( -&m'B9GHA99MJZF)5c-L]`G6P)#3FI?I,SEcZ2?De+3N!g4FW!0V2^5)93%D3>$KEcZ&8B9GHA9 -9MJZF)5c-P!5%%Oo^:>TTX&1F(&m'B9GHA97;/MFcpm'!.C#1I?G)'1G<6VAS,Oq+BsX&CO:j; -I?K4gOu%mpL]M:<056S5Ou$TdAS,Oq+DDs.De3NmF!,1Q!KsFF99OO6L]N[Tos/RG^Y -`G@rGpjAoib.@rGpjAoib.P"Th:@;Kjp+DI!3EcZ2?De,#UI?I,S@rGpjAof))De3NmF,0g+De -3NmF-:!g!KsFF9Th2ADe3NmF-:!g!KsF!Kp*1"/0fZ@rGpjAof)1+DR(=L]N[U"!S9Mg!!->DKE)%U4G3\8?LWUJ!O$m( -!!-DNKE)%V5(in:?[RM,!VQ;B!!1O+KE)&;G_?%toY,tY!MmMa!!1MeKE)&;4G3\8UgSiU!R`r -\!!,VUKE)%K0SBE,dN!o?!D">d!!/l4KE)$D&;1#aVVm+-!Rl:H!!2>uKE)$H^k;[gVJq1g!Rj -/a!!,c$KE)%M3.q84diO/B!DG2#!!/r:KE)$Ji.M(2Vg*jp!Rnc9!!,i6KE)%N4G3\8:,mn,!N --ul!!,l?KE)%N^4ZIe:HX:1!Dabi!!/h0KE)&#E.e2lke)QK!MWtT!!1J,KE)&:SqI(E6pQD*! -MV9$!!1IeKE)$@+G9^qU)8O`!CRKP!!,InKE)$B^k;[gUMtkd!R\Q5!!,PsKE)%J3.q84d@Q!k -!Cebr!!/i7KE)$B(k_ki7LXqM!Cq*^!!/k-KE)$C3.q84URm,=!Cn,_!!,U&KE)%H@"\L\d("` -/!U*jC!!,DOKE)%H0SBE,d%#ah!C@o^!!/c1KE)&"Ne@B564eeM!MKpT!!,ClKE)%H#(usW6XY -QI!MR#V!!1I'KE)$?0SBE,Tq$c9!CI]W!!/dRKE)$?%"nT]6O&2D!MSA'!!,HIKE)$=5_K+!!/C)KE)%r4G3\ -8/7=,2!L>]u!!+W)KE)$((k_ki0&VB_!LJ%a!!19WKE)$*E.e2lQTTp$!A6?b!!+\lKE)$+G_? - %tQbJ+Q!A?Qg!!+aeKE)&,^k;[gm;R^Y!VX0Z!!1e]KE)&?3.q84p7?p;!OP+F!!1e-KE)&?* -/":mZlk#%!SSBD!!2HsKE)%[&;1#ag'iW7!Kt6O!!12\KE)&6]S$7c[_ROr!KpiD!!12$KE)&6 -SqI(E[U=ag!S]Se!!2JYKE)$h5_K+<,Tqa?!Kn:Q!!11OKE)$h+G9^q[MXYt!Gi=#!!+F^KE)% -:E.e2lah39,!H,]+!!+ESKE)%:3.q84ae".c!H):u!!0PgKE)&-SqI(EDD6_D!@AY:!!-sSKE) -$#E.e2lPIuPK!H2q1!!+H,KE)%:SqI(ED`ECM!OnYR!!.!XKE)$#]S$7cDnL`'!@OIl!!.#0KE -)&+@"\L\m'q]K!VTiQ!!0AjKE)&+0SBE,m$r_/!ONe@B5Z4MZh!SIm7!!0A2K -E)%Y"G?aUO^NhB!Q_d(!!2.eKE)%Z@"\L\OYDFg!Q^da!!-[sKE)#s+G9^qfpm]q!Q^:S!!-[S -KE)#s&;1#aOUQmC!G2mr!!0D7KE)%8#(usW+p>_E(XYon]"!SEcm!!2F]KE)%X&;1#afSkI`!O2o`!! -1`,KE)%X"G?aUYl]RY!?j^]!!/1cKE)%o>_E(X@mG\I!?iS=!!/1KKE)%o:4rTJ@j$F)!O8#F! -!1`tKE)$_&;1#a+UE`$!K`%h!!-R8KE)%XL4fO-@g%Gb!?n\#!!/2:KE)$_Y_2uW+ddo_!KbT[ -!!-SsKE)%Xc@c/u@uQ'@!?m2N!!-SaKE)$_gk5Y.A'T`-!O/5M!!1_SKE)&>/qa3*Y`OMCJ!F^Y7!!+3oKE)#qfRs5*@G$55!Fa3*!!-NJKE)&*/;+!(fHu7O!O -+nD!!/04KE)#q8;$sD@*"!$!FWj!!!-KEKE)%1^k;[g`GgJ1!TLbF!!.sbKE)%l3.q84'L7H)u!!*c>KE)#g^k;[gMf==L!QD^)!!*jCKE)%23.q84`L___ -!>[AB!!.utKE)#g(k_ki((>ir!>f^.!!/"jKE)#h3.q84Mk5S%!>c`/!!*nKKE)#hSqI(Ec!Z2 -)!TpnF!!2[tKE)%A5_K+Ajo!!.qdKE)%khLkk02dh:=!>@/?!!1@$KE)$30SBE,S -",-3!Juhi!!,"qKE)#d%"nT]2[k?>!>Dtr!!.r5KE)$3\:ah_':a^U!B6O%!!*anKE)#dhLkk0 -2r92f!Sp"o!!2MlKE)&I>_E(Xh&q@N!Uc>.!!2ghKE)&/&;1#amYlf!!Sn$7!!2MBKE)&/"G?a -UR6ZE*!R.d$!!24eKE)%b5_K+N!L]=.!!1!AiMa!!*\WKE)$sgk5Y.1X:XR!Sj?$!!2LiKE)&I/qa3*glR0h!U`X7!!1l2KE)& -@7YCaBgk:=\!Si9[!!/I[KE)%s=G-YTjt;;e!P+kV!!/IKKE)&@DM.uj\WDIE!SknP!!1;5KE) - %`LkGa/R"U+m!P*l:!!/I=KE)%`JqO+)&>4[V!Jjj2!!1"jKE)$-TS*:G&*n:!!.mn -KE)$-fRs5*&Boe-!HZnH!!+guKE)#a`e4!P$($!!/ -HRKE)%__Lqmi&5\#[!Ji:[!!+e#KE)#a8;$sDLaIcT!HHJ>!!+dpKE)%?AqU-bEQEe5!P%9F!! -*WtKE)$m`.S*k0Z&JC!HGu0!!+e?KE)$mm">?>ETVoS!U^_V!!1k!KE)%s(5)YgQm@=b!LP'a! -!*WZKE)$,BS6?dE9MrT!>$H.!!+c_KE)%,@"\L\$:'7E!JN4\!!*ELKE)%,(k_ki_N'9L!=BBk -!!.c^KE)#[#_W0YKa*21!=N:g!!.e`KE)%ihLkk0$S[56!JR%s!!*HEKE)%,Ne@B5$Oh[g!=K* -b!!*J;KE)%,hLkk0$_2kM!=Op@!!*JaKE)%45_K+<`it*r!TRF_E(X)aK&V!=9m%!!1*pKE)%i:4rTJ)^'e6!K -EJ"!!1*bKE)#l&;1#a#mc1a!JH2\!!+#EKE)%4L4fO-#m,b[!=>u`!!.c.KE)#lY_2uW$(-AG! -JJaO!!+%+KE)%4c@c/u)iTFM!==L6!!*D]KE)#lgk5Y.$-n2(!?9=;!!1BJ)!=2#F!!.GfKE)%dk(E^8(rCq+!IMb?>#\J_i!BKM"!!*r!KE)%"m">?>3Tbtp!INs^!!2O:KE)&IQ@o5=mj*Pd!Uh4c!!1@nKE)&9( -5)YghIqQB!Uhq"!!1qeKE)%u,(opshI;-oL'!!/$:KE)$4k_&p:(hA:"!=0m&!!.B/KE)$ -4jFdL6(h/-u!I1S!!.?:KE)$tnq6uD"[I_@!9B7!L/Nl$GL!!M4Cd!!/*8KE)%eoN`SDKE)&G@ -"\L\qRD1Y!U;q'!!2aHKE)&LS:gkCl6(`[!VI:_!!2qVKE)&<&;1#aoaHKR!U9rD!!2`sKE)&< -"G?aUlX5AG!VNsU!!2rQKE)&(5_K+!U2k&!!2_rKE)&L>_E(XkobWZ!VDb4!!2p -kKE)&;&;1#aoSeG'!U0lC!!2_HKE)&;"G?aUklQMgKE)&Fgk5Y.dia;D!U5u)!!2 -`;KE)&%&;1#al&:8q!Rh=-!!2>=KE)&%"G?aUdfP1&!N/29!!1QQKE)&;gk5Y.V]^Wm!RmEh!! -2?0KE)%N&;1#adu8q[!N-3V!!1Q'KE)%N"G?aUVZMMO!Dbt6!!0"%KE)&%gk5Y.:EY;j!N2<m!!2^]KE)&:KS0 =+k ^nHf! R[Qn! !2 <9K E)& FDM. -ujd?'"]!U.a\!!1 K'KE) &: `e4! Mb =$! !/jHKE )$ CTS*:G UY( -5"!R^=g!!,TOKE) %Jb_, rs7 u2f u !Md Yf! !,T CKE)$C Jq O+)8(` Ip! -Mf(9!!,U6KE)$C` e4e "!! ,CFKE)&:'S HGekRrOK!RN -ZV!!1G%KE)%GFG' VpTQ5 \c!T cS"!! 2YpK E)& K>_E(XjWK3 V!V2V2!!2mj -KE)&7&;1#anr/5% !TaT? !!2YF KE)&7 "G? aUjT:)8!R! `]!!22cKE)& -Dgk5Y.b92H&;1#abD_)S!LF(F!!18tKE)%>"G?aU -QNDg?!A?]k!!/FjKE)%rgk5Y.0-GoJ!LK1,!!19gKE)$+&;1#aQ]-Rt!A=_3!!/F@KE)$+"G?a -U0c@c/u08tPa!AB1\!!+b.KE)$+c@c/up7R'=!W,uP!!-m)KE)&HOG! -T7qb2YC!GV=^!!2eLKE)&M7YCaBB`*M`!VV2"!!2eFKE)&6TS*:GnlUPF!Vn@$!!2J[KE)&6OG -!T7qeh&e!UYu%!!2f;KE)&D7YCaBm>-Dq!T\oe!!2J?KE)&6JqO+)m=Kuk!Qh!f!!205KE)&DD -M.ujgRs3"!QgFV!!20)KE)&-OG!T7mEC4`!T_7R!!1i1KE)%pKS0=+gOt4[!QfqH!!1i+KE)%: -TS*:Gak27H!T`[%!!0R%KE)%:OG!T7aioDm)"DU!Q`W@!!2.sKE)&+d"DB"aN0#7!T[jG!!1co -KE)&>k(E^8fu/OD!Q`-2!!1ciKE)%8d"DB"aR"Q[!OL.+!!/5'KE)%ok(E^8ZcIe"!SQUg!!0F -EKE)%8_LqmiZbh@q!@,sE!!/5KKE)$cd"DB",KPNfH'!@,I7!!- -`LKE)#tm">?>BC(9O!@-`[!!-`pKE)&H."hR$q\Fhb!Fkt[!!2d=KE)$^IY7\%p*,.i!TYY^!! -2X+KE)&>BS6?dp,7R(!UO?M!!2.)KE)&>@Y=^^aCp5,!TZ.l!!1a9KE)%oA:sp`f]7\c!Q\`'! -!1a3KE)%7k_&p:aEE4:!O:jA!!1aGKE)%XjFdL6OQ(on!O:X;!!+8,KE)%7p4NDHA*ARG!?pNW -!!-TjKE)#rie.:4A)`.A!?q/i!!-U'KE)&H'SHGe@=Ek0!VR.Z!!2-pKE)&>1kYi0j:[+G!UMR -p!!1.tKE)&*FG'Vpa>/DK!SDFG!!/1'KE)%WoRm2FOE-!S!O2-J!!+57KE)$]oRm2F+S(0c!Fb -PP!!2d#KE)&6$A8B[ll(NW!QZ14!!1_5KE)%73eRJ6Y^1s&!TKc*!!2UlKE)&JY(QcUifJfn!V -&j:!!2)8KE)&C7YCaBie2sb!TJ]a!!1'3KE)&4fRs5*nSX![!QC.R!!2*'KE)%lLkGa/il6WO! -QB_F!!1&jKE)%2TS*:G`RohD!TNO#!!/">KE)%lb_,rsMhm#d!QE'3!!/"2KE)%2JqO+)(SHE] -!K5T`!!1(,KE)#hOG!T7Mp-hS!>gQF!!/"tKE)#hKS0=+(P7;?!>jCA!!/#GKE)#hb_,rs(WM+ -.!>k0W!!2[fKE)&KXFpQS2>Dh)!V8j8!!2nmKE)$0r.G%No0e63!Ao7Y!!2[XKE)&4:kSfLnLT -=n!Tqa^!!2(MKE)&C-A2@"k/`2U!V9oV!!26#KE)&46A,=>k/)cO!Q88!Q;j.!!1?]KE)%0d"DB"`9`-W!LqGh!!.qtKE)%kk(E^8S -&g6_!R9b[!!/S-KE)%0_LqmiS&0gY!>Eh5!!.rCKE)$3d"DB"'?Gh,!K#rl!!,%"KE)%Bk(E^8 -2oL@L!>E>'!!,$qKE)#dm">?>2sc1t!>FUK!!,%@KE)&MW.Y-OFmt%a!P82^!!2tmKE)$ppk/V -J\pf;4!W/UE!!.1hKE)$p5(in:o-f7l!Vr%7!!+kQKE)&IBS6?dqmM.X!I"Bo!!+j(KE)&IA:s -p`o-/hf!HrpF!!2h'KE)&4."hR$nJ6cX!Tn'K!!2()KE)&@k_&p:pND2i!TG;V!!2NKKE)&8@Y -=^^mc&m"!Q8Z)!!2(;KE)%sk_&p:`+4N$!Susm!!1=)KE)%k@Y=^^h;j4h!R0PV!!1p8KE)%/k -_&p:`--e6!L`/)!!.o:KE)%bk_&p:RH0#$!Jo`g!!0^mKE)%@ie.:4]AeJD!>4OK!!.oLKE)$/ -k_&p:&`eTF!I*a\!!+n:KE)#bie.:4GN=DW!Ai_g!!.<'KE)#bp4NDH1\QJ%!W/+7!!.-8KE)% -`IY7\%qiZU4!HNR@!!.+(KE)&E'SHGe0n+cU!V\F(!!2[(KE)$oIY7\%pG.C%!TFfH!!24=KE) -&4&qg5cmW=*^!Tl.j!!2M.KE)%k1kYi0b]JL+gT!!.05KE)$-nq6uDF7Ota!W.b-!!.(eK -E)$m5(in:o*U-N!V[Lc!!2'dKE)&8)MA(kmQ-"$!Q5n0!!1;)KE)&.H@u8!LcU1h!LS1d!!0V+ -KE)#aH@u8!0`$G&!HIsh!!.&QKE)&3:kSfLn>q9C!T?S&!!2SdKE)&37"bO@iBi1t!Q*3:!!2% -pKE)%iaFjNoiF[`C!Q)d.!!0sRKE)%,d"DB"_X)pU!JSUJ!!0t!KE)%,`.S*kKu/KC!=R8-!!. -f?KE)#\aFjNoL$"$g!=Qi!!!*JEKE)#\m">?>$g**B!V*+A!!2lGKE)#kr.G%NnYCg&R^!=87L!!,1RKE)#jnq6uD47\%)!IF6g!!0c\KE)%!G_?%t]fq)L! -I?k]!!.BeKE)&Kb(K`q3IHJ[!W1T(!!.FoKE)$55(in:HTm)_!V)&#!!2\[KE)&I\qC%aiX!!/VdKE)%dqLehL#^V. -(!>tZd!!,+VKE)$uG_?%t]Y9%!!I6e\!!.?dKE)$4^4ZIeH+nq3!I281!!.>9KE)$t?A&:Zi2D -;/!T9c,!!2#PKE)%hBS6?di3n:=!Pr<"!!0oFKE)%)k_&p:_01J3!J9Bc!!.]2KE)#Vk_&p:K( -ait!!!.[4KE)%-H@u8 -!Nr"D/!dH!!1SuKE)$Ln:UcBW-j6u!Dn#o!!2rCKE)$Wi.M(2Xn[PL! -W'lj!!-6lKE)%Sr.G%NqS\$e!Ef,M!!00MKE)&L_Lqmi=F>c%!VOfm!!2r_KE)$Ypk/VJouMdd -!W(r3!!-@&KE)&G`.S*k>^h>+!VO<_!!2E4KE)&Gm">?>lc=_Z!VPT.!!2E(KE)&=_Lqmif?f0 -N!UK**!!1]mKE)&=k(E^8f>N=B!S>2A!!0:MKE)&)m">?>YK2@s!S?Ie!!0:AKE)$G^k;[gV=9 --+!!2q0KE)$In:UcBVY -l)I!W$>[!!,dgKE)%MIY7\%qI5*X!DIlo!!,bWKE)&Fk_&p:qK@Ml!D`QG!!2`QKE)$JIY7\%o -\tN(!U8g$!!2`cKE)&;jFdL6l/I?r!Rp7c!!2?XKE)&%jFdL6e)H#\!N5.7!!1RBKE)%NjFdL6 -VrE@0!Cbq"!!/hhKE)&#IY7\%7.>j0!MXsp!!,K4KE)%I5(in:6p-,&!CRu^!!2pQKE)$Bpk/V -JUOIjr!W"R)!!,Q:KE)$B5(in:oQ5`d!CqTl!!2_4KE)&:oRm2FkjjB,!R^Om!!1LG_?%tTg",0!CAo%!!,D-KE)&L)MA(k6[XOe!CK&(!!2^QKE)&:H@ -u8!d/&Cq!C:s`!!/b,KE)$=4G3\85ot[Z!C=GQ!!,?tKE)$KE)&6H@u8!m.uA8!Qb+j!!1dLKE)%8qLehL@c2n>!O6m&!!1`dKE)$^E.e2lYrm[>!Fe$A -!!0>GKE)$^*/":m@Le%k!?l]@!!/1qKE)$_G_?%t+ZtDX!Fn6F!!+5aKE)$_*eXLo+hiU0!Fri -s!!-MIKE)%W]S$7c@5ro?!O//K!!-LJKE)$]%YOf_+M<@-!F`Wo!!+46KE)$]SqI(E@(:ji!O, -m`!!-JtKE)$\Ne@B5+C9^$!FXc;!!-J4KE)$\:4rTJ(#X`F!K-Z*!!1&fKE)#en:UcBML:'W!> -Kd3!!.s@KE)#e4G3\8'HVo-!Vj$T!!*l1KE)%2IY7\%pp,PQ!>^'9!!*j!KE)&CFG'Vp(Oh#;! -V(2`!!2*OKE)&4nq6uD`Unf`!QFV_!!/#MKE)%2nq6uD28FkF!LiM2!!1>lKE)$0i.M(2RWsJc -!R3f]!!+oqKE)%A4G3\81cU-g!Lb'_!!+nrKE)$0%YOf_'(CPS!Ju2W!!,"IKE)#cG_?%tM*?R -m!B,1U!!/QQKE)$24G3\8&fu]+!B)!P!!2k`KE)#dI"VJ#q7;4Z!B5CZ!!*`sKE)$35(in:nN) -='!V:Vj!!2)*KE)&8qLehL`;5,e!R:Io!!.rQKE)%ai.M(2h0=SQ!Ud[T!!.2WKE)%aE.e2lh) -p>j!H__&!!0YjKE)&/*eXLoF>/@J!P08(!!.0YKE)%a%YOf_F:-B+!!.:+KE)$/*eXLoG92D;!>3&!!!+miKE)$s^4ZI -eEkm>.!P*0&!!1lfKE)$n@"\L\\N#6B!Sj9"!!.*oKE)%`*/":mEYsH0!P&\n!!.*KKE)$n#(u -sW0lVdG!LUNQ!!..[KE)$-3.q84R%As2!HU5R!!0X%KE)$o*/":m0b/j:!HSa(!!*YDKE)$-]S -$7c&>"OT!HYo,!!+gGKE)$oSqI(EEF=G"!P#Xm!!1k]KE)$m0SBE,\=A3P!HAs0!!0TiKE)$m% -"nT]E<_'r!AM$:!!/HnKE)$m\:ah_0V!dr!HFW_!!+d6KE)$mNe@B5&71"i!ANA`!!.)rKE)$l -Y_2uW\6O[e!H=EZ!!0T)KE)$lN._03E/'#G!AIc3!!.&oKE)$,:4rTJE6a+:!H;.o!!0S^KE)$ -l9Sul1!!,/$KE)#j%YOf_3t?oD!=6>k!!*t -MKE)#YSqI(E41p4H!?%J^!!,0QKE)%d@"\L\hRJ4=!Uj?J!!.C2KE)%d0SBE,hOK6!!I>lA!!0 -bMKE)&0Ne@B5H4Y`0!PJnp!!.BOKE)%d#(usWH3Am$!BFP@!!/V"KE)%u?A&:ZHXML,!BDie!! -/U[KE)%"0SBE,]ps`U!M#1'!!.E`KE)$5%"nT]HOPQ-!BC@;!!.ENKE)#i\:ah_N*_/;!BIZC! -!*q,KE)%"\:ah_3Lka&!>piM!!.G:KE)$5Ne@B5H]EaZ!=3"b!!*qnKE)$5hLkk0HesDU!I6q` -!!0a:KE)&0>_E(XGp%b?!PFeQ!!1qOKE)$u&;1#a]SqLD!I4s(!!0`eKE)$u"G?aUGliX!!B@< -:!!/TpKE)$uY_2uW31,@!!Luoge!!.A"KE)#i>_E(X38B/e!>n -Rb!!.B#KE)$4c@c/uH-V'C!I18j!!0`7KE)&0/qa3*G`[RY!PD*Z!!.>#KE)%c7YCaBG_C_M!I -03L!!,&]KE)%C/qa3*Gh@ZL!BgKE)$47YCaBGfGC:!>mGB!!,&sKE)$tmXtQ@GYj%n! -PBt:!!.=8KE)%c-A2@"GXR2b!I-qa!!,&1KE)$tCkMch3$s:Y!I/40!!.o!j -G0!KN1n!!+)KKE)#n#(usW%(Lrj!JXp6!!++MKE)#]S:gkC*Lqc_!=Y!A!!++#KE)#U?A&:Z%, -QX;!?L$M!!,5JKE)%EY_2uWcWl,'!BhQY!!/[YKE)&!:4rTJ4V38H!M57'!!,4gKE)%EL4fO-4 -TpE_E(X4g9S>!?@J[!!/*TKE)$9R"PG?T$Duh!BlBp!!+'oKE)$9L4fO- -$s\Gc!?BmJ!!*L'KE)$9gk5Y.*6s3;!Bn_]!!0g,KE)&1=G-YTn#hEOV!Bc$g!!.M$KE)$8JqO+)I=d+P!?>3p!!/*4KE)$8fRs5**))"c!I`UR!!,4+KE)#m7Y -CaBIE[?E!BeAT!!.MfKE)#]/qa3**,^E0!Bfe'!!.N9KE)%e:kSfLh^jE\!PV*X!!1t(KE)%e7 -"bO@^-[JQ!Ba23!!/ZBKE)%#d"DB"4@k,*!M1Wk!!.JgKE)%eAqU-bI)L[!!.K6KE)$8AqU-bI--(^!PTt8!!1smKE)%e,_Q-u^*841!B_c`!!/Z,KE)% -#BS6?d4=#R[!ISF2!!,2+KE)%#@Y=^^*#=2-!B`8n!!.IjKE)%e'SHGe^(Q)!!B_'L!!.I(KE) -$8&qg5cHnp?T!e!!.j[KE -)#_R"PG?LJEL&!=k'A!!*RaKE)#W>_E(X%bu^;!*`.Li!KSdb!!,: -1KE)%FCkMchO!]M[!C"SX!!+-/KE)$:`.S*k*^YM[!C"AR!!*Q\KE)#oCkMch%OQi/!C#k'!!+ --QKE)$:k(E^8hl)2.!UnTm!!1uQKE)&1U4`LIT.#?m!RI'b!!0iJKE)%F,_Q-u^LVut!M:Qh!! -0iDKE)#o."hR$Nu!BK!Bt1M!!+,dKE)%%k_&p:5%K_E(X"&=LL!=)_ -[!!._TKE)#X9Sg6!!*T;KE)#p)MA(k5<=Gt -!<]EV!!*2!KE)#X W.Y-O K@Y\U !=,ER !! *>! KE)#TQ @o5=#I] -9c!Jf0X!!.l'KE) #XP _9#;& %$ui! =+ d@! !*V 9KE) - %nl9 I. )"!WI %U4r cU L'' 2c"*0 +uH A2M_L ',#A -".FrHg4f^PL'*,L '*Tn "4 Do+ eqO:VL '* Zp"13d bUk -SuKL'+T5"0@4ZW. kC&L' &u] ""o < 1-A DU\ L'+ l="."Z D( 5;o*L' '8e -"*B8"A;11uL')=J ")N\o BSH U[L '( P4 "'g Q_? A8PWL' (, ("%7kG 7YV -"3L'(mj+BsR%c@u BqL& u7I !\ T3 /-A DR[ L&r -F!Y -U4h)MS;SL&s,b![ <@#@ Y Or )L &u[ U!r @WQn qI5>L -&uOQ!d'.uA;1.tL &si!!^ _VC _ M/- OL '$Ll !p# (;m"PRXL&r o\![rd)BSHT -PL'#GN!mHB#`.e? 5L'!*a !fi ! :N.q D(L' !`s !kDNlP,4DOV^2i(@f -@pL3eL]N[oUCm#*f1Pc$e!HNt -sP,Wd]Bp(ZC1G<6SF*&O=+ECn0Cm"gT!KsF<"-RD^1N7&QF!,LIBk/?#P&+>F@u(/K4aUlcEa` -p'Oo^@>P,X6oP%odQEa`p/DdmF&F-6TfF^oW:+DI!3@r-4.+CfV;DdmF&F-6TfF_Mt=@;p7M!J -gc>WJEBoC5;k1@;p=,@VKq*OogehI?IQ>L]W`&HYFUC@;p%G!Jgc>WJEBoC5;k1@;p=,@VKq*O -ogeh@s;u:BnuhRCm%G$Cia\@@s<$5@VKq*Oogeh@s;u:BnuhRCkr+T!Kp)cCia\@@s<$5@VKq* -OogehBcqG)E,q*BL]N[P,X6oP%odQEa`p/DdmF&F-6TfFa]EP@s;u:BnukSCm%G$Cia\@@s<$5@VKq*OogehBcqG)E+> - %3L]N[P"T;$F*&O7GB@b4BlnEZ!g7\9G -B4m@L]`fVL]W_?P"T;$F*&O7GB@b4BlnEZ!g7\?+ECn0EfpHZ!KsF<1m2U0!-2LeFDkW&FEP,X6oP%o -dREa`p/DdmF&F-6TfF^oW:+DHW7P&,pUOo^_=@r-4.+CfV;DdmF&F-6TfF^oW:+DHW7P&,pVOo -^_=@r-4.+CfV;DdmF&F-6TfF_Mt=@;p7M!Jgc>WJEBoC5;k1@;p=,@VKq*OogehI?IQc!F:k6I -?I,`4>1_dDD*Y`ASu?nFE2)?05tWMF!,F9G]PNWBm=kFEd)5.05tWMGp%,\BOtmjBQPA;Le*[e -Ec6/=F_l/_CbL!HA9;K-Ed)5.Le*[e05kfO+E)4@Bl@m1+?ht3A8c@-A9)+&P&N'-Eb0-*@ -% uk.co.terryburton.bwipp/micropdf417 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp micropdf417 0.0 2015050900 200331 213151 +%%BeginData: 952 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/micropdf417 { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /columns 0 def + /rows 0 def + /rowmult 2 def + /encoding (auto) def + /cca false def + /ccb false def + /raw false def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /columns columns cvi def + /rows rows cvi def + /rowmult rowmult cvr def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + raw {/encoding (raw) def} if + cca {/encoding (cca) def} if + + % Convert input into array of codewords + encoding (raw) eq encoding (cca) eq or { + /datcws barcode length array def + /i 0 def /j 0 def + { % loop + i barcode length eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + datcws j cw put + /i i 4 add def + /j j 1 add def + } loop + /datcws datcws 0 j getinterval def + } if + + /barcode [ barcode {} forall ] def + /barlen barcode length def + + ccb {/encoding (ccb) def} if + + /encb { + /in exch def + /inlen in length def + /out inlen 6 idiv 5 mul inlen 6 mod add array def + 0 1 inlen 6 idiv 1 sub { + /k exch def + /msbs [ in k 6 mul 3 getinterval aload pop ] def + /mscs [ + msbs aload pop exch 256 mul add exch 65536 mul add + 3 {dup 900 mod exch 900 idiv} repeat + ] def + /lsbs [ in k 6 mul 3 add 3 getinterval aload pop ] def + /lscs [ + lsbs aload pop exch 256 mul add exch 65536 mul add + 3 {dup 900 mod exch 900 idiv} repeat + ] def + lscs 0 get mscs 0 get 316 mul add + out k 5 mul 4 add 2 index 900 mod put + 900 idiv lscs 1 get add mscs 0 get 641 mul add mscs 1 get 316 mul add + out k 5 mul 3 add 2 index 900 mod put + 900 idiv lscs 2 get add mscs 0 get 20 mul add mscs 1 get 641 mul add mscs 2 get 316 mul add + out k 5 mul 2 add 2 index 900 mod put + 900 idiv lscs 3 get add mscs 1 get 20 mul add mscs 2 get 641 mul add + out k 5 mul 1 add 2 index 900 mod put + 900 idiv mscs 2 get 20 mul add + out k 5 mul 3 -1 roll 900 mod put + } for + /rem inlen 6 mod def + rem 0 ne { + out out length rem sub + [ in inlen rem sub rem getinterval aload pop ] + putinterval + } if + out + } bind def + + encoding (byte) eq encoding (ccb) eq or { + /datcws barlen 6 idiv 5 mul barlen 6 mod add 1 add array def + datcws 0 barlen 6 mod 0 eq {924} {901} ifelse put + datcws 1 barcode encb putinterval + encoding (ccb) eq {/datcws [920 datcws aload pop] def} if + } if + + encoding (auto) eq { + + % Modes and text submodes + /T 0 def /N 1 def /B 2 def + /A 0 def /L 1 def /M 2 def /P 3 def + + % Special function characters for mode switching + /tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def + + % Special function characters for text mode + /al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def + + % Character maps for each state + /charmaps [ + % A L M P + [ (A) (a) (0) (;) ] % 0 + [ (B) (b) (1) (<) ] % 1 + [ (C) (c) (2) (>) ] % 2 + [ (D) (d) (3) (@) ] % 3 + [ (E) (e) (4) ([) ] % 4 + [ (F) (f) (5) 92 ] % 5 + [ (G) (g) (6) (]) ] % 6 + [ (H) (h) (7) (_) ] % 7 + [ (I) (i) (8) (`) ] % 8 + [ (J) (j) (9) (~) ] % 9 + [ (K) (k) (&) (!) ] % 10 + [ (L) (l) 13 13 ] % 11 + [ (M) (m) 9 9 ] % 12 + [ (N) (n) (,) (,) ] % 13 + [ (O) (o) (:) (:) ] % 14 + [ (P) (p) (#) 10 ] % 15 + [ (Q) (q) (-) (-) ] % 16 + [ (R) (r) (.) (.) ] % 17 + [ (S) (s) ($) ($) ] % 18 + [ (T) (t) (/) (/) ] % 19 + [ (U) (u) (+) (") ] % 20 + [ (V) (v) (%) (|) ] % 21 + [ (W) (w) (*) (*) ] % 22 + [ (X) (x) (=) 40 ] % 23 + [ (Y) (y) (^) 41 ] % 24 + [ (Z) (z) pl (?) ] % 25 + [ ( ) ( ) ( ) ({) ] % 26 + [ ll as ll (}) ] % 27 + [ ml ml al (') ] % 28 + [ ps ps ps al ] % 29 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 30 dict 30 dict 30 dict 30 dict ] def + /alltext 104 dict def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 3 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + dup charvals j get exch i put + alltext exch -1 put + } for + } for + + /e 10000 def % "Empty" + + /latlen [ % Bit length of latch between submodes + % To: A L M P From + [ 0 1 1 2 ] % A + [ 2 0 1 2 ] % L + [ 1 1 0 1 ] % M + [ 1 2 2 0 ] % P + ] def + + /latseq [ % Latch sequences between submodes + % To: A L M P From + [ [] [ll] [ml] [ml pl] ] % A + [ [ml al] [] [ml] [ml pl] ] % L + [ [al] [ll] [] [pl] ] % M + [ [al] [al ll] [al ml] [] ] % P + ] def + + /shftlen [ % Bit length of shift to submode + % To: A L M P From + [ e e e 1 ] % A + [ 1 e e 1 ] % L + [ e e e 1 ] % M + [ e e e e ] % P + ] def + + % Determine runlengths of digits + /numdigits [ barlen {0} repeat 0 ] def + /numtext [ barlen {0} repeat 0 ] def + /numbytes [ barlen {0} repeat 0 ] def + barlen 1 sub -1 0 { + /i exch def + barcode i get dup 48 ge exch 57 le and { + numdigits i numdigits i 1 add get 1 add put + } if + alltext barcode i get known numdigits i get 13 lt and { + numtext i numtext i 1 add get 1 add put + } if + numtext i get 5 lt numdigits i get 13 lt and { + numbytes i numbytes i 1 add get 1 add put + } if + } for + /numdigits numdigits 0 barlen getinterval def + /numtext numtext 0 barlen getinterval def + /numbytes numbytes 0 barlen getinterval def + + /seq [] def /seqlen 0 def /state B def /p 0 def { % loop + p barlen eq {exit} if + /n numdigits p get def + n 13 ge { + /seq [ + seq aload pop + nl + [ barcode p n getinterval aload pop ] + ] def + /state N def + /p p n add def + /seqlen seqlen 1 add n add def + } { % next + /t numtext p get def + t 5 ge { + /seq [ + seq aload pop + state T ne {tl} if + [ barcode p t getinterval aload pop ] + ] def + /state T def + /p p t add def + /seqlen seqlen 1 add t add def % ish + } { % next + /b numbytes p get def + b 1 eq state T eq and { + /seq [ + seq aload pop + bs + [ barcode p get ] + ] def + /p p b add def + /seqlen seqlen 2 add def + } { % next + /seq [ + seq aload pop + b 6 mod 0 ne {bl} {bl6} ifelse + [ barcode p b getinterval aload pop ] + ] def + /state B def + /p p b add def + /seqlen seqlen 1 add b add def + } ifelse } ifelse } ifelse + } loop + + /latchcws << + tl 900 bl 901 bl6 924 nl 902 bs 913 + >> def + + % Submode encoding functions + /enca {charvals A get exch get} bind def + /encl {charvals L get exch get} bind def + /encm {charvals M get exch get} bind def + /encp {charvals P get exch get} bind def + /textencfuncs [ /enca /encl /encm /encp ] def + + /addtotext { + text exch l exch put + /l l 1 add def + } bind def + + /enct { + + /in exch def + + /curlen [ e e e e ] def + curlen submode 0 put + /curseq [ [] [] [] [] ] def + + % Derive the optimal sequences ending in each submode + in { + + /char exch def + + % Check for optimisations in the current sequences by latching from x to y + { % loop + /imp false def + [ A L M P ] { + /x exch def + [ A L M P ] { + /y exch def + /cost curlen x get latlen x get y get add def + cost curlen y get lt { + curlen y cost put + curseq y [ + curseq x get aload pop + latseq x get y get aload pop + ] put + /imp true def + } if + } forall + } forall + imp not {exit} if % Repeat unless no improvement + } loop + + % Determine optimal next sequences for each valid encoding + /nxtlen [ e e e e ] def + /nxtseq 4 array def + + [ A L M P ] { + /x exch def + + { % loop for common exit + + charvals x get char known not {exit} if + + % Extend directly + /cost curlen x get 1 add def + cost nxtlen x get lt { + nxtlen x cost put + nxtseq x [ curseq x get aload pop char ] put + } if + + % Optimise for direct shifts from y to x + [ A L M P ] { + /y exch def + x y ne { + /cost curlen y get shftlen y get x get add 1 add def + cost nxtlen y get lt { + nxtlen y cost put + nxtseq y [ + curseq y get aload pop + x A eq {as} {ps} ifelse + char + ] put + } if + } if + } forall + + exit + } loop + + } forall + + /curlen nxtlen def + /curseq nxtseq def + + } forall + + % Select the optimal sequence + /minseq e def + [ A L M P ] { + /k exch def + curlen k get minseq lt { + /minseq curlen k get def + /txtseq curseq k get def + } if + } forall + + % Encode the sequence + /text minseq array def + /k 0 def /l 0 def { + k txtseq length ge {exit} if + + /char txtseq k get def + + % Encode character + char textencfuncs submode get load exec addtotext + /k k 1 add def + + % Encode shifted next character + char as eq char ps eq or { + txtseq k get char as eq {enca} {encp} ifelse addtotext + /k k 1 add def + } if + + % Latches to new submode + char al eq {/submode A def} if + char ll eq {/submode L def} if + char ml eq {/submode M def} if + char pl eq {/submode P def} if + } loop + + text length 2 mod 1 eq { + submode P eq { + /pad al encp def + /submode A def + } { + /pad ps textencfuncs submode get load exec def + } ifelse + /text [ text aload pop pad ] def + } if + + /out text length 2 idiv array def + 0 1 out length 1 sub { + /k exch def + out k text k 2 mul get 30 mul text k 2 mul 1 add get add put + } for + + out + + } bind def + + /encn { + /in exch def + /out [] def + 0 44 in length 1 sub { + /k exch def + /gmod [ + 1 in k in length k sub dup 44 gt {pop 44} if getinterval + {48 sub} forall + ] def + /cwn [] def { + /dv 900 def + /gmul [] def /val 0 def { + gmod length 0 eq {exit} if + /val val 10 mul gmod 0 get add def + /gmod gmod 1 gmod length 1 sub getinterval def + val dv lt { + gmul length 0 ne { + /gmul [ gmul aload pop 0 ] def + } if + } { + /gmul [ gmul aload pop val dv idiv ] def + } ifelse + /val val dv mod def + } loop + /dv val def + /cwn [ dv cwn aload pop ] def + /gmod gmul def + gmul length 0 eq {exit} if + } loop + /out [ out aload pop cwn aload pop ] def + } for + out + } bind def + + /encfuncs [ /enct /encn /encb ] def + + /addtocws { + dup datcws j 3 -1 roll putinterval + length j add /j exch def + } bind def + + % Encode the sequence + /state T def /submode A def + /datcws seqlen array def + /i 0 def /j 0 def { + i seq length ge {exit} if + /chars seq i get def + chars type /arraytype eq { % Encode data according to mode + chars encfuncs state get load exec addtocws + } { % Encode the latch to new state or byte shift + [ latchcws chars get ] addtocws + chars tl eq {/state T def /submode A def} if + chars nl eq {/state N def} if + chars bl eq chars bl6 eq or {/state B def} if + chars bs eq { + /i i 1 add def + seq i get encb addtocws + } if + } ifelse + /i i 1 add def + } loop + /datcws datcws 0 j getinterval def + } if + + % Basic metrics for the each symbol + % c r ecw rl rc rr + /metrics [ + [ 1 11 7 1 0 9 ] + [ 1 14 7 8 0 8 ] + [ 1 17 7 36 0 36 ] + [ 1 20 8 19 0 19 ] + [ 1 24 8 9 0 17 ] + [ 1 28 8 25 0 33 ] + [ 2 8 8 1 0 1 ] + [ 2 11 9 1 0 9 ] + [ 2 14 9 8 0 8 ] + [ 2 17 10 36 0 36 ] + [ 2 20 11 19 0 19 ] + [ 2 23 13 9 0 17 ] + [ 2 26 15 27 0 35 ] + [ 3 6 12 1 1 1 ] + [ 3 8 14 7 7 7 ] + [ 3 10 16 15 15 15 ] + [ 3 12 18 25 25 25 ] + [ 3 15 21 37 37 37 ] + [ 3 20 26 1 17 33 ] + [ 3 26 32 1 9 17 ] + [ 3 32 38 21 29 37 ] + [ 3 38 44 15 31 47 ] + [ 3 44 50 1 25 49 ] + [ 4 4 8 47 19 43 ] + [ 4 6 12 1 1 1 ] + [ 4 8 14 7 7 7 ] + [ 4 10 16 15 15 15 ] + [ 4 12 18 25 25 25 ] + [ 4 15 21 37 37 37 ] + [ 4 20 26 1 17 33 ] + [ 4 26 32 1 9 17 ] + [ 4 32 38 21 29 37 ] + [ 4 38 44 15 31 47 ] + [ 4 44 50 1 25 49 ] + ] def + + % Basic metrics for the each symbol + % c r ecw rl rc rr + /ccametrics [ + [ 2 5 4 39 0 19 ] + [ 2 6 4 1 0 33 ] + [ 2 7 5 32 0 12 ] + [ 2 8 5 8 0 40 ] + [ 2 9 6 14 0 46 ] + [ 2 10 6 43 0 23 ] + [ 2 12 7 20 0 52 ] + [ 3 4 4 11 43 23 ] + [ 3 5 5 1 33 13 ] + [ 3 6 6 5 37 17 ] + [ 3 7 7 15 47 27 ] + [ 3 8 7 21 1 33 ] + [ 4 3 4 40 20 52 ] + [ 4 4 5 43 23 3 ] + [ 4 5 6 46 26 6 ] + [ 4 6 7 34 14 46 ] + [ 4 7 8 29 9 41 ] + ] def + cca {/metrics ccametrics def} if + + % Select metrics of an appropriate symbol + /urows rows def + /ucols columns def + /i 0 def + { % loop + /m metrics i get def + /c m 0 get def % Columns in symbol + /r m 1 get def % Rows in symbol + /k m 2 get def % Error correction codewords + /rapl m 3 get def % Left row address pattern + /rapc m 4 get def % Centre row address pattern + /rapr m 5 get def % Right row address pattern + /ncws r c mul k sub def % Data codewords + /okay true def + datcws length ncws gt {/okay false def} if + urows 0 ne urows r ne and {/okay false def} if + ucols 0 ne ucols c ne and {/okay false def} if + okay {exit} if + /i i 1 add def + } loop + /m datcws length def + + % Create codewords array with one extra working space element and add padding + /n c r mul k sub def + /cws c r mul 1 add array def + cws 0 datcws putinterval + cws m [ n m sub {900} repeat ] putinterval + cws n [ k {0} repeat 0 ] putinterval + + % Calculate the log and anti-log tables + /rsalog [ 1 928 {dup 3 mul 929 mod} repeat ] def + /rslog 929 array def + 1 1 928 {dup rsalog exch get exch rslog 3 1 roll put} for + + % Function to calculate the product in the field + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add 928 mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate the coefficients + /coeffs [ 1 k {0} repeat ] def + 1 1 k { + /i exch def + coeffs i coeffs i 1 sub get put + i 1 sub -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod add 929 mod put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + coeffs length 1 sub -2 0 {coeffs exch 2 copy get 929 exch sub put} for + + % Derive the error codewords + 0 1 n 1 sub { + /t exch cws exch get cws n get add 929 mod def + 0 1 k 1 sub { + /j exch def + cws n j add cws n j add 1 add get 929 t coeffs k j sub 1 sub get mul 929 mod sub add 929 mod put + } for + } for + n 1 n k add { dup cws exch 929 cws 5 -1 roll get sub 929 mod put } for + + % Trim the working space from the end of the codewords + /cws cws 0 cws length 1 sub getinterval def + + % Base 10 encoding of the bar space successions for the codewords in each cluster + /clusters [ + [ + 120256 125680 128380 120032 125560 128318 108736 119920 108640 86080 108592 86048 + 110016 120560 125820 109792 120440 125758 88256 109680 88160 89536 110320 120700 + 89312 110200 120638 89200 110140 89840 110460 89720 110398 89980 128506 119520 + 125304 128190 107712 119408 125244 107616 119352 84032 107568 119324 84000 107544 + 83984 108256 119672 125374 85184 108144 119612 85088 108088 119582 85040 108060 + 85728 108408 119742 85616 108348 85560 108318 85880 108478 85820 85790 107200 + 119152 125116 107104 119096 125086 83008 107056 119068 82976 107032 82960 82952 + 83648 107376 119228 83552 107320 119198 83504 107292 83480 83468 83824 107452 + 83768 107422 83740 83900 106848 118968 125022 82496 106800 118940 82464 106776 + 118926 82448 106764 82440 106758 82784 106936 119006 82736 106908 82712 106894 + 82700 82694 106974 82830 82240 106672 118876 82208 106648 118862 82192 106636 + 82184 106630 82180 82352 82328 82316 82080 118830 106572 106566 82050 117472 + 124280 127678 103616 117360 124220 103520 117304 124190 75840 103472 75808 104160 + 117624 124350 76992 104048 117564 76896 103992 76848 76824 77536 104312 117694 + 77424 104252 77368 77340 77688 104382 77628 77758 121536 126320 128700 121440 + 126264 128670 111680 121392 126236 111648 121368 126222 111632 121356 103104 117104 + 124092 112320 103008 117048 124062 112224 121656 126366 93248 74784 102936 117006 + 93216 112152 93200 75456 103280 117180 93888 75360 103224 117150 93792 112440 + 121758 93744 75288 93720 75632 103356 94064 75576 103326 94008 112542 93980 + 75708 94140 75678 94110 121184 126136 128606 111168 121136 126108 111136 121112 + 126094 111120 121100 111112 111108 102752 116920 123998 111456 102704 116892 91712 + 74272 121244 116878 91680 74256 102668 91664 111372 102662 74244 74592 102840 + 116958 92000 74544 102812 91952 111516 102798 91928 74508 74502 74680 102878 + 92088 74652 92060 74638 92046 92126 110912 121008 126044 110880 120984 126030 + 110864 120972 110856 120966 110852 110850 74048 102576 116828 90944 74016 102552 + 116814 90912 111000 121038 90896 73992 102534 90888 110982 90884 74160 102620 + 91056 74136 102606 91032 111054 91020 74118 91014 91100 91086 110752 120920 + 125998 110736 120908 110728 120902 110724 110722 73888 102488 116782 90528 73872 + 102476 90512 110796 102470 90504 73860 90500 73858 73944 90584 90572 90566 + 120876 120870 110658 102444 73800 90312 90308 90306 101056 116080 123580 100960 + 116024 70720 100912 115996 70688 100888 70672 70664 71360 101232 116156 71264 + 101176 116126 71216 101148 71192 71180 71536 101308 71480 101278 71452 71612 + 71582 118112 124600 127838 105024 118064 124572 104992 118040 124558 104976 118028 + 104968 118022 100704 115896 123486 105312 100656 115868 79424 70176 118172 115854 + 79392 105240 100620 79376 70152 79368 70496 100792 115934 79712 70448 118238 + 79664 105372 100750 79640 70412 79628 70584 100830 79800 70556 79772 70542 + 70622 79838 122176 126640 128860 122144 126616 128846 122128 126604 122120 126598 + 122116 104768 117936 124508 113472 104736 126684 124494 113440 122264 126670 113424 + 104712 117894 113416 122246 104706 69952 100528 115804 78656 69920 100504 115790 + 96064 78624 104856 117966 96032 113560 122318 100486 96016 78600 104838 96008 + 69890 70064 100572 78768 70040 100558 96176 78744 104910 96152 113614 70022 + 78726 70108 78812 70094 96220 78798 122016 126552 128814 122000 126540 121992 + 126534 121988 121986 104608 117848 124462 113056 104592 126574 113040 122060 117830 + 113032 104580 113028 104578 113026 69792 100440 115758 78240 69776 100428 95136 + 78224 104652 100422 95120 113100 69764 95112 78212 69762 78210 69848 100462 + 78296 69836 95192 78284 69830 95180 78278 69870 95214 121936 126508 121928 + 126502 121924 121922 104528 117804 112848 104520 117798 112840 121958 112836 104514 + 112834 69712 100396 78032 69704 100390 94672 78024 104550 94664 112870 69698 + 94660 78018 94658 78060 94700 94694 126486 121890 117782 104484 104482 69672 + 77928 94440 69666 77922 99680 68160 99632 68128 99608 115342 68112 99596 + 68104 99590 68448 99768 115422 68400 99740 68376 99726 68364 68358 68536 + 99806 68508 68494 68574 101696 116400 123740 101664 116376 101648 116364 101640 + 116358 101636 67904 99504 115292 72512 67872 116444 115278 72480 101784 116430 + 72464 67848 99462 72456 101766 67842 68016 99548 72624 67992 99534 72600 + 101838 72588 67974 68060 72668 68046 72654 118432 124760 127918 118416 124748 + 118408 124742 118404 118402 101536 116312 105888 101520 116300 105872 118476 116294 + 105864 101508 105860 101506 105858 67744 99416 72096 67728 116334 80800 72080 + 101580 99398 80784 105932 67716 80776 72068 67714 72066 67800 99438 72152 + 67788 80856 72140 67782 80844 72134 67822 72174 80878 126800 128940 126792 + 128934 126788 126786 118352 124716 122576 126828 124710 122568 126822 122564 118338 + 122562 101456 116268 105680 101448 116262 114128 105672 118374 114120 122598 101442 + 114116 105666 114114 67664 99372 71888 67656 99366 80336 71880 101478 97232 + 80328 105702 67650 97224 114150 71874 97220 67692 71916 67686 80364 71910 + 97260 80358 97254 126760 128918 126756 126754 118312 124694 122472 126774 122468 + 118306 122466 101416 116246 105576 101412 113896 105572 101410 113892 105570 113890 + 67624 99350 71784 101430 80104 71780 67618 96744 80100 71778 96740 80098 + 96738 71798 96758 126738 122420 122418 105524 113780 113778 71732 79988 96500 + 96498 66880 66848 98968 66832 66824 66820 66992 66968 66956 66950 67036 + 67022 100000 99984 115532 99976 115526 99972 99970 66720 98904 69024 100056 + 98892 69008 100044 69000 100038 68996 66690 68994 66776 98926 69080 100078 + 69068 66758 69062 66798 69102 116560 116552 116548 116546 99920 102096 116588 + 115494 102088 116582 102084 99906 102082 66640 68816 66632 98854 73168 68808 + 66628 73160 68804 66626 73156 68802 66668 68844 66662 73196 68838 73190 + 124840 124836 124834 116520 118632 124854 118628 116514 118626 99880 115478 101992 + 116534 106216 101988 99874 106212 101986 106210 66600 98838 68712 99894 72936 + 68708 66594 81384 72932 68706 81380 72930 66614 68726 72950 81398 128980 + 128978 124820 126900 124818 126898 116500 118580 116498 122740 118578 122738 99860 + 101940 99858 106100 101938 114420 + ] [ + 128352 129720 125504 128304 129692 125472 128280 129678 125456 128268 125448 128262 + 125444 125792 128440 129758 120384 125744 128412 120352 125720 128398 120336 125708 + 120328 125702 120324 120672 125880 128478 110144 120624 125852 110112 120600 125838 + 110096 120588 110088 120582 110084 110432 120760 125918 89664 110384 120732 89632 + 110360 120718 89616 110348 89608 110342 89952 110520 120798 89904 110492 89880 + 110478 89868 90040 110558 90012 89998 125248 128176 129628 125216 128152 129614 + 125200 128140 125192 128134 125188 125186 119616 125360 128220 119584 125336 128206 + 119568 125324 119560 125318 119556 119554 108352 119728 125404 108320 119704 125390 + 108304 119692 108296 119686 108292 108290 85824 108464 119772 85792 108440 119758 + 85776 108428 85768 108422 85764 85936 108508 85912 108494 85900 85894 85980 + 85966 125088 128088 129582 125072 128076 125064 128070 125060 125058 119200 125144 + 128110 119184 125132 119176 125126 119172 119170 107424 119256 125166 107408 119244 + 107400 119238 107396 107394 83872 107480 119278 83856 107468 83848 107462 83844 + 83842 83928 107502 83916 83910 83950 125008 128044 125000 128038 124996 124994 + 118992 125036 118984 125030 118980 118978 106960 119020 106952 119014 106948 106946 + 82896 106988 82888 106982 82884 82882 82924 82918 124968 128022 124964 124962 + 118888 124982 118884 118882 106728 118902 106724 106722 82408 106742 82404 82402 + 124948 124946 118836 118834 106612 106610 124224 127664 129372 124192 127640 129358 + 124176 127628 124168 127622 124164 124162 117568 124336 127708 117536 124312 127694 + 117520 124300 117512 124294 117508 117506 104256 117680 124380 104224 117656 124366 + 104208 117644 104200 117638 104196 104194 77632 104368 117724 77600 104344 117710 + 77584 104332 77576 104326 77572 77744 104412 77720 104398 77708 77702 77788 + 77774 128672 129880 93168 128656 129868 92664 128648 129862 92412 128644 128642 + 124064 127576 129326 126368 124048 129902 126352 128716 127558 126344 124036 126340 + 124034 126338 117152 124120 127598 121760 117136 124108 121744 126412 124102 121736 + 117124 121732 117122 121730 103328 117208 124142 112544 103312 117196 112528 121804 + 117190 112520 103300 112516 103298 112514 75680 103384 117230 94112 75664 103372 + 94096 112588 103366 94088 75652 94084 75650 75736 103406 94168 75724 94156 + 75718 94150 75758 128592 129836 91640 128584 129830 91388 128580 91262 128578 + 123984 127532 126160 123976 127526 126152 128614 126148 123970 126146 116944 124012 + 121296 116936 124006 121288 126182 121284 116930 121282 102864 116972 111568 102856 + 116966 111560 121318 111556 102850 111554 74704 102892 92112 74696 102886 92104 + 111590 92100 74690 92098 74732 92140 74726 92134 128552 129814 90876 128548 + 90750 128546 123944 127510 126056 128566 126052 123938 126050 116840 123958 121064 + 116836 121060 116834 121058 102632 116854 111080 121078 111076 102626 111074 74216 + 102646 91112 74212 91108 74210 91106 74230 91126 128532 90494 128530 123924 + 126004 123922 126002 116788 120948 116786 120946 102516 110836 102514 110834 73972 + 90612 73970 90610 128522 123914 125978 116762 120890 102458 110714 123552 127320 + 129198 123536 127308 123528 127302 123524 123522 116128 123608 127342 116112 123596 + 116104 123590 116100 116098 101280 116184 123630 101264 116172 101256 116166 101252 + 101250 71584 101336 116206 71568 101324 71560 101318 71556 71554 71640 101358 + 71628 71622 71662 127824 129452 79352 127816 129446 79100 127812 78974 127810 + 123472 127276 124624 123464 127270 124616 127846 124612 123458 124610 115920 123500 + 118224 115912 123494 118216 124646 118212 115906 118210 100816 115948 105424 100808 + 115942 105416 118246 105412 100802 105410 70608 100844 79824 70600 100838 79816 + 105446 79812 70594 79810 70636 79852 70630 79846 129960 95728 113404 129956 + 95480 113278 129954 95356 95294 127784 129430 78588 128872 129974 95996 78462 + 128868 127778 95870 128866 123432 127254 124520 123428 126696 128886 123426 126692 + 124514 126690 115816 123446 117992 115812 122344 117988 115810 122340 117986 122338 + 100584 115830 104936 100580 113640 104932 100578 113636 104930 113634 70120 100598 + 78824 70116 96232 78820 70114 96228 78818 96226 70134 78838 129940 94968 + 113022 129938 94844 94782 127764 78206 128820 127762 95102 128818 123412 124468 + 123410 126580 124466 126578 115764 117876 115762 122100 117874 122098 100468 104692 + 100466 113140 104690 113138 69876 78324 69874 95220 78322 95218 129930 94588 + 94526 127754 128794 123402 124442 126522 115738 117818 121978 100410 104570 112890 + 69754 78074 94714 94398 123216 127148 123208 127142 123204 123202 115408 123244 + 115400 123238 115396 115394 99792 115436 99784 115430 99780 99778 68560 99820 + 68552 99814 68548 68546 68588 68582 127400 129238 72444 127396 72318 127394 + 123176 127126 123752 123172 123748 123170 123746 115304 123190 116456 115300 116452 + 115298 116450 99560 115318 101864 99556 101860 99554 101858 68072 99574 72680 + 68068 72676 68066 72674 68086 72694 129492 80632 105854 129490 80508 80446 + 127380 72062 127924 127378 80766 127922 123156 123700 123154 124788 123698 124786 + 115252 116340 115250 118516 116338 118514 99444 101620 99442 105972 101618 105970 + 67828 72180 67826 80884 72178 80882 97008 114044 96888 113982 96828 96798 + 129482 80252 130010 97148 80190 97086 127370 127898 128954 123146 123674 124730 + 126842 115226 116282 118394 122618 99386 101498 105722 114170 67706 71930 80378 + 96632 113854 96572 96542 80062 96702 96444 96414 96350 123048 123044 123042 + 115048 123062 115044 115042 99048 115062 99044 99042 67048 99062 67044 67042 + 67062 127188 68990 127186 123028 123316 123026 123314 114996 115572 114994 115570 + 98932 100084 98930 100082 66804 69108 66802 69106 129258 73084 73022 127178 + 127450 123018 123290 123834 114970 115514 116602 98874 99962 102138 66682 68858 + 73210 81272 106174 81212 81182 72894 81342 97648 114364 97592 114334 97564 + 97550 81084 97724 81054 97694 97464 114270 97436 97422 80990 97502 97372 + 97358 97326 114868 114866 98676 98674 66292 66290 123098 114842 115130 98618 + 99194 66170 67322 69310 73404 73374 81592 106334 81564 81550 73310 81630 + 97968 114524 97944 114510 97932 97926 81500 98012 81486 97998 97880 114478 + 97868 97862 81454 97902 97836 97830 69470 73564 73550 81752 106414 81740 + 81734 73518 81774 81708 81702 + ] [ + 109536 120312 86976 109040 120060 86496 108792 119934 86256 108668 86136 129744 + 89056 110072 129736 88560 109820 129732 88312 109694 129730 88188 128464 129772 + 89592 128456 129766 89340 128452 89214 128450 125904 128492 125896 128486 125892 + 125890 120784 125932 120776 125926 120772 120770 110544 120812 110536 120806 110532 + 84928 108016 119548 84448 107768 119422 84208 107644 84088 107582 84028 129640 + 85488 108284 129636 85240 108158 129634 85116 85054 128232 129654 85756 128228 + 85630 128226 125416 128246 125412 125410 119784 125430 119780 119778 108520 119798 + 108516 108514 83424 107256 119166 83184 107132 83064 107070 83004 82974 129588 + 83704 107390 129586 83580 83518 128116 83838 128114 125172 125170 119284 119282 + 107508 107506 82672 106876 82552 106814 82492 82462 129562 82812 82750 128058 + 125050 119034 82296 106686 82236 82206 82366 82108 82078 76736 103920 117500 + 76256 103672 117374 76016 103548 75896 103486 75836 129384 77296 104188 129380 + 77048 104062 129378 76924 76862 127720 129398 77564 127716 77438 127714 124392 + 127734 124388 124386 117736 124406 117732 117730 104424 117750 104420 104418 112096 + 121592 126334 92608 111856 121468 92384 111736 121406 92272 111676 92216 111646 + 92188 75232 103160 117118 93664 74992 103036 93424 112252 102974 93304 74812 + 93244 74782 93214 129332 75512 103294 129908 129330 93944 75388 129906 93820 + 75326 93758 127604 75646 128756 127602 94078 128754 124148 126452 124146 126450 + 117236 121844 117234 121842 103412 103410 91584 111344 121212 91360 111224 121150 + 91248 111164 91192 111134 91164 91150 74480 102780 91888 74360 102718 91768 + 111422 91708 74270 91678 129306 74620 129850 92028 74558 91966 127546 128634 + 124026 126202 116986 121338 102906 90848 110968 121022 90736 110908 90680 110878 + 90652 90638 74104 102590 91000 74044 90940 74014 90910 74174 91070 90480 + 110780 90424 110750 90396 90382 73916 90556 73886 90526 90296 110686 90268 + 90254 73822 90334 90204 90190 71136 101112 116094 70896 100988 70776 100926 + 70716 70686 129204 71416 101246 129202 71292 71230 127348 71550 127346 123636 + 123634 116212 116210 101364 101362 79296 105200 118140 79072 105080 118078 78960 + 105020 78904 104990 78876 78862 70384 100732 79600 70264 100670 79480 105278 + 79420 70174 79390 129178 70524 129466 79740 70462 79678 127290 127866 123514 + 124666 115962 118266 100858 113376 122232 126654 95424 113264 122172 95328 113208 + 122142 95280 113180 95256 113166 95244 78560 104824 117950 95968 78448 104764 + 95856 113468 104734 95800 78364 95772 78350 95758 70008 100542 78712 69948 + 96120 78652 69918 96060 78622 96030 70078 78782 96190 94912 113008 122044 + 94816 112952 122014 94768 112924 94744 112910 94732 94726 78192 104636 95088 + 78136 104606 95032 113054 95004 78094 94990 69820 78268 69790 95164 78238 + 95134 94560 112824 121950 94512 112796 94488 112782 94476 94470 78008 104542 + 94648 77980 94620 77966 94606 69726 78046 94686 94384 112732 94360 112718 + 94348 94342 77916 94428 77902 94414 94296 112686 94284 94278 77870 94318 + 94252 94246 68336 99708 68216 99646 68156 68126 68476 68414 127162 123258 + 115450 99834 72416 101752 116414 72304 101692 72248 101662 72220 72206 67960 + 99518 72568 67900 72508 67870 72478 68030 72638 80576 105840 118460 80480 + 105784 118430 80432 105756 80408 105742 80396 80390 72048 101564 80752 71992 + 101534 80696 71964 80668 71950 80654 67772 72124 67742 80828 72094 80798 + 114016 122552 126814 96832 113968 122524 96800 113944 122510 96784 113932 96776 + 113926 96772 80224 105656 118366 97120 80176 105628 97072 114076 105614 97048 + 80140 97036 80134 97030 71864 101470 80312 71836 97208 80284 71822 97180 + 80270 97166 67678 71902 80350 97246 96576 113840 122460 96544 113816 122446 + 96528 113804 96520 113798 96516 96514 80048 105564 96688 80024 105550 96664 + 113870 96652 80006 96646 71772 80092 71758 96732 80078 96718 96416 113752 + 122414 96400 113740 96392 113734 96388 96386 79960 105518 96472 79948 96460 + 79942 96454 71726 79982 96494 96336 113708 96328 113702 96324 96322 79916 + 96364 79910 96358 96296 113686 96292 96290 79894 96310 66936 99006 66876 + 66846 67006 68976 100028 68920 99998 68892 68878 66748 69052 66718 69022 + 73056 102072 116574 73008 102044 72984 102030 72972 72966 68792 99934 73144 + 68764 73116 68750 73102 66654 68830 73182 81216 106160 118620 81184 106136 + 118606 81168 106124 81160 106118 81156 81154 72880 101980 81328 72856 101966 + 81304 106190 81292 72838 81286 68700 72924 68686 81372 72910 81358 114336 + 122712 126894 114320 122700 114312 122694 114308 114306 81056 106072 118574 97696 + 81040 106060 97680 114380 106054 97672 81028 97668 81026 97666 72792 101934 + 81112 72780 97752 81100 72774 97740 81094 97734 68654 72814 81134 97774 + 114256 122668 114248 122662 114244 114242 80976 106028 97488 80968 106022 97480 + 114278 97476 80962 97474 72748 81004 72742 97516 80998 97510 114216 122646 + 114212 114210 80936 106006 97384 80932 97380 80930 97378 72726 80950 97398 + 114196 114194 80916 97332 80914 97330 66236 66206 67256 99166 67228 67214 + 66142 67294 69296 100188 69272 100174 69260 69254 67164 69340 67150 69326 + 73376 102232 116654 73360 102220 73352 102214 73348 73346 69208 100142 73432 + 102254 73420 69190 73414 67118 69230 73454 106320 118700 106312 118694 106308 + 106306 73296 102188 81616 106348 102182 81608 73284 81604 73282 81602 69164 + 73324 69158 81644 73318 81638 122792 126934 122788 122786 106280 118678 114536 + 106276 114532 106274 114530 73256 102166 81512 73252 98024 81508 73250 98020 + 81506 98018 69142 73270 81526 98038 122772 122770 106260 114484 106258 114482 + 73236 81460 73234 97908 81458 97906 122762 106250 114458 73226 81434 97850 + 66396 66382 67416 99246 67404 67398 66350 67438 69456 100268 69448 100262 + 69444 69442 67372 69484 67366 69478 102312 116694 102308 102306 69416 100246 + 73576 102326 73572 69410 73570 67350 69430 73590 118740 118738 102292 106420 + 102290 106418 69396 73524 69394 81780 73522 81778 118730 102282 106394 69386 + 73498 81722 66476 66470 67496 99286 67492 67490 66454 67510 100308 100306 + 67476 69556 67474 69554 116714 + ] + ] def + + % Row address patterns + /raps [ + [ % Left and right + 802 930 946 818 882 890 826 954 922 986 970 906 778 + 794 786 914 978 982 980 916 948 932 934 942 940 936 + 808 812 814 806 822 950 918 790 788 820 884 868 870 + 878 876 872 840 856 860 862 846 844 836 838 834 866 + ] [ % Centre + 718 590 622 558 550 566 534 530 538 570 562 546 610 + 626 634 762 754 758 630 628 612 614 582 578 706 738 + 742 740 748 620 556 552 616 744 712 716 708 710 646 + 654 652 668 664 696 688 656 720 592 600 604 732 734 + ] + ] def + + % Return the 17 bits for a codeword in a given cluster + /cwtobits { + clusters exch get exch get /v exch def + [ 17 {0} repeat v 2 17 string cvrs {48 sub} forall ] + dup length 17 sub 17 getinterval + } bind def + + % Return the 10 bits for a row address pattern + /raptobits { + raps exch get exch get /v exch def + [ 10 {0} repeat v 2 10 string cvrs {48 sub} forall ] + dup length 10 sub 10 getinterval + } bind def + + % Populate bitmap for the image + /rwid [38 55 82 99] c 1 sub get def + c 3 eq cca and {/rwid 72 def} if + /pixs rwid r mul array def + + 0 1 r 1 sub { + /i exch def + /clst i rapl add 1 sub 3 mod def + pixs rwid i mul [ + c 1 eq { + i rapl add 1 sub 52 mod 0 raptobits aload pop + cws i get clst cwtobits aload pop + i rapr add 1 sub 52 mod 0 raptobits aload pop + } if + c 2 eq { + i rapl add 1 sub 52 mod 0 raptobits aload pop + cws i 2 mul get clst cwtobits aload pop + cws i 2 mul 1 add get clst cwtobits aload pop + i rapr add 1 sub 52 mod 0 raptobits aload pop + } if + c 3 eq { + cca not { + i rapl add 1 sub 52 mod 0 raptobits aload pop + } if + cws i 3 mul get clst cwtobits aload pop + i rapc add 1 sub 52 mod 1 raptobits aload pop + cws i 3 mul 1 add get clst cwtobits aload pop + cws i 3 mul 2 add get clst cwtobits aload pop + i rapr add 1 sub 52 mod 0 raptobits aload pop + } if + c 4 eq { + i rapl add 1 sub 52 mod 0 raptobits aload pop + cws i 4 mul get clst cwtobits aload pop + cws i 4 mul 1 add get clst cwtobits aload pop + i rapc add 1 sub 52 mod 1 raptobits aload pop + cws i 4 mul 2 add get clst cwtobits aload pop + cws i 4 mul 3 add get clst cwtobits aload pop + i rapr add 1 sub 52 mod 0 raptobits aload pop + } if + 1 + ] putinterval + } for + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx rwid + /pixy r + /height r 72 div rowmult mul + /width rwid 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/micropdf417 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER micropdf417-- -% --BEGIN ENCODER datamatrix-- -% --REQUIRES preamble raiseerror renmatrix-- -% --DESC: Data Matrix -% --EXAM: This is Data Matrix! -% --EXOP: rows=32 columns=32 -% --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp datamatrix 0.0 0 0 0 -%%BeginData: 102 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\KF D5Z2F* j(N A moL sA Wf3' P!F GY<0B5(@Zm RN0oc8tP)XR -(F_-_!H]ftD5*C& O5*@^M H]f t &Eck rV1O YEd I?J0)*g/N: DfBf4Df0WZ5 -*@^MP#Q@=FD5Z2F *j'+I? I/T @rH1 +D/O D;@ rH1+D/OEX/ 4@ UX:eD e*FB @Zm RN1GOo [4NP!5$bP' )pIL]E55P"_ -#iD0'?Q5&,lSP,X U.P'E-L P%'4LP ,X6>P !5% &I=%,:D0'? Q5&-6EP'N4" -C6ATNC6CcD1G<3GEas#uAKYi2B8?P&P"_#pP!FGYP"UU;P&5P!@q]:k+D,M$G%#3.+C\c"@rGmh+DHW4Oo^ -@AP"_$3Ou"b*+DHW7Oo^_%I=!V]+DHW4Oo^_%I?ITYP#Q:>B-:q3@q]:kP'AWo+DHW4Oo^_%05 -;VEL]NY>Ou%NLAM7nAB-;&4B8?P&P"_#p05YcCCh7K,D0'?Q@ZiN#@s;u:D0'?+AT!;*P&-9fO -u"b*L]ESo05?:COu%H!+Dl14Ch7LI4aW>WI?IP_@q]:k+Dl14+DI!3Ou$T]@<*K&DD@;;HXh8@ -+DQW2k`U0DBcq,G!KmJH1G4BnueQ!Kp*=3/B8O8s2Ao3Kdg6"FFX&F!,3?D0'>4Bp),F0TrDk$Bf4BF(ZV0L]N -Y>P"UTbP,XTFL&cgg!Kq[\Bcq,G!g3SI1G@q]:kLjtSeP'AWo+DHW4Oo^_%05;VEL]W_?Ou%NL -p*@-%#>= -J!Jgc4#D`Cd+BsX3L^o4AL]N;=L]Ld(>DNiH&;U@C!Jh/?!F6gPL_>LVL]N;4L^o4A>p*@-'Sm -HZ!Jgc4&r6Qo+BsX;L_bdIL]N;GL]Ld(>DO,P(l/3K!JhSK!F6gPL`2'fL]N;4L`D3O>p*@-+G -_.r!f-o6,_uJ,+BsXILa7cXL]WA^L]Ld(>DO\`.#7q\!f/Od!F6gPLb+?5L]WA6LcC1k>p*@-0 -ShE=!f-o67#1kL+BsXYLbsnhL]WB3L]Uj)>DPP#5_oQ!"Gh#Q!aQpQLe*=mL]iM:L&dL&mZt#$i?UL&cm]!/-.4L^&S7n;%?U+BsR#OG3asL^&Y>L&u1I$=+cYL^8 -eLL]N;4L^/_:>p*@-#`'UZ!Jgf5$]"gh+BsX1L`2'ML]N;AL]Ld(>DN]D,_uJW!f.JF!F6gPL_ -,@fL]N;5L_tpK>p*@-&;W#r!Jgf5*/FW$+C1-d06M;RGB4mIDg-8c1GCm(c\1G^Dg-7FEc6/CP&6?bHS9;Q@ODesJ;@rH1)P&6?bHS9;Q@I?IP_Bcq,G -!KmJH1OYEt@s9IF"F*i=u8T&$^F!,"%FDPN -+P,We_!.fQ]K3aWrA79RrAT!;)Oo^@>DI[m3L]N[L&dL%Ck_rgP%odROo^ -:;JW^%s3/.G4P#-L[!GB8p2Bp(ZCG^Y`GI?IP_@s;C'+EDO4Cm#*f1G<F(/sKCh]%5P"Us_I?I-2G@GV9Bcpo0@Zkt -I@q'L%BcpV&EcY`7+EDO4Cm%\CL]DjdK3aXbI?I,SEcYZ*DeC1sL]N51s*KngL]W`UOuS0s!0T -s$L&ilh_0qJGI?K4gOu"b3F)5c-L&h:;$'I*#!Jgc2!<7D/3-'(KCi$AnH*,BnueQWKKo;G\Ms7P,X9;L]MiUC6Cc -D1Lk?7AnH*,C*7#)AS,Oq+DQ]5P,XU;@rGpjAof)0P"Th:@;Kjp+DI!3EcZ2?De,$IP'DD<87Q -RLAnH+?!+TqYAnH+?!0TuqF(&m'B-:oO96,)mEc5KOG^Y`G04Sp3AnH*,@rGpjAoib.@rGpjAo -j,EL]N[9IKe@WR>2L]W`5H[V -&KARf1jL]E5:P"^4NP"ArB1OYEc04T3I+BosuGB8+ZP"B\8@s<9U!.C#_?'7""!/LYrF(9EM!K -sF/056S5Ou$TlF!,@1GB4m@Oo]-(@WNZ++EDO4Cm&Or95,MhF(/sK;Na\9G^Y`G05YWY@rH1)L]ikAL^9/YP,XTFP!4;W<0BF^@rH1)P&- -9^D/E^'P!4[*M#WWnP'DD<8UZa3Ou"b%D/LJ#H\_`d)2J?WWKKH$!g9OG5(/S(H\_`d)2J! -KsFF5(/S(H\_`d)2J?WWI9p>H\_`d)2JH\_`d)1@YX?'6usA8Pg2+Bs18D/sQ=F,0j[ -WJCP&Oq)hUEc6/CL]N[H\_c@@rH1)L]N[ -=D>C.K0Ec6/CL]`g>L]Djd%XW&5Dg-8Y!g9O=!.C"?HYmeAGB8Q@P,X6;I?G(eL]D:%DesKN"H -oa4Oq)hp!,Z4aCibC7P,Wkm%XX!3D.@L#F,0m\WI9p>H\_Z=@rH1)L]N[!.C"?HYmeAGB8QAP,X6;I?G(eD/sQ=F,0j[WJCP& -Oq)hp!,Z4aCibC6P,Wkm%XX!3D.@L#F,0j[WI9p>H\_]>@rH1)L]N[H\_Z=@rH1)L]Wa=I?G(eL]D:%DesKN!KsF1Oq)hp!Gu=bCi -bC7P,Wkm%XX!4D.@L#F,0m\WI9p>H\_]>@rH1)L]N[9Id'Dg-7FD.@L#F --:?dM#VmdK3aWr@s@ED/Ws-Ch8 -$XP!4[(Oo^_0L]W -_WD.@L#F-:-u5&G=YGB8pZP&c_)H]iN7Fco"DN<9!*tb5D/E^'+Dl.;GB4mD@rH1)P&,pUP -,VZA!/LY]P'MJ=<%i3)G]P!JDg-7F@rH1)P&-9fOu"b$GAqJAL]ESoL]E53Ec6/CL]N[@rH1)P&+>F@rH1)L]W`;H\_]Y!.C#_?'9J]P#Q- -P!+/2Bm=\ABcpo(CibbU>9IEoCiarZ!I^,`?'9J]P#Q-P!+/2Bm=\ABcpo(CibbUC6AU3L]W`SP'DD<<,*Or@rH1)L]W_?P%odQP&4qVEas$(F,0m\ -!Kq2<@rH1)L]NY>P&6?bHZ3\DF!,0>@rH1)P&+lr!Gu[^F -% uk.co.terryburton.bwipp/datamatrix 0.0 0 +% --BEGIN ENCODER datamatrix-- +% --REQUIRES preamble raiseerror renmatrix-- +% --DESC: Data Matrix +% --EXAM: This is Data Matrix! +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp datamatrix 0.0 2015050900 189975 216544 +%%BeginData: 844 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/datamatrix { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /columns 0 def + /rows 0 def + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /columns columns cvi def + /rows rows cvi def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Convert input into bytes accounting for FNC characters + /fnc1 -1 def /prog -2 def /m05 -3 def /m06 -4 def + /fncvals << + (FNC1) fnc1 + (PROG) prog + (MAC5) m05 + (MAC6) m06 + >> def + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + % Basic metrics for the each symbol + % rows cols regh regv rscw rsbl + /metrics [ + % Standard square symbols + [ 10 10 1 1 5 1 ] + [ 12 12 1 1 7 1 ] + [ 14 14 1 1 10 1 ] + [ 16 16 1 1 12 1 ] + [ 18 18 1 1 14 1 ] + [ 20 20 1 1 18 1 ] + [ 22 22 1 1 20 1 ] + [ 24 24 1 1 24 1 ] + [ 26 26 1 1 28 1 ] + [ 32 32 2 2 36 1 ] + [ 36 36 2 2 42 1 ] + [ 40 40 2 2 48 1 ] + [ 44 44 2 2 56 1 ] + [ 48 48 2 2 68 1 ] + [ 52 52 2 2 84 2 ] + [ 64 64 4 4 112 2 ] + [ 72 72 4 4 144 4 ] + [ 80 80 4 4 192 4 ] + [ 88 88 4 4 224 4 ] + [ 96 96 4 4 272 4 ] + [ 104 104 4 4 336 6 ] + [ 120 120 6 6 408 6 ] + [ 132 132 6 6 496 8 ] + [ 144 144 6 6 620 10 ] + % Optional rectangular symbols + [ 8 18 1 1 7 1 ] + [ 8 32 1 2 11 1 ] + [ 12 26 1 1 14 1 ] + [ 12 36 1 2 18 1 ] + [ 16 36 1 2 24 1 ] + [ 16 48 1 2 28 1 ] + ] def + + % Create array of codewords remaining to make a full symbol + /urows rows def + /ucols columns def + /fullcws [] def + metrics { + /m exch def + /rows m 0 get def % Rows in symbol + /cols m 1 get def % Columns in symbol + /regh m 2 get def % Horizontal regions + /regv m 3 get def % Vertical regions + /rscw m 4 get def % Error correction codewords + /rsbl m 5 get def % Error correction blocks + /mrows rows 2 regh mul sub def % Rows in the mapping matrix + /mcols cols 2 regv mul sub def % Columns in the mapping matrix + /ncws mrows mcols mul 8 idiv rscw sub def % Data codewords + /okay true def + urows 0 ne urows rows ne and {/okay false def} if + ucols 0 ne ucols cols ne and {/okay false def} if + urows 0 eq ucols 0 eq or rows cols ne and {/okay false def} if + okay {/fullcws [ fullcws aload pop ncws ] def} if + } forall + /numremcws [ 1558 {10000} repeat ] def + fullcws {numremcws exch 1 sub 1 put} forall + 1556 -1 0 { + /i exch def + numremcws i get 1 ne { + numremcws i numremcws i 1 add get 1 add put + } if + } for + + % Special characters + /lC -5 def /lB -6 def /lX -7 def /lT -8 def /lE -9 def /unl -10 def + /sapp -11 def /usft -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def + /unlcw 254 def + + /Avals << + 0 1 128 {dup 1 add} for + pad 129 + 0 1 99 { % Double digits + dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval + exch 130 add + } for + 229 [ lC lB fnc1 sapp prog usft m05 m06 lX lT lE eci ] {exch 1 add dup} forall pop + >> def + /Avals << + Avals {[exch]} forall + >> def + + /CNvals << + sft1 0 + sft2 1 + sft3 2 + 32 3 + 48 1 57 {dup 44 sub} for % 0-9 + 65 1 90 {dup 51 sub} for % A-Z + >> def + /C1vals << 0 1 31 {dup} for >> def + /C2vals << + 33 1 47 {dup 33 sub} for + 58 1 64 {dup 43 sub} for + 91 1 95 {dup 69 sub} for + fnc1 27 + usft 30 + >> def + /C3vals << 96 1 127 {dup 96 sub} for >> def + /Cvals << + CNvals {[exch]} forall + C1vals {[exch CNvals sft1 get exch]} forall + C2vals {[exch CNvals sft2 get exch]} forall + C3vals {[exch CNvals sft3 get exch]} forall + >> def + + /TNvals << + sft1 0 + sft2 1 + sft3 2 + 32 3 + 48 1 57 {dup 44 sub} for % 0-9 + 97 1 122 {dup 83 sub} for % a-z + >> def + /T1vals << 0 1 31 {dup} for >> def + /T2vals << + 33 1 47 {dup 33 sub} for + 58 1 64 {dup 43 sub} for + 91 1 95 {dup 69 sub} for + fnc1 27 + usft 30 + >> def + /T3vals << + 96 0 + 65 1 90 {dup 64 sub} for + 123 1 127 {dup 96 sub} for + >> def + /Tvals << + TNvals {[exch]} forall + T1vals {[exch TNvals sft1 get exch]} forall + T2vals {[exch TNvals sft2 get exch]} forall + T3vals {[exch TNvals sft3 get exch]} forall + >> def + + % Extended ASCII mappings + 128 1 255 { + /i exch def + Avals i [ Avals usft get aload pop Avals i 128 sub get aload pop ] put + Cvals i [ Cvals usft get aload pop Cvals i 128 sub get aload pop ] put + Tvals i [ Tvals usft get aload pop Tvals i 128 sub get aload pop ] put + } for + + /Xvals << + 13 0 + 42 1 + 62 2 + 32 3 + 48 1 57 {dup 44 sub} for + 65 1 90 {dup 51 sub} for + >> def + /Xvals << + Xvals {[exch]} forall + >> def + + /Evals << + 64 1 94 {dup 64 sub} for + unl 31 + 32 1 63 {dup} for + >> def + /Evals << + Evals {[exch]} forall + >> def + + /Bvals << + 0 1 255 {dup} for + >> def + /Bvals << + Bvals {[exch]} forall + >> def + + /encvals [ Avals Cvals Tvals Xvals Evals Bvals ] def + + /numD [ msglen {0} repeat 0 ] def + /nextXterm [ msglen {0} repeat 9999 ] def + /nextNonX [ msglen {0} repeat 9999 ] def + msglen 1 sub -1 0 { + /i exch def + /barchar msg i get def + barchar 48 ge barchar 57 le and { + numD i numD i 1 add get 1 add put + } if + barchar 13 eq barchar 42 eq or barchar 62 eq or { + nextXterm i 0 put + } { + nextXterm i nextXterm i 1 add get 1 add put + } ifelse + Xvals barchar known not { + nextNonX i 0 put + } { + nextNonX i nextNonX i 1 add get 1 add put + } ifelse + } for + /nextXterm [nextXterm {dup 10000 gt {pop 10000} if} forall] def + /nextNonX [nextNonX {dup 10000 gt {pop 10000} if} forall] def + + /isD {char 48 ge char 57 le and} bind def + /isC {CNvals char known} bind def + /isT {TNvals char known} bind def + /isX {Xvals char known} bind def + /isE {Evals char known} bind def + /isEA {char 127 gt} bind def + /isFN {char 0 lt} bind def + /XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} bind def + + /A 0 def /C 1 def /T 2 def /X 3 def /E 4 def /B 5 def + + /lookup { + /ac 1 def /cc 2 def /tc 2 def /xc 2 def /ec 2 def /bc 2.25 def + mode A eq {/ac 0 def /cc 1 def /tc 1 def /xc 1 def /ec 1 def /bc 1.25 def} if + mode C eq {/cc 0 def} if + mode T eq {/tc 0 def} if + mode X eq {/xc 0 def} if + mode E eq {/ec 0 def} if + mode B eq {/bc 0 def} if + 1 { % common exit + /k 0 def { % loop + i k add msglen eq { + [/ac /cc /tc /xc /ec /bc] {dup load ceiling def} forall + true [ cc tc xc ec bc] {ac exch le and} forall {A exit} if + true [ac cc tc xc ec ] {bc exch lt and} forall {B exit} if + true [ac cc tc xc bc] {ec exch lt and} forall {E exit} if + true [ac cc xc ec bc] {tc exch lt and} forall {T exit} if + true [ac cc tc ec bc] {xc exch lt and} forall {X exit} if + C exit + } if + /char msg i k add get def + /ac ac isD {1 2 div add} {isEA {ceiling 2 add} {1 add } ifelse} ifelse def + /cc cc isC {2 3 div add} {isEA { 8 3 div add } { 4 3 div add} ifelse} ifelse def + /tc tc isT {2 3 div add} {isEA { 8 3 div add } { 4 3 div add} ifelse} ifelse def + /xc xc isX {2 3 div add} {isEA {13 3 div add } {10 3 div add} ifelse} ifelse def + /ec ec isE {3 4 div add} {isEA {17 4 div add } {13 4 div add} ifelse} ifelse def + /bc bc isFN {4 add} {1 add} ifelse def + k 4 ge { + true [ cc tc xc ec bc] {ac 1 add exch le and} forall {A exit} if + bc 1 add ac le {B exit} if + true [ cc tc xc ec ] {bc 1 add exch lt and} forall {B exit} if + true [ac cc tc xc bc] {ec 1 add exch lt and} forall {E exit} if + true [ac cc xc ec bc] {tc 1 add exch lt and} forall {T exit} if + true [ac cc tc ec bc] {xc 1 add exch lt and} forall {X exit} if + true [ac tc ec bc] {cc 1 add exch lt and} forall { + cc xc lt {C exit} if + cc xc eq {i k add 1 add XtermFirst {X exit} {C exit} ifelse} if + } if + } if + /k k 1 add def + } loop + } repeat + } bind def + + /addtocws { + dup cws exch j exch putinterval + /j exch length j add def + } bind def + + /encA { + 1 { % Common exit + numD i get 2 ge { + 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws + /i i 2 add def + exit + } if + /newmode lookup def + newmode mode ne { + Avals [-1 lC lT lX lE lB] newmode get get addtocws + /mode newmode def + exit + } if + Avals msg i get get addtocws + /i i 1 add def + exit + } repeat + } bind def + + /CTXvalstocws { + /in exch def + mark + 0 3 in length 1 sub { + in exch 3 getinterval 0 exch {add 40 mul} forall 40 idiv 1 add + dup 256 idiv exch 256 mod + } for + counttomark array astore exch pop + } bind def + + /encCTX { + /p 0 def + /ctxvals 2500 array def + + % Lookup the values for each character + { + i msglen eq {exit} if + encvals mode get msg i get known not {exit} if + p 3 mod 0 eq { + lookup mode ne { + ctxvals 0 p getinterval CTXvalstocws addtocws + [unlcw] addtocws + /mode A def + exit + } if + msglen i sub 3 le { % Check end of data conditions + /remcws numremcws j p 3 idiv 2 mul add get def + /remvals [ + msg i msglen i sub getinterval { + dup encvals mode get exch known { + encvals mode get exch get aload pop + } { % Unencodable X12 characters + pop -1 -1 -1 -1 + } ifelse + } forall + ] def + remcws 2 eq remvals length 3 eq and { + % Encode and omit unlatch + [ + ctxvals 0 p getinterval aload pop + remvals aload pop + ] CTXvalstocws addtocws + /mode A def + /i msglen def + exit + } if + remcws 2 eq remvals length 2 eq and mode X ne and { + % Encode with sft1 as third value, omit unlatch + [ + ctxvals 0 p getinterval aload pop + remvals aload pop + encvals mode get sft1 get aload pop + ] CTXvalstocws addtocws + /mode A def + /i msglen def + exit + } if + remcws 2 eq remvals length 1 eq and { + % Unlatch to ASCII + ctxvals 0 p getinterval CTXvalstocws addtocws + [unlcw] addtocws + Avals msg i get get addtocws + /mode A def + /i msglen def + exit + } if + remcws 1 eq remvals length 1 eq and { + % Implied unlatch to ASCII + ctxvals 0 p getinterval CTXvalstocws addtocws + Avals msg i get get addtocws + /mode A def + /i msglen def + exit + } if + } if + } if + encvals mode get msg i get get + dup ctxvals exch p exch putinterval + /p exch length p add def + /i i 1 add def + } loop + + % Backtrack to a boundary and return to ASCII + mode A ne { + { + p 3 mod 0 eq {exit} if + /i i 1 sub def + /p p encvals mode get msg i get get length sub def + } loop + [ + ctxvals 0 p getinterval aload pop + ] CTXvalstocws addtocws + [unlcw] addtocws + /mode A def + % Encode something to avoid latching immediately back + i msglen ne { + numD i get 2 ge { + 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws + /i i 2 add def + } { + Avals msg i get get addtocws + /i i 1 add def + } ifelse + } if + } if + + } bind def + + /Evalstocws { + /in exch def + /inlen in length def + /outlen in length 4 div 3 mul ceiling cvi def + /in [ in aload pop 0 0 0 ] def + mark + 0 4 inlen 1 sub { + in exch 4 getinterval 0 exch {or 6 bitshift} forall -6 bitshift + dup -16 bitshift 255 and exch + dup -8 bitshift 255 and exch + 255 and + } for + counttomark array astore exch pop + 0 outlen getinterval + } bind def + + /encE { + /p 0 def + /edifactvals 2100 array def + + % Lookup the values for each character + { + i msglen eq {exit} if + Evals msg i get known not {exit} if + p 4 mod 0 eq { + lookup mode ne {exit} if + msglen i sub 2 le { % Check end of data conditions + /remcws numremcws j p 4 idiv 3 mul add get def + /remvals [ + msg i msglen i sub getinterval { + dup Evals exch known { + Evals exch get aload pop + } { % Unencodable EDIFACT characters + pop -1 -1 -1 -1 -1 + } ifelse + } forall + ] def + remcws 2 eq remvals length 2 eq and { + % Implied unlatch to ASCII + edifactvals 0 p getinterval Evalstocws addtocws + Avals msg i get get addtocws + Avals msg i 1 add get get addtocws + /mode A def + /i msglen def + exit + } if + remcws 2 eq remcws 1 eq or remvals length 1 eq and { + % Implied unlatch to ASCII + edifactvals 0 p getinterval Evalstocws addtocws + Avals msg i get get addtocws + /mode A def + /i msglen def + exit + } if + } if + } if + Evals msg i get get + dup edifactvals exch p exch putinterval + /p exch length p add def + /i i 1 add def + } loop + + % Unlatch and pad with zeros until boundary + mode A ne { + /remcws numremcws j p 4 idiv 3 mul add 1 sub get 1 sub def + remcws 0 ne { % Unlatch if we haven't filled symbol + Evals unl get + dup edifactvals exch p exch putinterval + /p exch length p add def + } if + edifactvals 0 p getinterval Evalstocws addtocws + /mode A def + % Encode something to avoid latching immediately back + i msglen ne { + numD i get 2 ge { + 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws + /i i 2 add def + } { + Avals msg i get get addtocws + /i i 1 add def + } ifelse + } if + } if + + } bind def + + /encB { + /p 0 def /bvals 1558 array def { + i msglen eq {exit} if + lookup mode ne {exit} if + bvals p msg i get put + /p p 1 add def + /i i 1 add def + } loop + /remcws numremcws j p add get 1 sub def + /bvals [ + remcws 0 eq i msglen eq and { % Terminates symbol + 0 + } { + p 250 lt {p} {p 250 idiv 249 add p 250 mod} ifelse + } ifelse + bvals 0 p getinterval aload pop + ] def + 0 1 bvals length 1 sub { % Pseudo-randomise based on codeword position + /p exch def + j p add 1 add 149 mul 255 mod 1 add bvals p get add + dup 256 ge {256 sub} if + bvals exch p exch put + } for + bvals addtocws + /mode A def + } bind def + + % Derive the codewords + /cws 1558 array def + /mode A def /i 0 def /j 0 def { + i msglen ge {exit} if + [ /encA /encCTX /encCTX /encCTX /encE /encB ] mode get load exec + } loop + /cws cws 0 j getinterval def + + % Extend codewords to fill symbol with pseudo-randomised pad characters + /datlen cws length def + /remcws numremcws j 1 sub get 1 sub def + remcws 0 gt { + /cws [ cws aload pop remcws {129} repeat ] def + datlen 1 add 1 datlen remcws add 1 sub { + /i exch def + i 1 add 149 mul 253 mod 1 add 129 add + dup 254 gt {254 sub} if + cws exch i exch put + } for + } if + + % Lookup symbol metrics based on number of codewords and user specification + /i 0 def { % loop + /m metrics i get def + /rows m 0 get def % Rows in symbol + /cols m 1 get def % Columns in symbol + /regh m 2 get def % Horizontal regions + /regv m 3 get def % Vertical regions + /rscw m 4 get def % Error correction codewords + /rsbl m 5 get def % Error correction blocks + /mrows rows 2 regh mul sub def % Rows in the mapping matrix + /mcols cols 2 regv mul sub def % Columns in the mapping matrix + /rrows mrows regh idiv def % Rows per region + /rcols mcols regv idiv def % Columns per region + /ncws mrows mcols mul 8 idiv rscw sub def % Data codewords + /okay true def + cws length ncws ne {/okay false def} if + urows 0 ne urows rows ne and {/okay false def} if + ucols 0 ne ucols cols ne and {/okay false def} if + okay {exit} if + /i i 1 add def + } loop + + % De-interleave the codewords into blocks + /cwbs rsbl array def % Array of data codeword blocks + /ecbs rsbl array def % Array of error correction blocks + 0 1 rsbl 1 sub { + /i exch def + cws length 1558 ne { + /cwbsize cws length rsbl idiv def + } { + i 7 le {/cwbsize 156 def} {/cwbsize 155 def} ifelse + } ifelse + /cwb cwbsize array def + 0 1 cwbsize 1 sub { + /j exch def + cwb j cws j rsbl mul i add get put + } for + cwbs i cwb put + ecbs i [ rscw rsbl idiv {0} repeat ] put + } for + + % Calculate the log and anti-log tables + /rsalog [ 1 255 { dup 2 mul dup 256 ge {301 xor} if } repeat ] def + /rslog 256 array def + 1 1 255 {dup rsalog exch get exch rslog 3 1 roll put} for + + % Function to calculate the product in the field + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add 255 mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate the coefficients + /coeffs [ 1 rscw rsbl idiv {0} repeat ] def + 1 1 rscw rsbl idiv { + /i exch def + coeffs i coeffs i 1 sub get put + i 1 sub -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + + % Calculate the error correction codewords for each block + 0 1 cwbs length 1 sub { + /i exch def + /cwb cwbs i get def + /ecb ecbs i get def + 0 1 cwb length 1 sub { + /t exch cwb exch get ecb 0 get xor def + ecb length 1 sub -1 0 { + /j exch def + /p ecb length j sub 1 sub def + ecb p t coeffs j get rsprod put + j 0 gt { ecb p ecb p 1 add get ecb p get xor put } if + } for + } for + } for + + % Strange fixup for 144x144 symbols + ncws 1558 eq { + /ecbs [ ecbs 8 2 getinterval {} forall ecbs 0 8 getinterval {} forall ] def + } if + + % Extend codewords with the interleaved error correction codes + /cws [ cws {} forall rscw {0} repeat ] def + 0 1 rscw 1 sub { + /i exch def + cws ncws i add ecbs i rsbl mod get i rsbl idiv get put + } for + + % Place the codewords into the matrix + /module { + % cw row col shape + 4 -1 roll + (00000000) 8 string copy dup 3 -1 roll 2 8 string cvrs + dup length 8 exch sub exch putinterval + 7 -1 0 {1 index exch get 48 sub exch} for pop + 11 -3 roll + % 1 2 4 8 16 32 64 128 row col shape + { % Place each bit of the codeword in the shape, MSB first + exec + 1 index 0 lt { + exch mrows add exch + 4 mrows 4 add 8 mod sub add + } if + dup 0 lt { + mcols add exch + 4 mcols 4 add 8 mod sub add exch + } if + exch mcols mul add + mmat exch 5 -1 roll put + } forall + } bind def + + % Placement patterns + /dmn [ + { 2 copy 2 sub exch 2 sub exch } bind { 2 copy 1 sub exch 2 sub exch } bind + { 2 copy 2 sub exch 1 sub exch } bind { 2 copy 1 sub exch 1 sub exch } bind + { 2 copy exch 1 sub exch } bind { 2 copy 2 sub } bind + { 2 copy 1 sub } bind { 2 copy } bind + ] def + + /dmc1 [ + { mrows 1 sub 0 } bind { mrows 1 sub 1 } bind + { mrows 1 sub 2 } bind { 0 mcols 2 sub } bind + { 0 mcols 1 sub } bind { 1 mcols 1 sub } bind + { 2 mcols 1 sub } bind { 3 mcols 1 sub } bind + ] def + + /dmc2 [ + { mrows 3 sub 0 } bind { mrows 2 sub 0 } bind + { mrows 1 sub 0 } bind { 0 mcols 4 sub } bind + { 0 mcols 3 sub } bind { 0 mcols 2 sub } bind + { 0 mcols 1 sub } bind { 1 mcols 1 sub } bind + ] def + + /dmc3 [ + { mrows 3 sub 0 } bind { mrows 2 sub 0 } bind + { mrows 1 sub 0 } bind { 0 mcols 2 sub } bind + { 0 mcols 1 sub } bind { 1 mcols 1 sub } bind + { 2 mcols 1 sub } bind { 3 mcols 1 sub } bind + ] def + + /dmc4 [ + { mrows 1 sub 0 } bind { mrows 1 sub mcols 1 sub } bind + { 0 mcols 3 sub } bind { 0 mcols 2 sub } bind + { 0 mcols 1 sub } bind { 1 mcols 3 sub } bind + { 1 mcols 2 sub } bind { 1 mcols 1 sub } bind + ] def + + /mmat [ mrows mcols mul {-1} repeat ] def + cws length 1 sub -1 0 {cws exch get} for % Reverse cws onto stack + 4 0 % Starting row and column + { % loop + 2 copy 0 eq exch mrows eq and { + dmc1 module + } if + 2 copy 0 eq exch mrows 2 sub eq and mcols 4 mod 0 ne and { + dmc2 module + } if + 2 copy 0 eq exch mrows 2 sub eq and mcols 8 mod 4 eq and { + dmc3 module + } if + 2 copy 2 eq exch mrows 4 add eq and mcols 8 mod 0 eq and { + dmc4 module + } if + + { % loop for sweeping upwards + 2 copy 0 ge exch mrows lt and { + 2 copy exch mcols mul add mmat exch get -1 eq { + dmn module + } if + } if + 2 add exch 2 sub exch + 2 copy mcols lt exch 0 ge and not {exit} if + } loop + 3 add exch 1 add exch + + { % loop for sweeping downwards + 2 copy mcols lt exch 0 ge and { + 2 copy exch mcols mul add mmat exch get -1 eq { + dmn module + } if + } if + 2 sub exch 2 add exch + 2 copy 0 ge exch mrows lt and not {exit} if + } loop + 1 add exch 3 add exch + + 2 copy mcols lt exch mrows lt or not {pop pop exit} if + + } loop + + % Set checker pattern if required + mmat mrows mcols mul 1 sub get -1 eq { + mmat mrows mcols 1 sub mul 2 sub [1 0] putinterval + mmat mrows mcols mul 2 sub [0 1] putinterval + } if + + % Place the modules onto a pixel map between alignment patterns + /pixs rows cols mul array def + /cwpos 0 def + 0 1 rows 1 sub { + /i exch def + i rrows 2 add mod 0 eq { pixs i cols mul [ cols 2 idiv {1 0} repeat ] putinterval } if + i rrows 2 add mod rrows 1 add eq { pixs i cols mul [ cols {1} repeat ] putinterval } if + i rrows 2 add mod 0 ne i rrows 2 add mod rrows 1 add ne and { + 0 1 cols 1 sub { + /j exch def + j rcols 2 add mod 0 eq { pixs i cols mul j add 1 put } if + j rcols 2 add mod rcols 1 add eq { pixs i cols mul j add i 2 mod put } if + j rcols 2 add mod 0 ne j rcols 2 add mod rcols 1 add ne and { + pixs i cols mul j add mmat cwpos get put + /cwpos cwpos 1 add def + } if + } for + } if + } for + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx cols + /pixy rows + /height rows 2 mul 72 div + /width cols 2 mul 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/datamatrix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER datamatrix-- @@ -5509,466 +15547,1646 @@ Wc^5Df.1:GA2#8+Co%qBl7L&ATMd4Ear[DFcna"-P -j29RV8N3,N_LP!3 WD5*C2S @VV&,0 5?Y6O u"b #@<,jrA7Zm #F(^:/C6D8R -1Qk"OP#ZpnAUT_@04J@1Ch7K,@UX:eDe*FB@ZiNY@r,_"ASdA1F`)83FHSe604eX0AThX$+D,P -4D..OH"D2dmCm$r.NWDk&H]A,#I?ITn1OYEcEaa0=04f$2De*R"B9!(7@<[kjI?IQ@DI[TqBl7 -RD"*.goP!+.FD0'?!BlnD=@UX:eDe*FB1OXU'Ap%p+@ps=t+?Vb>DKTf-EbT#+4?P8j+BsXNLe -W\TL&ei?!<7cS6A>M]L&oPR![rd)N.qE;L')LO"9+#X9nif1L'<*^"q64j]nQc1L'S6C#e5TqB -ncsWL'mj5$h8r[dtS=FL(74<%n23a5)'Y8L([79'4ln4Kn^>1L)/!f(^Yp7:PKchL)[C'023Qn -La%X>Lh2;@Q%f:]L&h7.!@A5bL()ai%A&:aD2&QiL(G\d&GLnkm"Q.NL(gbF'Z#M=gg) -R1+BsX@LbOWZLi8"JOG3b@L&fPS!<\&W3/.HML&n?0!U5=?7"tb[L'#,E!saP_Ck`&!L'/lY"G -_^7aG'jnL'>5E"uM&=[Y>"qL'N]m#UP32Kn]mlL'ai6$>tS*onEj.L("BC%'50m=b[CsL(;Oa& -"-]V80D,m&VqWe3f$[iC5)_HL&dZs!6U#rl\5E_L&jr%!Hs1uX+gZ)L&r!B!a:<[U4ra7L''#^ -".+`EabBp@L'1J1"O)T(#)3;DL'?Cf"tbQ6NJ7Z2L'MFI#NgaHD2&>pL']kp$/C7B6&#`ML'qp -S$h7LF5!CW.CiF&rDKTf-EbT#+4?P8j+BsX>LbFQYLiS4MRYCg[L&g.d!>gIk:PJn.L&oeY!Z- -RmCPDn[L'%('"'1-YWeLWlL'3'^"Q>(=8;7;TL'BJh#,m7]4ba3]L'Ub5#d8sh6&#]uL'i'X$Q -+U+_1iA:L(+rR%FKn?ObOBJL(F$5&BJ-19d!Yr'Sn)l4c!9tHA2EgL&eN6!8WA1#)3.;L&l1H! -MbAMj+[UHL&tJ3!g&-.`mL&eoA!8WA1",6h -)L&k\:!I0>"WeLQ*L&r$C!^;>?KSBQBL'$Ll"#kr:HA2O>L'/*C"@e+KP_K>0L'9&]"dOfGgP, -o1L'FH.#5a,[983\SL'STM#_e!=qM#;u>q\_k>DNWB'Smui15J2O0AN>DNlI+G_n2:5EY>!/?4.RYCgX -L&g@j!=snc6&#DYL&n9.!Qp,u#_iCQL'!$_!mZN&(kr,rL'+-("7([E6\Y`-L'7=,"]pE^\V:: -_L'Cn;#/l6$0STh*L'SKJ#`OKDs+Ui0L'e$;$B'WGq1]96>q\np>DNcF)Mfl!5)<0oC5@1j!18 -K@["\S2L&h+*!?[$s983I^L&mg!!Q'QlpkAi(L&u=K!h+iFa+a[(L'(S5"-80=jb_WHoL'J\qU -:KL'&3G"%n:MJqaBAL'-%^"<3'u7>:qdL'5DK"Sl=G5!CW8@;]go+?Vb>9H[Pq$A]CP+G__-6& -8Ep?\il[!0)^5VhP2kL&g4f!="8Z)MS8XL&l"C!KDg7\qU7LL&qp@!^)2=C5)e_L'#bW!t^1h8 -qmG&L'+N3"6tUD.Y\(BL'4c9"SmcU6\Yc$L'?4a"t>92I>.sBL'JT%023QnL^8eJL`2'rLbsoR -LeEP0Li8"JK8'AqL&eK5!6g/thhD.1L&i$D!B,Z5=bZs-L&m`t!Od^`i._:EL&s)a!bR/gN.qD -@L'$.b!t'bb983OtL'+c:"6tUD,_cG)L'3lu"NZ<$%#+p`L'=&P02WirL^/_EL_PXbLa@j/Lc' -uTLern5Li%rrL&dKn!2"uG["\S#L&g.d!:tpG&;C37L&j>i!F1?[G_Q6cL&nf=!R?E#n:gu[L& -s#_!aLH]HA2L&L'#\U!q_3L(5;oVL')7H".P#Ib_?6#>q\_k>DNE<#`'"I'o3fb,`!h(1l+8M8 -r-K'@#/ZUG_Q3SL&dZs!3LtU^P2a8L&gOo!;M9L%Yb!(L&jAj!D8(ID2&(BL&mQo!Nq.XabBiY -L&qR6!\&j*:5/gUL'!-b!hk>M]nQUVL'%um+?ht35!G,c05YE5Ec5GrE-!-a4>1SpD.Ra%@j!l -r02*KmL]rSAL_kjl>q\np>DW<8#`'+L*aLEr+Bs[%M#W;2L_X2K80D,ms+p]2s+p\\+?htB@;K -mr@;^4)ATDKp+?Vb>9H[Pqs+gl8%Ytj*023QnM#W87L^T"O>q]%t>DW<8s+p]2%:(VX+Bs[%M# -W;2M#Ua'5!CW/H$!U?4?P8j+Bs[%M#W8;L_!cE9d!Yrs+p]2#D`gp02WirM#W;2M#W8;>q\_k> -DW<8s+p]2s'6a24tg\[DJEl.4?P8j+Bs[%M#W88L^@??9d!Yrs+p]2"Gd=h02WirM#W;2M#W87 ->q\_k>DW<8s+p]2s'6a24s3$QOu"b&DI[iuCi^^]4>1SpD.Ra%@u(+<@;Kmr@;^4)ATDKpL]K/ -1SpD.Ra%@kVD2@r?F+ATDKp04A[9BOPe$D.Ra%@kV -D2@ps1mBOPe$D.Ra%@kV;:FCd+:DI[.$FCd+@@;]go04f$2CLM*qBcoT'Ou"b.Bk29->E/h?0J -G5A">DMa0TH8i0eb;A">MSa0O9ht05YE6F!*S-024/D>E/]>s+p]2s'79P1*Be]!AKN70o5jcs -'79P1E]n^!\cE/e>0JJLh0JG5A"#)G`NWUsi0jTS9L]N;[H\_`d -V2,JA5*@U:Bk2:5P"7c#Ou"b$@ki(D3?VO^$A]"E#`&alOu"b$@kfZZD_a3n>DN]D$]#@M$=/f -N04SKI2frsp0HaSU%YtRM&;Ua#Ou"b$@r,^oF!*S-024/D>DNB;s+p]2s'79P1*BeW"Gd/9s+p -\\0245F>DNH="Gd2:"'mQS1a$"Y#)EG="c*:eL]N;4L^AEa!g9C9$BdT90OnTIFDj0fP":B9L] -N;MH\_`dV2,JA5*@U0@kfZZD_a5!P":BJL]N;[H\_`dV2,JA5*@U0@koubD_s.rP"7c#Ou"b$B -OPpu@;q5Y0JP==1c70M3&s8k6UX@47n?3D92&&T:Jand;cHat='/U/+=&6_.kNA,3g)9P@q]:k -G%#3.Lb+]HOu%moL]N;_H]g?uBOPpu@;qAnP"Us%@q]:kG%#3.L]`G6P)#3FI?I,SASu!qF_t] -1Bk)KCBl9(tOu"b0F`\a?DN\Ib$Bf4]"-QQ -/;O@`"HoUE0TnDY@Yb/M5*Dn.5*C1EBcq,G!KmJH1OYEdI?ITn3,`q]P!3WD5*C2S@VV&,05?Y -6Ou%NLAT)^5L]D1Q9RW'6Ou"b&DI[*kE+iZtF_t]1Bk)KCBl9(tOu"b0F`\a?DN\Ib$^,=^!g6 -H;!KmJHV33VfBnubP1GRsF!,=6Ap*@-!Jg`3s+p]2s+p]2s+p\\+C-*oNWj96@rcLJ!_kG+%>\JL@u*rcL]rS=Lgu -6N>p*@-!Jg`3!Jg`3s+p]2s+p\\+C-*oNWj96@rcLJ!_kJ,%u=\N@tju:>DNK>#`)uH@pL3]L] -N;3L]N;3M#W;2M#W;2>p*Dq>E/l(Bk)1%NWMp3L_5GPLgu/>^fuU#L^JqJLgs^5>DN<9!/LZ3! -/LZ3!/UZ2s'6aQ+Bsj/Ap%p+NWCkj'o6=T@tk!1>DNN?$A].I&R?M`L]N;3L]N;3L]N;3L]N;3 ->p*Dq>E/huF_klS!A]HKL_>MRL&kpkL^JqLL_bdd>p*@-!Jg`3!Jg`3!Jg`3!Jg_]+C-*oNW`s -:Ci#+41Pd'-(5QIT!]O>>%u;-[,`"!W+BsX&L]E53L]E54L]E54L]C^'>p*@3"D2dmClSNQL`q -QmLgu/A-X2B@La7d5Ld55g>DN<9!/L]4!/L]4!/Lc6!*p^Q+Bsj/Ap%p+NWD"n-&D -O2R0Si8U=C!%RL]N;3L]WA4L]WA6L]WA6>p*Dq>E/huF_klS!B,`_La%XbL';3oLa7dALgZ$X> -p*@-!f-i4"Gd&6"Gd&6"Gd%`+C-*oNW`s:Ci#+42i'&A(5O;l"s@-+.#:EMCk_qA>p*@-!f-i4 -"Gd&6!f-u8"Gd(a+C-*oNW`s:Ci#+43/B;F(l0Yr#EW/G0Sihc!/-(,S6[7AL]WA4L]WA6L]iM -8L]iM8>p*Dq>E/huF_klS!BGrnL`2(%L'\u,LcgK2L&dm$!5Mk_>DN?:!/L`5!f-u8"Gd2:"C3 --U+Bsj/Ap%p+NWLphLcL82Lba\lcs);sL&cg[!5Op*Dq>E -/huF_klS!\lEc4bt/82MMX5>DQ+1!1&?>i._7<>p*@-"Gd&6!Jgl7"Gd2:",I4g+C-*oNW`s:C -i#+50f"PNL`hL7L(9;LLgYr;Y_E/]L&j,:+BsX'L]WA:L]WA8L^&Y?L]h!+>p*@3"D2dmClSQO -1PeJU,)AF;&>36`BSHN,L&iEO!FT1U>DNEp*Dq>E/huF_klS!\lQg9o'^D0SU -9g>D<-2L&g^t!GI2gY[&AUL]rS8L]rSL^T"D>p*Dq>E/huF_klS!\lTh;2?-H156S1>D -<->L&i-G!LSTBi*@I0L]rS8L^/_p*Dq>E/huF_klS!\lWiD<-VL -&j,c!PjEk'O;hcL]N;8L^Jq=L]N;BL]WAE>p*Dq>E/huF_klS!\lZj=bn,T3//D'>D<-bL&k2, -!VhBN9O/cFL]rS8L^Ak?L_5FDL]WAG>p*Dq>E/huF_klS!\l]k?&0PX3ee^Q>D<-rL&l+F![<@ -#MHq?/L]`G9L]`G@L_5FGL^AkK>p*Dq>E/huF_klS!\uHc@>H+`5)(6H>D<.9L&ms%!a(0Y]Nl -XaL]`G:L]`GBL_#:FL_#:K>p*Dq>E/huF_klS!\uKdAV_=^157&">D<.9L&nl?!ec:0mTgr>L] -iM:L_5FCL_5FIL_GRK>p*Dq>E/huF_klS!\uNeBo![`157/U>D<.UL&p(a!j[O_0O5f*L]WA;L -_5FCL^/_ILa%WT>p*Dq>E/huF_klS!\uQfD296h2MN]W>D<.gL&q((!q(dFKO#^)L]iM;L]iMD -L^T"KL_,@P>p*Dq>E/huF_klS!\uTgEJPTj2MNgu>Dp*Dq>E/huF_klS!\uWhFbh/r3efAb>DL^8eGL^/_OL_b -dU>p*Dq>E/huF_klS!\uZiH&*Mt3efLk>DL_GRIL`D3TL`qQW>p -*Dq>E/huF_klS!\u]jI>B)'5))'C>DL_bdKL^8eTL^](Z>p*Dq> -E/huF_klS!\u`i!.fqELba]I$X8>dL5#c^L'/EL"RKD:>DNB;$A\e?(Pi3M+,C;\+'g!p+Bsj/ -Ap%p+NWLsrL&cp`*f)_/5Tp*@3"D2d -mClSQQ0STRaL`2(+L."[=L&o/G""]00Y_E=S>p*@-"c*MA'8R!O%u;*Z(Pir7+C-*oNW`s:Ci# -+51GOUaNJJX33/0tn>D<1:L'(t@"U]tfqHY4JL^f.BL]WAQLan2]L_kje>p*Dq>E/huF_klS!] -)Td!0N']LcgDd$X8>dre:NFL':&$##nkN>DNlI!/Lu<(PiES,D["h,@)Et+Bsj/Ap%p+NWM!mL -&dKp*f)k3;4CdE!ZZpse:n."L'Fed+BsX6L]N;AL_Y^dL_GRPLb;sU>p*@3"D2dmClSQQ1kl!u -La%X=L/prOL&sDj":U"gqM#4\>p*@-%>Y4E%YtpW/;OOe4, -C2MPAm>D<2?L'/oZ"u_2@@U1*\L^](EL^](XLaRugL_bdq>p*Dq>E/huF_klS!])`h!252cLba -]kcs)5+=G?rdL'E`o#J==b>DNK>%Yt=F,)@k-$A\b>5[>L<+Bsj/Ap%p+NWM!qL&e'+*/HM-A) -LRG!d9;$["\eML'TVA+BsX6L]iMSL^o4qL^JqTLb;sU>p*@3"D2dmClSQQ3/.F4L`hL7L1q3'L -'!To"RLjJ7"tuK>p*@-"Gd\H%>Z-_0Sg3p.Yo3Q+C-*oNW`s:Ci#+51HC0iXb[mO2MQ*W>D<4+ -L'8iW#G-YV#$i?UL_PXJLa\&aLb"8sL^Jr*>p*Dq>E/huF_klS!]2Tc!3q>$LcU93cs)5+mY1m -ML'RL.$%?/&>DNrK#)EnJ+,D+s,)?qh4^B19+C1-d04eX0G%#3I"ADNe87c:IAThX$P)YWIP%' -S`F"d2NA1G@;L!rOu%/nH=_m?P!*l#H=_mCP!+tKHS98H -GB4mE@sE1 G<< L@PK! BL^0) 9A RfP "@; L`$P -&-:SOu"b&@q%29D 28F[9 4_ ULG%# 3C!g 7A U!K mJH99 M(a Deid, +EVX -HAWei]DfT]'FB4>RsF-:!CD/Ws J:jXj 6CL MK2 Am oL sAW eit P#Q"&@ PN ]=P!*A d@P -Wc>P!+tKHS9;Q@< iu-@ ;L! rO u% NL< ,ZP \H$ b]>I -?IP_Bcq,G!KmJH1 OYEt 0 4o -C D.. N/A o_a1 Ou"b7 -ATDj+Df-\@ATDjT 1G<9KE +0r # @s; u: ARf1 (+D #%l16M[$;N `ghARf[g+Dt -\5F!,%(@PK!:@q% 3V!Kp> k@r P n?WK K%jF CfK 0F!*S-0240 ]"#)D_0243^ -"Y_Va0JG.S1QD\o 0JG170 JG. S1l_ kr0J G17 0JG175!G,c 06CcGD'3q3E -c#k?G%G]8Bl@mP@ !d!,E c#k? G%G]8 Bl@m P97 ;/I">DM`0R ]*aOu"b5ATD -W1FCfK0L]Ct&De' u-F(\ rrFE< USP,W P7E c$tKL]W_WP #-Lg5(/SnP' -)p]Ou$rrB4>RsF- :!SATDX N@ZgbT V33fo !,Z di@VKq*P'N 3MD0'?!BlnE -Z@WZ1%D3B/tD0'?!BlnEZ5*@]TE+*9"A8Q6qP,4L]V%)@s9&0P,X6DN<7!<7D/3/@X!Cm -$c4!DN;k@rPn(L]DjdK3aWrL]E5 -3ARf[gL]N[Oo]'2AS,Oq+D#&%@N]EKWJCSGnE+4u(I?G)'1G<9KGB749ARf1(+D#%l16M[$$'I(tAR -fq*@N]5l@PK!:@q%3V!KmbP1Pc$e!G,bM0o,jnWI$:4P!5$bA7Kh)@N]A-@s;u:BcpqrE+4uHA -7KRfP"_$`ARfq*@N]A-A7Kh)@N]BJ96,)`De*F#P'DD<8;I8%!G,bM15GsoWI$:4P!5$bA7Kh) -@N]5l@PK!>Oo]':F!,%(@PK!9@rPn?ChY#&@rPn5!KmJHCm"g0@rPn5!KmJH9TjX3@sP,Wd]C6CcD1LkWM+CfUL]NY>Ou%NL8:?Xl -Eaia)L]ET7HS9>HA0>B+F-:!g!KmJH$'I)`@:Y/o@s@s;u:Bp),F&!@'O"Hj -:YG[kr=+DDs.GB4m@L]NY>P"UW/Oq3?ZOp#9=F!,1[99O=YG^Y`G@s;u:DI[m3L]N[<@s;u:DI -[m3L]N[5F(or3P&,K$s*^&_?'6usEG]lG+EM7CA -Wgkm!I^+@Ou"b'E+*i2>9I.+!Jgc4!Jgc4!Jgc4!Jg_]+BsX&L]E52L]E52L]E53L]C^'>DN<9 -!/LZ3!Jgc4!/LZ3!*p^OL]N;3L]N;4L]N;3L]N;3>p*@-!Jg`3!Jgc4!Jg`3!Jg_]+BsX&L]E5 -2L]E52L]E53L]C^'>DN<9!Jgc4!Jgc4!Jgc4!*p^OL]E52L]E52L]E52L]E52>p*F91Pc$e!G6 -:ZFHU*h!KsF/06r^EOu%moL]M+,@<@;*P"UsIL]N[5G`o%^!KsF-+E;7A+D,S%P -'Cq[G]P!P+EM7CAKZ8]WJCS9I.+!Jgc4!Jgc4 -!F6gPL]N;3L]E52L]Ld(>DN<9!/LZ3!/LY]+BsX&L]E52L]E53>p*@-!Jgc4!Jgc4!F6gROu"b -1F`_&.B5VZsFF,Z[H'1@S1G<]lP!5$bL]E53L]i&XE+4toOu%moL]N;7HS9>HP!5$bE+sQ<+E2 -QJE++n1E-WRF@Zgb3D0@%1ChIX)@<116SVXBmO?H%?d];056S5Ou$g."E8L*@;KRoE+*jE"DJutF`_&.B5VZsFFB116SVXBmO?H$'M9706iXDOu$NfE&*4NP,Vl2E&/VFF)WmtWH2d"AV^YUWI$:DP!5$b -GT_8SE-682ChIX)@!g7;]G]7AAF,1$7+E;7A+DHW4Oo^@?P%p/)I?I-LH\_r`!HVt$AV^AMWI$ -:4P!5$bE+sQ<+DHW3EG]kABnueQ!Jgf?C6Eg\Bm=]T!,3QqD0@%9L]NY>L]W`SP'DD<8:?Y$Ao -D^,@<@M4Ap%p+P!+.FAoD^,@9I.+!/Lnd+BsX-F(or3L]N[<>p*Dq>9I.+!Jh"e+ -BsX-F(or3L]Wa=>p*Dq>9I.+!f.+f+BsX-F(or3L]`g>>p*Dq>9I.+",I4g+BsX-F(or3L]im? ->p*Dq>9I.+"Gd=h+BsX-F(or3L]rs@>p*Dq>9I.+"c*Fi+BsX-F(or3L^'$A>p*Dq>9I.+#D`X -k+BsX-F(or3L^0*B>p*Dq>9I.+#`&al+Bot0BmO?H#a20C#[JQY+BosmL^8eA>p*>oF(or3L^0 -*BL^79/>p*>o>DNQ@"^N6T+EM7CAV^PRWJCgc+C-*o+BsX-L]h!+>9J!$H=_m9P,X6C>p*Dq>9 -I.+#`&Rg+Bot0BmO?H"Hoa?#[JQY+BosmL^8e<>p*>oF(or3L]`g>L^79/>p*>o>DNQ@!F6gP+ -EM7CAV^DNWJCgc+C-*o+BsX-L]C^'>9J!$H=_m5P,X6C>p*Dq?'7!lHS8uLEc#6,D..B+>9I,m ->DN<9#[JQY+BosmL]WA<>p*Dq>9I.+",I4g+C-*o+BsX)L^79/>p*>o>DNH=#[JQY+BosmL^&Y -@>p*Dq>9I.+#D`Xk+C-*o+BsX-L^79/>p*>o>DNQ@#@/HX+BosmL^8e@>p*Dq>9I.+#`&Xi+C- -*o+BsX-L]h!+>p*>o>DNQ@"'m$T+BosmL^8e<>p*Dq>9I.+#`&Le+C-*qOu%NLp*>o>9J!$H=_m>P,X6@>p*@-"`nC(AV^\VWEgWP+Bosm+EM7C -AV^_WWJC^`+BsX*F(or3L^TBF>p*Dq>9I,mF(or3L^B6DL]h!+>DNE'BmO?H$'M8n+C-*o+Bot -0BmO?H$BhBE"C3-SL]hd5H=_m>P,V_0>p*>o>9J!$H=_m?P,X6?>p*@-"ES:'AV^_WWEgWP+Bo -sm+EM7CAV^YUWJCX^+BsX(F(or3L^B6D>p*Dq>9I,mF(or3L^KDNB&BmO?H$BhAo+C --*o+Bot0BmO?H$^.KF"'m$RL]_^4H=_m?P,V_0>p*>o>9J!$H=_m=P,X6=>p*@-!cr(%AV^YUW -EgWP+Bosm+EM7CAV^\VWJCU]+BsX'F(or3L^Kp*Dq>9I,mF(or3L^TBFL]Uj)>DN?%BmO?H -$^.Jp+C-*o+Bot0BmO?H$'M9D!F6gPL]MR2H=_m=P,V_0>p*>o>9J!$H=_m>P,X6<>p*@-!HVt -$AV^\VWEgWP+Bosm+EM7CAV^_WWJCR\+BsX&F(or3L^TBF>p*Dq>9I,mF(or3L^B6DL]C^'>DN -9#BmO?H$'M8n+C-*o+Bot0BmO?H$BhBE!*p^OL]DL1H=_m>P,V_0>p*>o>9J!$H=_m?P,X6;>p -*@-!-;k#AV^_WWEgWP+C1-dI=!VjATDj+Df0E#E$/@-?'7!lP#Z[:EcYr5DJ`g$H[C*fP"BY1F -s(aD..L$Ap&!$F-:!q$'I*# -!/LYm@<64*P%'4JP,Wd]D3@)G1GBmO>5F(or3P&-9fOu%moL]MR2H=_m5P,Wd]C6Cc -D1Pc$e!HVt$AV^AMWI$:4P!5$bBcq.5D..L$Ap&!$F!,=_99MMq!0TKaBm=\ABcq.5EG]l^98N -V24d#qpL]MpNL]DjdDet41P!+. -F@rH1>!0T,kE,TfB+E27?G_cB`WKK&cHS8lICkr+T1G<]cF*JgHDf^/Z!KmJH1G<]cF*SmIDf^ -1HA8-(I!Ko6XDf^2[!0Ur5Df^1HF(or3P"LmXHS8oDEZen,EesaYCm$S-E,TfC+E27?Gp$X3Ef -pHd1G<]cF*JgHDf^/Z!g9OG1M1QGD..OH"D2dmCm$r#Df^/Z#*M-4"FDe@Df^.GE,TfBL]N[HS9,s5*@^C@rcBs+DR'4L]`f -TL]ET$HS8u>@rri7@rcBs+DR'4L]`f"-Pf^L]ikAF(96,AWgMc8s44A06:WD1E^aKE\iM"Oo^_%I=$$FEbo;0C5;tTWKKo1"H -lAu@rcBs+DQ]7Oo^_=L]il5P&bn&F(95H+EM%51PdHB!Ko6eP#Qjm -OpR:-05P'Ou%moL]MR2H=_m5P,Wd]Bp(ZC1MpQ@CPVtH!,3QsBmO?R30H7aCkr+TWI&]3D3@)G99MJp!Kp -QJ4aW>UL]NY>P!4;@L]NZ&I?ITYP":aYEbo0p2PjDD@;L)i+QYWKKr<$Y=KiCh@g+Ci1tF -1E^QkOo[4R1Qjqb1N"q1!AA=FP!5$bP'&Eo@<6O0@;0b'+EV:2F)YQ%EcWmUBPDO,@;0b'+DbJ --FDtZ&Ec[C"Ou%0)D/sQ=L]ET2L]NZ%H\_ZMH\_]NP#ZRKD/sQ=H]gRK!KpQJ!KoWpP"CgZFD, -B0E+*I$F-6ooF_QX3P#-LB@<--+CghC,E+*I$F-6TfF`_;2F)YQ%Ec[BFP'(Xt+EM7CAUBS(F( -or3@:Wn'P$!kJL]`eCL]ET$H\_ce!I^,1I?K49DDIA=Ou&77I?IQXP"76:@<-.>!-XmFHQZfDLHkBCLV4(L_ -,_cA8?4!F-6QeDLI[JI?G)'1G<3KF*)J5DfTEB4.=:kOu%moL]M@$F),i[@Yb&JWI$:8P!5$b0 -5Y-=CNFc<+EM7CAKZ&.H=`7UOpR:-L]E53F(or3+EM7CAWgkc!KsF/056S5Ou$r`F),iBD'3O8 -E+sQ<+DI!3D..L$F!,=_950P^P/3<+I?I-5DfT]'FH-K9F_klW4aV$SF),iBD'3D5@;KOuChtb -G@rHC!P!5$bI=#g>F),iBD'3D5@;Kdp@rcK@F(9-/AWf6?1OYEdF(9-/AKYGnF*)J5DfTEPApZ -1?ATMs7H#4[@@<64*H#8^#04JL6FDYH-CNa-&+Dm8t04JL6FE:r1Eb-A7@rHC!Ou%NL<.0p#05 -tWMF!+q'F*)JKD3?\eDfT]'FH-K9F_klW4aShoD00r0Ci^_'L/\e?;'gs'I"kiuL.1om5gG*[Q -\J,*L3LRjEq>$6WePbhL1W)n@i0r:6&')sL),W#'>B2@kCsl$L'M1B!`asa%#,$LL,E=m0PH2* -0nq^nL*X-\+bPM%g4h-F?'6usARfFbNW`'M85Wr.Ch7d$Cm'd@Fcp3s5*C&O5*C&O1GN%q9*kFDYH-CNa-&Oo^_=Ou%N504o'CG%#3.+BsRg7>=*KL/'7R9,r -[dY(fc@L0q`N>5*baPD3PBL2HmDBZc'QG_U98L3sbkGp.nHhM)-sL((;@$&=6O222_FL)jKQ(i -4pQ#_jHdL+d.n.T(pWj+];9I.+!*p^OL]N;5>p*@-",I(c+BsX*L -^&Y?>p*DqF(or3L^TBFL]W`;P"T@rCj'6'P"Uro04o'CG%#20Ao2X5@;L!-F*VV:A;C;M%q9*k -FDYH-CNa-&Oo^_=Ou%NLD@ -NiKE)"+]S$7bR[Jg/!2S(s!!'Y)KE)"m@Y=^]fLLSp!9O`D!!)gCKE)#\G_?%t'O?@l!@en=!! -+r4KE)$EVM"pMF"_KHG^(?PBmO>DE+sQB+EM7CAM7_.BkM+$+EM7CAV^DNCk -tWF2D98gA9;K-F(or3L]W`ULe*[e05kfO+E)4@Bl@m1+?ht3A8c@-A9)+&P&N'-Eb0-*@ -% uk.co.terryburton.bwipp/qrcode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp qrcode 0.0 2015050900 265291 275512 +%%BeginData: 1004 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/qrcode { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /format (full) def % full or micro or any + /version (unset) def % 1-40 or M1-M4 + /eclevel (unset) def % L, M, Q or H + /parse false def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + % Convert input into bytes accounting for FNC characters + /fn1 -1 def + /fncvals << + (FNC1) fn1 + >> def + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + % If FNC1 in first position then escape % as %% + /fnc1first false def + msglen 0 gt { + msg 0 get fn1 eq { + /fnc1first true def + /msg [ msg 1 msglen 1 sub getinterval { dup 37 eq {dup} if } forall ] def + /msglen msg length def + } if + } if + + % Default error correction level + eclevel (unset) eq {/eclevel format (full) eq {(M)} {(L)} ifelse def} if + + % Convert from input into message bitstream + /N 0 def /A 1 def /B 2 def /K 3 def + + /Nexcl << + [ + 16#30 1 16#39 {} for + ] {-1} forall + >> def + + /Aexcl << + [ + 16#20 16#24 16#25 16#2A 16#2B 16#2D 16#2E 16#2F 16#3A + 16#41 1 16#5A {} for + ] {-1} forall + >> def + + /Bexcl << + [ + 16#00 1 16#1F {} for + 16#21 16#22 16#23 16#26 16#27 16#28 16#29 16#2C + 16#3B 1 16#40 {} for + 16#5B 1 16#7F {} for + 16#A0 1 16#DF {} for + ] {-1} forall + >> def + + /Kexcl << + [ + 16#81 1 16#9F {} for + 16#E0 1 16#EB {} for + ] {-1} forall + >> def + + /mids [ % N A B K + [ (0001) (0010) (0100) (1000) ] % 1-9 + [ (0001) (0010) (0100) (1000) ] % 10-26 + [ (0001) (0010) (0100) (1000) ] % 27-40 + [ () -1 -1 -1 ] % M1 + [ (0) (1) -1 -1 ] % M2 + [ (00) (01) (10) (11) ] % M3 + [ (000) (001) (010) (011) ] % M4 + ] def + + /cclens [ % N A B K + [ 10 9 8 8 ] % 1-9 + [ 12 11 16 10 ] % 10-26 + [ 14 13 16 12 ] % 27-40 + [ 3 -1 -1 -1 ] % M1 + [ 4 3 -1 -1 ] % M2 + [ 5 4 4 3 ] % M3 + [ 6 5 5 4 ] % M4 + ] def + + /termlens [ 4 4 4 3 5 7 9 ] def + + % Encoding functions + /tobin { + string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } bind def + + % Alphanumeric character to value map + /charmap (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:) def + /charvals 44 dict def + 0 1 44 {dup charmap exch get exch charvals 3 1 roll put} for + + /encA { + /in exch def + fnc1first { % FNC1 as % + /in [ in { dup -1 eq {pop 37} if } forall ] def + } if + /out in length 11 mul 2 idiv 1 add string def + /k 0 def /m 0 def { + k in length eq {exit} if + k in length 1 sub lt { + charvals in k get get 45 mul charvals in k 1 add get get add 11 tobin + /k k 2 add def + } { % Final character + charvals in k get get 6 tobin + /k k 1 add def + } ifelse + dup out exch m exch putinterval + length m add /m exch def + } loop + out 0 m getinterval + } bind def + + /encN { + /in exch def + /out in length 10 mul 3 idiv 1 add string def + /k 0 def /m 0 def { + k in length eq {exit} if + k in length 2 sub lt { + in k 3 getinterval 0 exch {exch 10 mul 48 sub add} forall 10 tobin + /k k 3 add def + } { + k in length 2 sub eq { % Two final digits + in k 2 getinterval 0 exch {exch 10 mul 48 sub add} forall 7 tobin + /k k 2 add def + } { % One final digit + in k 1 getinterval 0 exch {exch 10 mul 48 sub add} forall 4 tobin + /k k 1 add def + } ifelse + } ifelse + dup out exch m exch putinterval + length m add /m exch def + } loop + out 0 m getinterval + } bind def + + /encB { + /in exch def + fnc1first { % FNC1 as GS + /in [ in { dup -1 eq {pop 29} if } forall ] def + } if + /out in length 8 mul string def + 0 1 in length 1 sub { + /k exch def + in k get cvi 8 tobin + out k 8 mul 3 -1 roll putinterval + } for + out + } bind def + + /encK { + /in exch def + /out in length 2 idiv 13 mul string def + /k 0 def /m 0 def { + k in length eq {exit} if + in k get 256 mul in k 1 add get add + dup 16#E040 lt {16#8140} {16#C140} ifelse sub + dup -8 bitshift 16#C0 mul exch 16#00FF and add + 13 tobin dup out exch m exch putinterval + length m add /m exch def + /k k 2 add def + } loop + out + } bind def + + /encfuncs [ /encN /encA /encB /encK ] def + + /addtobits { + dup bits j 3 -1 roll putinterval + length j add /j exch def + } bind def + + /numNs [ msglen {0} repeat 0 ] def + /numAs [ msglen {0} repeat 0 ] def + /numBs [ msglen {0} repeat 0 ] def + /numKs [ msglen {0} repeat -1 ] def + /nextNs [ msglen {0} repeat 9999 ] def + /nextBs [ msglen {0} repeat 9999 ] def + /nextAs [ msglen {0} repeat 9999 ] def + /nextKs [ msglen {0} repeat 9999 ] def + msglen 1 sub -1 0 { + /i exch def + /barchar msg i get def + Kexcl barchar known { + nextKs i 0 put + numKs i numKs i 1 add get 1 add put + } { + nextKs i nextKs i 1 add get 1 add put + } ifelse + Nexcl barchar known { + nextNs i 0 put + numNs i numNs i 1 add get 1 add put + } { + nextNs i nextNs i 1 add get 1 add put + } ifelse + Bexcl barchar known { + nextBs i 0 put + numBs i numBs i 1 add get 1 add put + } { + nextBs i nextBs i 1 add get 1 add put + } ifelse + Aexcl barchar known { + nextAs i 0 put + numAs i numAs i 1 add get 1 add put + } { + nextAs i nextAs i 1 add get 1 add put + } ifelse + } for + /numKs [ numKs {1 add 2 idiv} forall ] def + + /KbeforeB {numK exch ver get ge nextBs numK 2 mul i add get 0 eq and} bind def + /KbeforeA {numK exch ver get ge nextAs numK 2 mul i add get 0 eq and} bind def + /KbeforeN {numK exch ver get ge nextNs numK 2 mul i add get 0 eq and} bind def + /KbeforeE {numK exch ver get ge numK 2 mul i add msglen eq and} bind def + /AbeforeK {numA exch ver get ge nextKs numA i add get 0 eq and} bind def + /AbeforeB {numA exch ver get ge nextBs numA i add get 0 eq and} bind def + /AbeforeN {numA exch ver get ge nextNs numA i add get 0 eq and} bind def + /AbeforeE {numA exch ver get ge numA i add msglen eq and} bind def + /NbeforeK {numN exch ver get ge nextKs numN i add get 0 eq and} bind def + /NbeforeB {numN exch ver get ge nextBs numN i add get 0 eq and} bind def + /NbeforeA {numN exch ver get ge nextAs numN i add get 0 eq and} bind def + /NbeforeE {numN exch ver get ge numN i add msglen eq and} bind def + + % Encode unterminated bitsream for each version group separately + /msgbits [-1 -1 -1 -1 -1 -1 -1] def + /v1to9 0 def /v10to26 1 def /v27to40 2 def /vM1 3 def /vM2 4 def /vM3 5 def /vM4 6 def + /e 10000 def + [v1to9 v10to26 v27to40 vM1 vM2 vM3 vM4] { + /ver exch def + + % Derive optimal sequence + /mode -1 def /seq [] def /i 0 def { + i msglen ge {exit} if + /numK numKs i get def + /numB numBs i get def + /numA numAs i get def + /numN numNs i get def + ver vM1 eq numA 1 ge and {/seq -1 def exit} if + ver vM1 eq numB 1 ge and {/seq -1 def exit} if + ver vM1 eq numK 1 ge and {/seq -1 def exit} if + ver vM2 eq numB 1 ge and {/seq -1 def exit} if + ver vM2 eq numK 1 ge and {/seq -1 def exit} if + { % common exit + mode -1 eq { % Set initial mode + [ 1 1 1 e e 1 1] KbeforeA {K exit} if + [ 1 1 1 e e 1 1] KbeforeN {K exit} if + [ 5 5 6 e e 2 3] KbeforeB {K exit} if + [ 1 1 1 e e 1 1] KbeforeE {K exit} if + numK 1 ge {B exit} if + [ 6 7 8 e e 3 4] AbeforeB {A exit} if + [ 1 1 1 e 1 1 1] AbeforeE {A exit} if + numA 1 ge { + ver vM1 ne ver vM2 ne and {B} {A} ifelse exit + } if + [ 4 4 5 e e 2 3] NbeforeB {N exit} if + [ 1 1 1 e e 1 1] NbeforeB {B exit} if + [ 7 8 9 e 3 4 5] NbeforeA {N exit} if + [ 1 1 1 e 1 1 1] NbeforeA {A exit} if + numN 1 ge {N exit} if + B exit + } if + mode B eq { + [ 9 12 13 e e 4 5] KbeforeB {K exit} if + [ 9 10 12 e e 4 5] KbeforeA {K exit} if + [ 9 10 11 e e 5 6] KbeforeN {K exit} if + [ 4 5 6 e e 2 3] KbeforeE {K exit} if + [11 12 14 e e 5 7] AbeforeK {A exit} if + [11 15 16 e e 6 7] AbeforeB {A exit} if + [12 13 15 e e 6 8] AbeforeN {A exit} if + [ 6 7 8 e e 3 4] AbeforeE {A exit} if + [ 6 7 8 e e 3 4] NbeforeK {N exit} if + [ 6 8 9 e e 3 4] NbeforeB {N exit} if + [ 6 7 8 e e 3 4] NbeforeA {N exit} if + [ 3 4 5 e e 2 3] NbeforeE {N exit} if + B exit + } if + mode A eq { + numK 1 ge {K exit} if + numB 1 ge {B exit} if + [13 15 17 e 5 7 9] NbeforeA {N exit} if + [13 17 18 e e 7 9] NbeforeB {N exit} if + [ 7 8 9 e 3 4 5] NbeforeE {N exit} if + A exit + } if + mode N eq { + numK 1 ge {K exit} if + numB 1 ge {B exit} if + numA 1 ge {A exit} if + N exit + } if + mode K eq { + numB 1 ge {B exit} if + numA 1 ge {A exit} if + numN 1 ge {N exit} if + K exit + } if + } loop + dup K eq fnc1first and {pop B} if % No kanji with fnc1first + dup mode eq { % Same mode encode directly + pop + /dat msg i mode K eq {2} {1} ifelse getinterval def + /seq [ + seq aload pop + [ exch aload pop dat aload pop ] + ] def + } { % Change mode + /mode exch def + mode K eq {K msg i numK 2 mul getinterval} if + mode B eq {B msg i numB getinterval} if + mode A eq {A msg i numA getinterval} if + mode N eq {N msg i numN getinterval} if + /dat exch def /sw exch def + /seq [ seq aload pop sw dat ] def + } ifelse + /i i dat length add def + } loop + + % Encode the sequence + { % common exit + seq -1 eq {exit} if % Sequence not available + /bits 23648 string def + /j 0 def + fnc1first {(0101) addtobits} if + /abort false def + 0 2 seq length 1 sub { + /i exch def + /mode seq i get def + mids ver get mode get addtobits + /cclen cclens ver get mode get def + /chars seq i 1 add get def + chars length 2 cclen exp cvi ge { % Too many characters for cc indicator + /abort true def exit + } if + chars length mode K eq {2 idiv} if cclen tobin addtobits + chars encfuncs mode get load exec addtobits + } for + abort {exit} if + /bits bits 0 j getinterval def + msgbits ver bits put + exit + } loop + } forall + + % Lookup the most appropriate symbol specification + /metrics [ + % format vers vergrp size align modules error codewords error correction blocks + % L M Q H L1 L2 M1 M2 Q1 Q2 H1 H2 + [ (micro) (M1) vM1 11 98 99 36 [ 2 99 99 99 ] [ 1 0 -1 -1 -1 -1 -1 -1 ] ] + [ (micro) (M2) vM2 13 98 99 80 [ 5 6 99 99 ] [ 1 0 1 0 -1 -1 -1 -1 ] ] + [ (micro) (M3) vM3 15 98 99 132 [ 6 8 99 99 ] [ 1 0 1 0 -1 -1 -1 -1 ] ] + [ (micro) (M4) vM4 17 98 99 192 [ 8 10 14 99 ] [ 1 0 1 0 1 0 -1 -1 ] ] + [ (full) (1) v1to9 21 98 99 208 [ 7 10 13 17 ] [ 1 0 1 0 1 0 1 0 ] ] + [ (full) (2) v1to9 25 18 99 359 [ 10 16 22 28 ] [ 1 0 1 0 1 0 1 0 ] ] + [ (full) (3) v1to9 29 22 99 567 [ 15 26 36 44 ] [ 1 0 1 0 2 0 2 0 ] ] + [ (full) (4) v1to9 33 26 99 807 [ 20 36 52 64 ] [ 1 0 2 0 2 0 4 0 ] ] + [ (full) (5) v1to9 37 30 99 1079 [ 26 48 72 88 ] [ 1 0 2 0 2 2 2 2 ] ] + [ (full) (6) v1to9 41 34 99 1383 [ 36 64 96 112 ] [ 2 0 4 0 4 0 4 0 ] ] + [ (full) (7) v1to9 45 22 38 1568 [ 40 72 108 130 ] [ 2 0 4 0 2 4 4 1 ] ] + [ (full) (8) v1to9 49 24 42 1936 [ 48 88 132 156 ] [ 2 0 2 2 4 2 4 2 ] ] + [ (full) (9) v1to9 53 26 46 2336 [ 60 110 160 192 ] [ 2 0 3 2 4 4 4 4 ] ] + [ (full) (10) v10to26 57 28 50 2768 [ 72 130 192 224 ] [ 2 2 4 1 6 2 6 2 ] ] + [ (full) (11) v10to26 61 30 54 3232 [ 80 150 224 264 ] [ 4 0 1 4 4 4 3 8 ] ] + [ (full) (12) v10to26 65 32 58 3728 [ 96 176 260 308 ] [ 2 2 6 2 4 6 7 4 ] ] + [ (full) (13) v10to26 69 34 62 4256 [ 104 198 288 352 ] [ 4 0 8 1 8 4 12 4 ] ] + [ (full) (14) v10to26 73 26 46 4651 [ 120 216 320 384 ] [ 3 1 4 5 11 5 11 5 ] ] + [ (full) (15) v10to26 77 26 48 5243 [ 132 240 360 432 ] [ 5 1 5 5 5 7 11 7 ] ] + [ (full) (16) v10to26 81 26 50 5867 [ 144 280 408 480 ] [ 5 1 7 3 15 2 3 13 ] ] + [ (full) (17) v10to26 85 30 54 6523 [ 168 308 448 532 ] [ 1 5 10 1 1 15 2 17 ] ] + [ (full) (18) v10to26 89 30 56 7211 [ 180 338 504 588 ] [ 5 1 9 4 17 1 2 19 ] ] + [ (full) (19) v10to26 93 30 58 7931 [ 196 364 546 650 ] [ 3 4 3 11 17 4 9 16 ] ] + [ (full) (20) v10to26 97 34 62 8683 [ 224 416 600 700 ] [ 3 5 3 13 15 5 15 10 ] ] + [ (full) (21) v10to26 101 28 50 9252 [ 224 442 644 750 ] [ 4 4 17 0 17 6 19 6 ] ] + [ (full) (22) v10to26 105 26 50 10068 [ 252 476 690 816 ] [ 2 7 17 0 7 16 34 0 ] ] + [ (full) (23) v10to26 109 30 54 10916 [ 270 504 750 900 ] [ 4 5 4 14 11 14 16 14 ] ] + [ (full) (24) v10to26 113 28 54 11796 [ 300 560 810 960 ] [ 6 4 6 14 11 16 30 2 ] ] + [ (full) (25) v10to26 117 32 58 12708 [ 312 588 870 1050 ] [ 8 4 8 13 7 22 22 13 ] ] + [ (full) (26) v10to26 121 30 58 13652 [ 336 644 952 1110 ] [ 10 2 19 4 28 6 33 4 ] ] + [ (full) (27) v27to40 125 34 62 14628 [ 360 700 1020 1200 ] [ 8 4 22 3 8 26 12 28 ] ] + [ (full) (28) v27to40 129 26 50 15371 [ 390 728 1050 1260 ] [ 3 10 3 23 4 31 11 31 ] ] + [ (full) (29) v27to40 133 30 54 16411 [ 420 784 1140 1350 ] [ 7 7 21 7 1 37 19 26 ] ] + [ (full) (30) v27to40 137 26 52 17483 [ 450 812 1200 1440 ] [ 5 10 19 10 15 25 23 25 ] ] + [ (full) (31) v27to40 141 30 56 18587 [ 480 868 1290 1530 ] [ 13 3 2 29 42 1 23 28 ] ] + [ (full) (32) v27to40 145 34 60 19723 [ 510 924 1350 1620 ] [ 17 0 10 23 10 35 19 35 ] ] + [ (full) (33) v27to40 149 30 58 20891 [ 540 980 1440 1710 ] [ 17 1 14 21 29 19 11 46 ] ] + [ (full) (34) v27to40 153 34 62 22091 [ 570 1036 1530 1800 ] [ 13 6 14 23 44 7 59 1 ] ] + [ (full) (35) v27to40 157 30 54 23008 [ 570 1064 1590 1890 ] [ 12 7 12 26 39 14 22 41 ] ] + [ (full) (36) v27to40 161 24 50 24272 [ 600 1120 1680 1980 ] [ 6 14 6 34 46 10 2 64 ] ] + [ (full) (37) v27to40 165 28 54 25568 [ 630 1204 1770 2100 ] [ 17 4 29 14 49 10 24 46 ] ] + [ (full) (38) v27to40 169 32 58 26896 [ 660 1260 1860 2220 ] [ 4 18 13 32 48 14 42 32 ] ] + [ (full) (39) v27to40 173 26 54 28256 [ 720 1316 1950 2310 ] [ 20 4 40 7 43 22 10 67 ] ] + [ (full) (40) v27to40 177 30 58 29648 [ 750 1372 2040 2430 ] [ 19 6 18 31 34 34 20 61 ] ] + ] def + /eclval (LMQH) eclevel search pop length exch pop exch pop def + 0 1 43 { + /i exch def + /m metrics i get def + /frmt m 0 get def % Format of the symbol + /vers m 1 get def % Version of symbol + /vergrp m 2 get def % Version group + /size m 3 get def % Length of side + /asp2 m 4 get def % Position of second alignment symbol + /asp3 m 5 get def % Position of third alignment symbol + /nmod m 6 get def % Number of modules + /ncws nmod 8 idiv def % Total number of codewords + /rbit nmod 8 mod def % Number of remainder bits + /lc4b false def % Last data codeword is 4 bits long + size 11 eq size 15 eq or { % Adjustments for M1 and M3 symbols + /ncws ncws 1 add def + /rbit 0 def + /lc4b true def + } if + /ecws m 7 get eclval get def % Number of error correction codewords + /dcws ncws ecws sub def % Number of data codewords + /dmod dcws 8 mul lc4b {4} {0} ifelse sub def % Number of data modules + /ecb1 m 8 get eclval 2 mul get def % First error correction blocks + /ecb2 m 8 get eclval 2 mul 1 add get def % Second error correction blocks + /okay true def + format (any) ne format frmt ne and {/okay false def} if % The format must match that supplied + frmt (micro) eq fnc1first and {/okay false def} if + version (unset) ne version vers ne and {/okay false def} if % The version must match that supplied + ecb1 -1 eq ecb2 -1 eq or {/okay false def} if % Error correction level must be valid + /verbits msgbits vergrp get def + verbits -1 eq { % Bitstream must be available + /okay false def + } { + verbits length dmod gt {/okay false def} if % and fit into data modules + } ifelse + /term (000000000) 0 termlens vergrp get getinterval def + okay {exit} if + } for + + okay not { + /bwipp.qrcodeNoValidSymbol (No valid symbol available) //raiseerror exec + } if + + /format frmt def + /version vers def + /msgbits verbits def + /dcpb dcws ecb1 ecb2 add idiv def % Base data codewords per block + /ecpb ncws ecb1 ecb2 add idiv dcpb sub def % Error correction codewords per block + + % Complete the message bits by adding the terminator, truncated if neccessary + /term term 0 dmod msgbits length sub term length 2 copy gt {exch} if pop getinterval def + msgbits length term length add string + dup 0 msgbits putinterval + dup msgbits length term putinterval + /msgbits exch def + + % Expand the message bits by adding padding as necessary + /pad dmod string def + 0 1 pad length 1 sub {pad exch 48 put} for + pad 0 msgbits putinterval + /padstrs [ (11101100) (00010001) ] def + /padnum 0 def + msgbits length 8 div ceiling 8 mul cvi 8 dmod lc4b {5} {1} ifelse sub { + pad exch padstrs padnum get putinterval + /padnum padnum 1 add 2 mod def + } for + + % Evaluate the padded message into codewords + /cws dcws array def + 0 1 cws length 1 sub { + /c exch def + /bpcw 8 def + lc4b c cws length 1 sub eq and {/bpcw 4 def} if + /cwb pad c 8 mul bpcw getinterval def + /cw 0 def + 0 1 bpcw 1 sub { + /i exch def + /cw cw 2 bpcw i sub 1 sub exp cvi cwb i get 48 sub mul add def + } for + cws c cw put + } for + + % Calculate the log and anti-log tables + /rsalog [ 1 255 { dup 2 mul dup 256 ge {285 xor} if } repeat ] def + /rslog 256 array def + 1 1 255 {dup rsalog exch get exch rslog 3 1 roll put} for + + % Function to calculate the product in the field + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add 255 mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate the coefficients for the Reed-Solomon algorithm + /coeffs [ 1 ecpb {0} repeat ] def + 0 1 ecpb 1 sub { + /i exch def + coeffs i 1 add coeffs i get put + i -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + + % Reed-Solomon algorithm to derive the error correction codewords + /rscodes { + /rscws exch def + /rsnd rscws length def + /rscws [ rscws {} forall ecpb {0} repeat ] def + 0 1 rsnd 1 sub { + /m exch def + /k rscws m get def + 0 1 ecpb 1 sub { + /j exch def + rscws m j add 1 add coeffs ecpb j sub 1 sub get k rsprod rscws m j add 1 add get xor put + } for + } for + rscws rsnd ecpb getinterval + } bind def + + % Divide codewords into two groups of blocks and calculate the error correction codewords + /dcwsb ecb1 ecb2 add array def + /ecwsb ecb1 ecb2 add array def + 0 1 ecb1 1 sub { % First group of blocks has smaller number of data codewords + /i exch def + dcwsb i cws i dcpb mul dcpb getinterval put + ecwsb i dcwsb i get rscodes put + } for + 0 1 ecb2 1 sub { % Second group of blocks has larger number of data codewords + /i exch def + dcwsb ecb1 i add cws ecb1 dcpb mul i dcpb 1 add mul add dcpb 1 add getinterval put + ecwsb ecb1 i add dcwsb ecb1 i add get rscodes put + } for + + % Reassemble the codewords + /cws ncws array def + /cw 0 def + 0 1 dcpb { % Interleave the data codeword blocks + /i exch def + 0 1 ecb1 ecb2 add 1 sub { + /j exch def + i dcwsb j get length lt { % Ignore the end of short blocks + cws cw dcwsb j get i get put + /cw cw 1 add def + } if + } for + } for + 0 1 ecpb 1 sub { % Interleave the error codeword blocks + /i exch def + 0 1 ecb1 ecb2 add 1 sub { + /j exch def + cws cw ecwsb j get i get put + /cw cw 1 add def + } for + } for + + % Extend codewords by one if there are remainder bits + rbit 0 gt { + /pad cws length 1 add array def + pad 0 cws putinterval + pad pad length 1 sub 0 put + /cws pad def + } if + + % Fixups for the short final data byte in M1 and M3 symbols + lc4b { + dcws 1 sub 1 ncws 2 sub { + /i exch def + cws i cws i get 15 and 4 bitshift put + cws i cws i 1 add get -4 bitshift 15 and cws i get or put + } for + cws ncws 1 sub cws ncws 1 sub get 15 and 4 bitshift put + } if + + % Create the bitmap + /pixs [ size size mul {-1} repeat ] def + /qmv {size mul add} bind def + + % Finder patterns + /fpat [ + [ 1 1 1 1 1 1 1 0 ] + [ 1 0 0 0 0 0 1 0 ] + [ 1 0 1 1 1 0 1 0 ] + [ 1 0 1 1 1 0 1 0 ] + [ 1 0 1 1 1 0 1 0 ] + [ 1 0 0 0 0 0 1 0 ] + [ 1 1 1 1 1 1 1 0 ] + [ 0 0 0 0 0 0 0 0 ] + ] def + 0 1 fpat length 1 sub { + /y exch def + 0 1 fpat 0 get length 1 sub { + /x exch def + /fpb fpat y get x get def + pixs x y qmv fpb put + format (full) eq { + pixs size x sub 1 sub y qmv fpb put + pixs x size y sub 1 sub qmv fpb put + } if + } for + } for + + % Alignment patterns + /algnpat [ + [ 1 1 1 1 1 ] + [ 1 0 0 0 1 ] + [ 1 0 1 0 1 ] + [ 1 0 0 0 1 ] + [ 1 1 1 1 1 ] + ] def + /putalgnpat { + /py exch def + /px exch def + 0 1 4 { + /pb exch def + 0 1 4 { + /pa exch def + pixs px pa add py pb add qmv algnpat pb get pa get put + } for + } for + } bind def + asp2 2 sub asp3 asp2 sub size 13 sub { + /i exch def + i 4 putalgnpat + 4 i putalgnpat + } for + asp2 2 sub asp3 asp2 sub size 9 sub { + /x exch def + asp2 2 sub asp3 asp2 sub size 9 sub { + /y exch def + x y putalgnpat + } for + } for + + % Timing patterns + format (full) eq { + 8 1 size 9 sub { + /i exch def + pixs i 6 qmv i 1 add 2 mod put + pixs 6 i qmv i 1 add 2 mod put + } for + } { + 8 1 size 1 sub { + /i exch def + pixs i 0 qmv i 1 add 2 mod put + pixs 0 i qmv i 1 add 2 mod put + } for + } ifelse + + % Format information modules + format (full) eq { + /formatmap [ + [ [ 0 8 ] [ 8 size 1 sub ] ] [ [ 1 8 ] [ 8 size 2 sub ] ] [ [ 2 8 ] [ 8 size 3 sub ] ] + [ [ 3 8 ] [ 8 size 4 sub ] ] [ [ 4 8 ] [ 8 size 5 sub ] ] [ [ 5 8 ] [ 8 size 6 sub ] ] + [ [ 7 8 ] [ 8 size 7 sub ] ] [ [ 8 8 ] [ size 8 sub 8 ] ] [ [ 8 7 ] [ size 7 sub 8 ] ] + [ [ 8 5 ] [ size 6 sub 8 ] ] [ [ 8 4 ] [ size 5 sub 8 ] ] [ [ 8 3 ] [ size 4 sub 8 ] ] + [ [ 8 2 ] [ size 3 sub 8 ] ] [ [ 8 1 ] [ size 2 sub 8 ] ] [ [ 8 0 ] [ size 1 sub 8 ] ] + ] def + } { + /formatmap [ + [ [ 1 8 ] ] [ [ 2 8 ] ] [ [ 3 8 ] ] [ [ 4 8 ] ] [ [ 5 8 ] ] + [ [ 6 8 ] ] [ [ 7 8 ] ] [ [ 8 8 ] ] [ [ 8 7 ] ] [ [ 8 6 ] ] + [ [ 8 5 ] ] [ [ 8 4 ] ] [ [ 8 3 ] ] [ [ 8 2 ] ] [ [ 8 1 ] ] + ] def + } ifelse + formatmap { + { {} forall qmv pixs exch 0 put } forall + } forall + + % Version information modules + size 45 ge { + /versionmap [ + [ [ size 9 sub 5 ] [ 5 size 9 sub ] ] [ [ size 10 sub 5 ] [ 5 size 10 sub ] ] + [ [ size 11 sub 5 ] [ 5 size 11 sub ] ] [ [ size 9 sub 4 ] [ 4 size 9 sub ] ] + [ [ size 10 sub 4 ] [ 4 size 10 sub ] ] [ [ size 11 sub 4 ] [ 4 size 11 sub ] ] + [ [ size 9 sub 3 ] [ 3 size 9 sub ] ] [ [ size 10 sub 3 ] [ 3 size 10 sub ] ] + [ [ size 11 sub 3 ] [ 3 size 11 sub ] ] [ [ size 9 sub 2 ] [ 2 size 9 sub ] ] + [ [ size 10 sub 2 ] [ 2 size 10 sub ] ] [ [ size 11 sub 2 ] [ 2 size 11 sub ] ] + [ [ size 9 sub 1 ] [ 1 size 9 sub ] ] [ [ size 10 sub 1 ] [ 1 size 10 sub ] ] + [ [ size 11 sub 1 ] [ 1 size 11 sub ] ] [ [ size 9 sub 0 ] [ 0 size 9 sub ] ] + [ [ size 10 sub 0 ] [ 0 size 10 sub ] ] [ [ size 11 sub 0 ] [ 0 size 11 sub ] ] + ] def + } { + /versionmap [] def + } ifelse + versionmap { + { {} forall qmv pixs exch 0 put } forall + } forall + + % Solitary dark module in full symbols + format (full) eq { + pixs 8 size 8 sub qmv 1 put + } if + + % Calculate the mask patterns + format (full) eq { + /maskfuncs [ + {add 2 mod} bind + {exch pop 2 mod} bind + {pop 3 mod} bind + {add 3 mod} bind + {2 idiv exch 3 idiv add 2 mod} bind + {mul dup 2 mod exch 3 mod add} bind + {mul dup 2 mod exch 3 mod add 2 mod} bind + {2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod} bind + ] def + } { + /maskfuncs [ + {exch pop 2 mod} bind + {2 idiv exch 3 idiv add 2 mod} bind + {mul dup 2 mod exch 3 mod add 2 mod} bind + {2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod} bind + ] def + } ifelse + /masks maskfuncs length array def + 0 1 masks length 1 sub { + /m exch def + /mask size size mul array def + 0 1 size 1 sub { + /j exch def + 0 1 size 1 sub { + /i exch def + i j maskfuncs m get exec 0 eq + pixs i j qmv get -1 eq and {1} {0} ifelse + mask i j qmv 3 -1 roll put + } for + } for + masks m mask put + } for + + % Walk the symbol placing the bitstream + /posx size 1 sub def + /posy size 1 sub def + /dir -1 def % -1 is upwards, 1 is downwards + /col 1 def % 0 is left bit, 1 is right bit + /num 0 def + { % loop + posx 0 lt {exit} if + pixs posx posy qmv get -1 eq { + cws num 8 idiv get 7 num 8 mod sub neg bitshift 1 and + pixs posx posy qmv 3 -1 roll put + /num num 1 add def + } if + col 1 eq { + /col 0 def + /posx posx 1 sub def + } { + /col 1 def + /posx posx 1 add def + /posy posy dir add def + posy 0 lt posy size ge or { % Turn around at top and bottom + /dir dir -1 mul def + /posy posy dir add def + /posx posx 2 sub def + % Hop over the timing pattern in full size symbols + format (full) eq posx 6 eq and {/posx posx 1 sub def} if + } if + } ifelse + } loop + + % Evaluate runlength encoded rows or columns in full symbols + /evalfulln1n3 { + /scrle exch def + % Detect runs of 5 or more like modules + /scr1 0 scrle { dup 5 ge {add 2 sub dup} if pop } forall def + % Detect 1:1:3:1:1 ratio next to 4 modules of whitespace + /scr3 0 def + 3 2 scrle length 3 sub { % Scan odd (dark) runs within bounds + /j exch def + scrle j get 3 mod 0 eq { % Multiple of 3 black modules + /fact scrle j get 3 idiv def + scrle j 2 sub 5 getinterval {fact eq} forall and exch pop and and { + j 3 eq j 4 add scrle length ge or { % At either extent of run + /scr3 scr3 40 add def + } { % Bounded by dark modules + scrle j 3 sub get 4 ge scrle j 3 add get 4 ge or { + /scr3 scr3 40 add def + } if + } ifelse + } if + } if + } for + scr1 scr3 + } bind def + + % Evaluation algorithm for full symbols + /evalfull { + /sym exch def + + /n1 0 def /n2 0 def /n3 0 def + /rle size 1 add array def + /lastpairs size array def + /thispairs size array def + /sizeadd1 size 1 add def + 0 1 size 1 sub { + /i exch def + + % Runlength encode (light, dark, light, ...) and evaluate each column + mark 0 0 + i size dup dup mul 1 sub { + sym exch get exch 1 index eq {exch 1 add exch} {1 exch} ifelse + } for + pop + rle 0 counttomark 2 sub getinterval astore + evalfulln1n3 n3 add /n3 exch def n1 add /n1 exch def + pop + + % Runlength encode (light, dark, light, ...) and evaluate each row + /symrow sym i size mul size getinterval def + mark 0 0 + symrow { + exch 1 index eq {exch 1 add exch} {1 exch} ifelse + } forall + pop + rle 0 counttomark 2 sub getinterval astore + evalfulln1n3 n3 add /n3 exch def n1 add /n1 exch def + pop + + % Count and score same coloured blocks + /lastpairs thispairs /thispairs lastpairs def def + symrow 0 get 1 eq {0} {1} ifelse + symrow {exch 1 index add exch} forall + pop + thispairs astore pop + i 0 gt { + mark + lastpairs aload pop thispairs aload pop + n2 size { exch sizeadd1 index add 3 and 0 eq {3 add} if } repeat + /n2 exch def + cleartomark + } if + + } for + + % Score dark/light imbalance + /dark 0 sym {add} forall def + /n4 dark 100 mul size dup mul div 50 sub abs 5 div cvi 10 mul def + + n1 n2 add n3 add n4 add + } bind def + + % Evaluation algorithm for micro symbols + /evalmicro { + /sym exch def + /dkrhs 0 def /dkbot 0 def + 1 1 size 1 sub { + /i exch def + /dkrhs dkrhs sym size 1 sub i qmv get add def + /dkbot dkbot sym i size 1 sub qmv get add def + } for + dkrhs dkbot le { + dkrhs 16 mul dkbot add neg + } { + dkbot 16 mul dkrhs add neg + } ifelse + } bind def + + % Evaluate the masked symbols to find the most suitable + /bestscore 999999999 def + 0 1 masks length 1 sub { + /m exch def + /masksym size size mul array def + 0 1 size size mul 1 sub { + /i exch def + masksym i pixs i get masks m get i get xor put + } for + format (full) eq { + masksym evalfull /score exch def + } { + masksym evalmicro /score exch def + } ifelse + score bestscore lt { + /bestsym masksym def + /bestmaskval m def + /bestscore score def + } if + } for + /pixs bestsym def + + % Add the format information + format (full) eq { + /fmtvals [ + 16#5412 16#5125 16#5e7c 16#5b4b 16#45f9 16#40ce 16#4f97 16#4aa0 + 16#77c4 16#72f3 16#7daa 16#789d 16#662f 16#6318 16#6c41 16#6976 + 16#1689 16#13be 16#1ce7 16#19d0 16#0762 16#0255 16#0d0c 16#083b + 16#355f 16#3068 16#3f31 16#3a06 16#24b4 16#2183 16#2eda 16#2bed + ] def + /ecid (MLHQ) eclevel search pop length exch pop exch pop def + /fmtval fmtvals ecid 3 bitshift bestmaskval add get def + } { + /fmtvals [ + 16#4445 16#4172 16#4e2b 16#4b1c 16#55ae 16#5099 16#5fc0 16#5af7 + 16#6793 16#62a4 16#6dfd 16#68ca 16#7678 16#734f 16#7c16 16#7921 + 16#06de 16#03e9 16#0cb0 16#0987 16#1735 16#1202 16#1d5b 16#186c + 16#2508 16#203f 16#2f66 16#2a51 16#34e3 16#31d4 16#3e8d 16#3bba + ] def + /symid [ [0] [1 2] [3 4] [5 6 7] ] size 11 sub 2 idiv get eclval get def + /fmtval fmtvals symid 2 bitshift bestmaskval add get def + } ifelse + 0 1 formatmap length 1 sub { + /i exch def + formatmap i get { + pixs exch {} forall qmv fmtval 14 i sub neg bitshift 1 and put + } forall + } for + + % Add the version information + size 45 ge { + /vervals [ + 16#07c94 16#085bc 16#09a99 16#0a4d3 16#0bbf6 16#0c762 16#0d847 + 16#0e60d 16#0f928 16#10b78 16#1145d 16#12a17 16#13532 16#149a6 + 16#15683 16#168c9 16#177ec 16#18ec4 16#191e1 16#1afab 16#1b08e + 16#1cc1a 16#1d33f 16#1ed75 16#1f250 16#209d5 16#216fd 16#228ba + 16#2379f 16#24b0b 16#2542e 16#26a64 16#27541 16#28c69 + ] def + /verval vervals size 17 sub 4 idiv 7 sub get def + 0 1 versionmap length 1 sub { + /i exch def + versionmap i get { + pixs exch {} forall qmv verval 17 i sub neg bitshift 1 and put + } forall + } for + } if + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx size + /pixy size + /height size 2 mul 72 div + /width size 2 mul 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/qrcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER qrcode-- +% --BEGIN ENCODER microqrcode-- +% --REQUIRES preamble raiseerror renmatrix qrcode-- +% --DESC: Micro QR Code +% --EXAM: 1234 +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp microqrcode 0.0 2015050900 60576 60353 +%%BeginData: 43 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /qrcode dup /uk.co.terryburton.bwipp findresource put +begin +/microqrcode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Get the result of encoding with qrcode with format=micro + options (dontdraw) true put + options (format) (micro) put + + /args barcode options //qrcode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/microqrcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER microqrcode-- + % --BEGIN ENCODER maxicode-- % --REQUIRES preamble raiseerror renmaximatrix-- % --DESC: MaxiCode % --EXAM: [)>^03001^02996152382802^029840^029001^0291Z00004951^029UPSN^02906X610^029159^0291234567^0291/1^029^029Y^029634 ALPHA DR^029PITTSBURGH^029PA^029^004 % --EXOP: mode=2 parse % --RNDR: renmaximatrix -%%BeginResource: uk.co.terryburton.bwipp maxicode 0.0 0 0 0 -%%BeginData: 157 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\!A A2N5 *@^bF cn_? !/L `?9TgrDF(^ Y"C5;nRWKKH -.G`k%L@Yb,LWJCY >5*AT fH]g@ *F(^Y "C6 CcDH'2WOOo [4NP!5$b04J -@1@rGmh+Dl14L]D 1Q9Th2p 5^eeqI ?J/iP #O) OF(ZV)@<,j rA7^o[05YcC -Ch7K,D0'?Q@ZiNaDe*F8!g5]`De*F8"-Pg1EdMYEB8?PD#Ehc@#?rW@*\];hP!+.FAnbcuD0'? -G!/LrE9Th1bD0'>4D0'?G$#O`rCh7L?$'M9N9Th2[HS8uFA<$YQ1OYEdD0'?M!?I>_P'&Es@rG -mhP!5$bP')cc*KlDFFY@67De*FB5*@^bFcHJCP)YWI06:WAA7^ofOu&8D05YcCP!5$bD0'?Q@V -0=bP%'RTP,4=$L]D%$AOcC1G1G1G1G<]X15PF_1G<] -X1PkL_1G<6O@<-3nE-!.++BsX2NWEOB!5Op*@3!CDeI@YO -m"L&g4h!aQpQNWDM-!Fpia_hJ0OL]^p*>E/_PNWE[F!5sTljG3qE+Bsj,7?.C[L&f2I!9K"?>p -*@3!Ci(MAqg<*L&g@l#$i?UNWDY1!G@,ea+aTWL^.3.>E/_TNWEgJ!6Blpk_KLM+Bsj,8WEgcL -&f>M!9o:G>p*@3!D8@QC5)`2L&gLp$=+cYNWDe5!GdDibD$#_L^RK2>E/_XNWEsN!6g/tm"c'U -+Bsj,9o]6kL&fJQ!:>RO>p*@3!D\XUDMA/:L&gXt%UC2]NWDq9!H3\mc\;GgL_!c6>E/_\NWF* -R!76H#n;%W]+Bsj,;2tZsL&fVU!:bjW>p*@3!E+pYEeXSBL&ge#&mZVaNWE(=!HWtqdtRkoL_F -&:>E/_`NWF6V!7Z`'oS=2e+Bsj,p*@3!EP3]G(p"JL&gq'(0r%eNWE4A!I -'7uf7j;"L_j>>>E/_dNWFBZ!8*#+pkTbm+Bsj,=cNN.L&fn]!;VEg>p*@3!EtKaHA2FRL&h(+) -I4Ii+D#%s+D#%s+D#%s+D#%s+D#%s+C-*oL`D3jL`D3jE+*9">p*@-*Jb_l*Jb_T@:UKd+BsXC -L`V?nL`V?k>p*>oDK?qp*>oE+*9"E+*:3!8N; -/r.lA!+Bsj,,)u\PL&g%a!<%]p>p*@3!@*U*IYIjZL&h4/+'g!nNWCD]Itds\L&h7.!2!O>>E/ -_1NWD4r!31bRTnWQ?>p*@3!@Eg-4GEj;L&e0,!2E/_3NWD:t!3q7YX+gVL>p*@-.#nb5DB0EL&eH4!2WsD>E/_6NWE@=!4@O]["\RX>p*@3!@rt2L&ec=!4R[_V -d1ELNWC\k!F:E[\qU3pL&e2Y+Bsj,/WKjKSBJfL&dWI+Bsj,23%\\L&cp^!0D -p8RU%%?NWD%u!ITV%L5#\jL&d]K+Bsj,2fN:_L&d!`!0W':S6[7ANWD+\@5?E@3BAp+DbI/>p*>oF(-85@?(@2NWC8_!?bYj>9Ius+ -EM$8ChmN'F(6>6@j#&">9Iut+EM'9F(?D0CLeQ/A0>/#>9Iuu+EM*:F(HJ8AKYf)AKY8$>9I`k -+DbI/CgnN'@N]Jr+C-*qOu"b$BOPq)@;L!->DPP-22FM\22FM\22FM\22FM\2-lA$L]E53@q]: -kD..C)P%'4JP,Wd]Bp(ZC1G<BOPq)@;L!-C6D5Q5&$1)I?I-LP"76IATV?'@q]:kG% -#3.L]ET2Ou"b4ATVB(@q]:kG%#3.L]NZ3Ou"b4ATVE)@q]:kG%#3.L]W`4Ou"b4ATVH*@q]:kG - %#3.L]`f5Ou"b4ATVK+@q]:kG%#3.L]il6Ou"b/F(K>6>9Id(B5D-sL]NY>H\_ZMP(R&'1Mq2 -GCh7L?!KsF6BnueQ!Kp -*3!KmJHG^XpVF(K>6BnubPG^Y`TI?I,SDKBB/+Du73EJOU3F(]<#DN[\V1G<]fAS,Y$Bl8!'FF -/fDH\_`d)3R1H@Zj?1P!FGYI=%,BI?ITYP%Be?P')pOP')29% -[&V$ASu")P!5%%Dfp/b5&-6EP'AWp+DQ]5Oo^_%I?G)'1G$KCgeGrF(KH -VA7]Xg04T'7FH-KFATV@D1OYEcP!FGY<-rM(AT8i,P"UT;P"L(H]hKZP":B5OpR9ZL^/_:P)"htH]iN"P(R[qFHSh&P! -5%S052PCL^B4FOu"b++DQ]:Oo^_%P!FGY<%h`p@<+(FD0'>4Bp),P1G<6O@<++GBnueQ!GumjC -h7LIAp\B9B-:oE!KmJH97;/CSUHZ$Ou"b$BOPp;+DHW5Oo]E@B5D-sP%K&XF(ZV0L]W_?P"U4M -Ln/sWOu&7dI?IQ>F(KHR"ES- -r@?NcpATVB(@q]:k0p5q-"FG3$FCHA&BOPp:P$iWQ@N]`'FC?;'DIY>0F(KHR"ES-r@ZiNqHZN -X=F(KH%+D#G#+Cf(nE\S\XATVB(ASu!2Bcq,G!KmJH1OYEdP!FGY<+Bu\FH-KFATVCE4`b1V@3 -B&n@<+)c@$1Y>05r%TATV?'D0'>4Bnun/F(]<#DBNYVWJCV=)3RgCP!4;W<0DBe9Q5#`AncL(D -KBB2Ou%'5!KoTmF($24ATVB(ASu!#@q]:k0d(OKFC?;'DIY>6+DHW4Oo^_%I?IQKL]W`&HZNUN -+EM+9@N]6"@j#8p@<+(FF(KH%+D#G#+Cf(nE\\bYATV?'ASu!2Bcq,G!g3SI1OYEcE/4UZ4aV6 -Y1E^aMFCHA(DIXf!BOPp9+EM+9@3B-!@j#8p@<++GF(KH%+D#G#+Cf(nE\ehZATV?'ASu!2Bcq -,G"-N\J1OYEcE/4X[8pbA_+EM+9@N]6"@kV>5ATWq8F(KH%Ou%NL<0BLpP#QL6FC?;%BOPp9P$ -iWQ@3B'$ATX)GASu!2@rl4'NWaE7FCC=gP!FGY<-)Vm@N]/o@<+)c@!c^!+CfJ(FHU0GDIY>0F -(KHR"ES-r@ZiO15^eepF(KH'+Cf(nE\W_bHS9GOFEifKF(KH'Ou"b4GT_';Ou"b-CNpt6+DHW4Oo^_%I?IQKL]W`&HZOES@rl4'P%8-A@j#8p@<+(FF(KH6+DHW5Oo^_%I?IQKL]`f'HZOES@rl4'P%8-A@j#8p -@<+(FF(KHC6D8R1G<]UA9MBt+CfJ(FHU0R@:YNoOu -"b4@;T^$>9I471NQuAM#WWTHS9GKD/"e-OpR:-F(&p"L]DL-FC?;2@:YNoP'D%VD/"e,F(&pA$ -Be;C!KsF<#a0"F@;Uf-P%odRP,XTFP'DD<<%hg#@r6:"+Bot0@;T_A!g7\;DI[O)B9E=ZF^:.d -D/WrrL]W`&D/WrrL]`f'P&bn&D.I+9">DM`0SfjpV32^Z3,NSEAWeU#!f-uBV33Nq30Ia,"Hks -3WKKH.H'0s:@q/u.$8=.f0JG170JG2:$Bh6K)3Qsh@rGmhOt;CjL^K$2+9Tj[B@r7# -O@q/u(!f.&D9Tj[B@r7#I@q/u(#`&PF9Tj[B@r7#[F(8[8!/LiB9Tj[B@r7#UF(8[8#)EDF9Tj -ZSE,oY8>DN98!/LW2!/LW2!/LW2!/LW2!*taDL]E53Lc]r:Bp(ZC1G<]g+DHW9P#@H!04f*Y!f -."oL^'#WP,W#;E0;bn@r3?&P"UTbP,XU\Ou%&tBcqA9+E2@8+E2Cb94`(*!Kq\UP"76IARcieL -fA_?@:XOiCjhJ!?'7!bARgMrASu!pF(^Y]I?IQHDe*F8"HkobDe*F8"d2$3Ec#`*AV^PR4d'i& -De*F8s,oO.EdMYAA7^SsP!+.FD/Wrr+D#G#D0'?Q@YdaA@=*e6I=$bQI?ITn1OYEc04T3I+Bot -*De*F8"d2#qLe`AFLgGLmDN<95C8PQL]W`UOu -S7_P"L(W6^#96P#QjmK3aWr062,MDeFkkOpR:-L]N;4Ld-6L3-'(KCiD< -5fH\_ZMP(R&'1Pc$e!JUT8HS9)r5*@]T@s9&"+Cf>#ATr'5A9/l-P"UT4L^'$=Ot_6=0TrD`P" -ArB1Mq&@F,1$7P&,pY@s=)FP,XTF@s=)]I?I,SD/Ws%@;m>nL&ohZ!YL.f*ej\XL&kM5!Et3ZT -nWWAL'#,E!ksBjLP>l+L&i6J!?-[n3JIPoL&l=L!b-lcC5)b9L&lUT!L\ZCR"bXNL'#2G!l0Nl -089O&L&t&'!c*Mkb(]s%L&um[!kj?%rAbL&oAM!To+<"bm']L&on\!S2u+EJ=L5L&m?i!KMm8XbHkXL&rZU![NL%6\YY/L&te!P!jc0no``L&t/*!`"IOD2&+.L&rTS![<@#6&#G+L&t_:!a^T^Dh\:1L&m9g! -K;a6X+gYTL&iNR!@!7!6&#D*L&kY9!FCK^MhV:jL'"?/!iUhTa+aZ8L]N;3L`_EoLcpPVL]`G7 -L`qQsLd-\ZL]rS;La.^"Ld?h^L^/_?La@j&LdQtbL^AkCLaS!*Ldd+fL^T"GLae-.Le!7jL^f. -KLb"92Le3CnL_#:OLb4E6LeEOrL_5FSLbFQ:LeW\!L_GRWLbX]>Leih%L_Y^[LbjiBLf&t)L_k -j_Lc'uFLf9+-L`)!cLc:,JLfK71L`;-gLcL8NLf]C5LinMqL&dEl!0W':Z%`7_Li\AmL&d?j!0 -Dp8YD*%[LiJ5iL&d9h!02d6XbHhWLi8)eL&d3f!/uX4X+gVSLi%raL&d-d!/cL2WJ1DOLhhf]L -&d'b!/Q@0VhP2KLhVZYL&d!`!/?4.V1nuGLhDNUL&cp^!/-(,UP8cCLh2BQL&cj\!.oq*TnWQ? -Lgu6ML&cdZ!.]e(T8!?;Lgc*ILjt50L&dd!!1\jPLgGmcLjXpWRt^p3Lg>gALjOr(L&dWr!18R -HLg#U[Lj4XSQ\GL+L&eW9!47I\dtRkNL&gau!:Y^C[tXmkL&fbY!7Z`'o7d89L&ec=!4[a`f7j -:VL&gn$!;)!G]7p+IL&f&E!5OM!6BlpkCs!!L&hI4!L&gIm!9f.<#DN6`L&fJQ!6g/t -l\5E)L&hU8!=4D[c\;GFL&gUq!:5F@$\eZhL&i`X!@W['7tq%6L&kk?!G$oc-\_XKL&j_t!CVY -C@tk"nL&iTT!@3C#6\YV.L&k_;!FUW_'nu`'L&j)b!A]B1;2,*JL&hsB!>:+f0no]_L&k))!D\ -@M&V^;tL&ir^!A9*-9ni[BL&hg>!=jhb/VX9WL&jr%!D8(IBncY%L&m'a!JZ=0V1o#HL&l(E!G -[>iM1u%eL&n3,!N(SPD2&(-L&m3e!K)U4WJ1GPL&ldY!Ifb(SV@08L&no@!P4!dJVF2UL&mp$! -M5#H]nQR#L&lp]!J6%,TnWT@L&o&D!PX9hh1bscL&q1+!W%NP)2820L&p%`!SW8/q1\qFL&r0G -!Z$LkfnKO[L&q%'!VV6L'nuc(L&o>L!QKipjb??%rDcL&s/c!]#K3;2,-KL&u:J!cE_o222/hL&t;.!`FaSEJ=O6L&s;g!]Gc7!t9ncdtRqPL'$n"!q:pH%u(/rL'#n[!n;r+o7d> -;L'&$B!t^1gf7j@XL'%%&!q_3L'8?T%L'$%_!n`5/pP&bCL'&0F!u-IkgP,d`L'%1*!r.KP(PW -#-L'$1c!o/M3qh>1KL'&\,DH:EL'$Uo!pG@@# -DND<5`L')^U"*fP -&4,*huL'(S5"'C9[GD63CL''Gj"#u#;=,$fXL')RQ"*B8"2hhDmL'(G1"&t!WF+sd;L'';f"#P -`7;hbBPL')FM")rts1PPueL'(;-"&O^SDh\@3L''/b"#,H3:PJsHL'):I")N\o089Q]L'(/)"& -+FOCPDq+L''#^""]0/983O@L').E")*Dk.u"-UL'(#%"%\.KB8-M#L'*-a",)C2UP8lFL',8H" -2KWnLP>ncL'+9,"/LYR_hJ91L'*9e",M[6VhP;NL',DL"2oorMhV=kL'+E0"/pqVa+a]9L'*Ei -",qs:X+g_VL',PP"3?3!O+masL'+Q4"0@4ZbD$,AL'*Qm"-A6>YD*.^L',\T"3cK%PD01&L'+] -8"0dL^c\;PIL'*]q"-eNBZ\ARfL',hX"42c)Q\GU.L'+i<"13dbdtRtQL'*iu".4fF[tY!nL', -t\"4W&-Rt_$6L'+u@"1X'ff7jCYL'+!$".Y)J]7pF!L'-+`"5&>1T8!H>L',,D"2'?jgP,gaLc -U>pLffIVL&dKn!0i3FllL&icY!D/"H8;7.WL&m!_!JH1.U4r]bL&o)E! -T&P3rIt@NL&r9J!]bu:3/.K8L&uLP!d'.uP(j%CL'"T6!mZN%m=k]/L'%d;""As,.#%gnL')"A -"([,gJqaB$L'+*'"29Klh1c$e?'6usE+sQ9I -m!G]SZ@C6D8;I?I0X*/GVi!>pOl)28/NL&oDN!U,7=oS*D[L'!s$!ka6hV1o&h?'7!+4>1_dDD -*Y`ASu?nG\M#'FE 2)?05 tWMF! ,F9G] PN VE- *4@E-, f4DK?pa -4s4BSDKKE0@<[lR 0/% ?WDJ` g,Bl. :# EbT c]< 0B7i -Oq*X205Y-BBk)'l AWf$9 A1 r(@/n 8fPF Cf K5H "(o:F Dl% L@WuO *E$/ -\&Anc-oEb0<1F`L u'P') pJ0 6:] HE+* 6l Bl7 RH\pKT _F (KH4@: O(e -DJ+B\;u~> -% uk.co.terryburton.bwipp/maxicode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp maxicode 0.0 2015050900 116961 123452 +%%BeginData: 564 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmaximatrix dup /uk.co.terryburton.bwipp findresource put +begin +/maxicode { + + 20 dict begin + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /mode -1 def + /sam -1 def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /mode mode cvi def + /sam sam cvi def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /msg barcode def + /msglen msg length def + + % Special message handling for modes 2 and 3 + mode 2 eq mode 3 eq or { + + % Normalise messages that begin with a field identifier [)>RS01GSyy + msg 0 7 getinterval <5b293e1e30311d> eq { + /fid msg 0 9 getinterval def + /msg msg 9 msglen 9 sub getinterval def + } { + /fid () def + } ifelse + + % Read the postcode, country code and service code fields seperated by GS + msg <1d> search pop /pcode exch def + pop <1d> search pop /ccode exch def + pop <1d> search pop /scode exch def + pop /msg exch def + + % Prepend the field identifier + msg length fid length add string dup + 0 fid putinterval dup + fid length msg putinterval + /msg exch def + /msglen msg length def + + } if + + % Special function characters + /eci -1 def /pad -2 def /ns -3 def + /la -4 def /lb -5 def + /sa -6 def /sb -7 def /sc -8 def /sd -9 def /se -10 def + /sa2 -11 def /sa3 -12 def + /lkc -13 def /lkd -14 def /lke -15 def + /pd2 -16 def /pd3 -17 def + + % Character maps for each state + /charmaps [ + % A B C D E + [ 13 (`) 192 224 0 ] % 0 + [ (A) (a) 193 225 1 ] % 1 + [ (B) (b) 194 226 2 ] % 2 + [ (C) (c) 195 227 3 ] % 3 + [ (D) (d) 196 228 4 ] % 4 + [ (E) (e) 197 229 5 ] % 5 + [ (F) (f) 198 230 6 ] % 6 + [ (G) (g) 199 231 7 ] % 7 + [ (H) (h) 200 232 8 ] % 8 + [ (I) (i) 201 233 9 ] % 9 + [ (J) (j) 202 234 10 ] % 10 + [ (K) (k) 203 235 11 ] % 11 + [ (L) (l) 204 236 12 ] % 12 + [ (M) (m) 205 237 13 ] % 13 + [ (N) (n) 206 238 14 ] % 14 + [ (O) (o) 207 239 15 ] % 15 + [ (P) (p) 208 240 16 ] % 16 + [ (Q) (q) 209 241 17 ] % 17 + [ (R) (r) 210 242 18 ] % 18 + [ (S) (s) 211 243 19 ] % 19 + [ (T) (t) 212 244 20 ] % 20 + [ (U) (u) 213 245 21 ] % 21 + [ (V) (v) 214 246 22 ] % 22 + [ (W) (w) 215 247 23 ] % 23 + [ (X) (x) 216 248 24 ] % 24 + [ (Y) (y) 217 249 25 ] % 25 + [ (Z) (z) 218 250 26 ] % 26 + [ eci eci eci eci eci ] % 27 + [ 28 28 28 28 pad ] % 28 + [ 29 29 29 29 pad ] % 29 + [ 30 30 30 30 27 ] % 30 + [ ns ns ns ns ns ] % 31 + [ ( ) ({) 219 251 28 ] % 32 + [ pad pad 220 252 29 ] % 33 + [ (") (}) 221 253 30 ] % 34 + [ (#) (~) 222 254 31 ] % 35 + [ ($) 127 223 255 159 ] % 36 + [ (%) (;) 170 161 160 ] % 37 + [ (&) (<) 172 168 162 ] % 38 + [ (') (=) 177 171 163 ] % 39 + [ 40 (>) 178 175 164 ] % 40 + [ 41 (?) 179 176 165 ] % 41 + [ (*) ([) 181 180 166 ] % 42 + [ (+) 92 185 183 167 ] % 43 + [ (,) (]) 186 184 169 ] % 44 + [ (-) (^) 188 187 173 ] % 45 + [ (.) (_) 189 191 174 ] % 46 + [ (/) ( ) 190 138 182 ] % 47 + [ (0) (,) 128 139 149 ] % 48 + [ (1) (.) 129 140 150 ] % 49 + [ (2) (/) 130 141 151 ] % 50 + [ (3) (:) 131 142 152 ] % 51 + [ (4) (@) 132 143 153 ] % 52 + [ (5) (!) 133 144 154 ] % 53 + [ (6) (|) 134 145 155 ] % 54 + [ (7) pd2 135 146 156 ] % 55 + [ (8) sa2 136 147 157 ] % 56 + [ (9) sa3 137 148 158 ] % 57 + [ (:) pd3 la la la ] % 58 + [ sb sa ( ) ( ) ( ) ] % 59 + [ sc sc lkc sc sc ] % 60 + [ sd sd sd lkd sd ] % 61 + [ se se se se lke ] % 62 + [ lb la lb lb lb ] % 63 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 64 dict 64 dict 64 dict 64 dict 64 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 4 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + /seta charvals 0 get def + /setb charvals 1 get def + /setc charvals 2 get def + /setd charvals 3 get def + /sete charvals 4 get def + + % Compute numeric runlengths + /nseq [ msglen 1 add {0} repeat ] def + msglen 1 sub -1 0 { + /i exch def + msg i get dup 48 ge exch 57 le and { + nseq i nseq i 1 add get 1 add put + } { + nseq i 0 put + } ifelse + } for + /nseq nseq 0 msglen getinterval def + + % Encode the message from ASCII to codewords + /prefixinset { + 0 { + 2 copy exch length ge {exit} if + 2 copy get 3 index exch known {1 add} {exit} ifelse + } loop + exch pop exch pop + } bind def + + /enc { + exch get out exch j exch put + /j j 1 add def + } bind def + + /out 144 array def + /i 0 def /j 0 def /cset (seta) def + { % loop + % Exit when no characters remain latching back to A if necessary + i msglen eq { + cset (seta) ne cset (setb) ne and { + la cset load enc + /cset (seta) def + } if + exit + } if + { % not a loop but common exit point + + % If 9 numerals available then use NS + nseq i get 9 ge { + msg i 9 getinterval cvi 4 { dup 63 and exch -6 bitshift } repeat cset load ns get + 0 2 10 {index} for 6 array astore 7 1 roll 6 {pop} repeat + out exch j exch putinterval + /i i 9 add def + /j j 6 add def + exit + } if + + % Read next three characters + /char1 msg i get def + /char2 i 1 add msglen lt {msg i 1 add get} {-99} ifelse def + /char3 i 2 add msglen lt {msg i 2 add get} {-99} ifelse def + + % If current mode is sufficient then directly encode + cset load char1 known { + char1 cset load enc + /i i 1 add def + exit + } if + + % For switching from A to B + cset (seta) eq setb char1 known and { + setb char2 known { + lb seta enc + /cset (setb) def + } { + sb seta enc + char1 setb enc + /i i 1 add def + } ifelse + exit + } if + + % For switching from B to A encode according to length of prefix + cset (setb) eq seta char1 known and { + /p seta msg i 4 msglen i sub 2 copy gt {exch} if pop getinterval prefixinset def + p 1 eq { + sa setb enc + char1 seta enc + /i i 1 add def + } if + p 2 eq { + sa2 setb enc + char1 seta enc + char2 seta enc + /i i 2 add def + } if + p 3 eq { + sa3 setb enc + char1 seta enc + char2 seta enc + char3 seta enc + /i i 3 add def + } if + p 4 ge { + la setb enc + /cset (seta) def + } if + exit + } if + + % If character is in A or B then directly latch + seta char1 known { + la cset load enc + /cset (seta) def + exit + } if + setb char1 known { + lb cset load enc + /cset (setb) def + exit + } if + + % Determine which one of sets C, D or E the character is in + setc char1 known {/setx (setc) def /sx sc def /lkx lkc def} if + setd char1 known {/setx (setd) def /sx sd def /lkx lkd def} if + sete char1 known {/setx (sete) def /sx se def /lkx lke def} if + + % Encode according to the length of the prefix + /p setx load msg i 4 msglen i sub 2 copy gt {exch} if pop getinterval prefixinset def + p 1 eq { + sx cset load enc + char1 setx load enc + /i i 1 add def + } if + p 2 eq { + sx cset load enc + char1 setx load enc + sx cset load enc + char2 setx load enc + /i i 2 add def + } if + p 3 eq { + sx cset load enc + char1 setx load enc + sx cset load enc + char2 setx load enc + sx cset load enc + char3 setx load enc + /i i 3 add def + } if + p 4 ge { + sx cset load enc + lkx setx load enc + /cset setx def + } if + + exit + } loop % out + } loop + /encmsg out 0 j getinterval def + /padval cset load pad get def + + % Prefix the encoded message with the structured append insert + /sami [] def + sam -1 ne { + /sami 2 array def + sami 0 seta pad get put + sami 1 sam 10 idiv 1 sub 8 mul sam 10 mod 1 sub add put + } if + /encmsg [ sami aload pop encmsg aload pop ] def + + % Derive the primary and secondary codewords for modes 2 and 3 + mode 2 eq mode 3 eq or { + + % Calculate the fixed-width binary values for the mode, postcode, country code and service + /mdb (0000) 4 string copy dup mode cvi 2 4 string cvrs dup length 4 exch sub exch putinterval def + /ccb (0000000000) 10 string copy dup ccode cvi 2 10 string cvrs dup length 10 exch sub exch putinterval def + /scb (0000000000) 10 string copy dup scode cvi 2 10 string cvrs dup length 10 exch sub exch putinterval def + /pcb (000000000000000000000000000000000000) 36 string copy def + mode 2 eq { + % For numeric postcode, first six bits represent length and remaining 30 bits the value + pcb pcode length 2 6 string cvrs dup length 6 exch sub exch putinterval + pcb pcode cvi 2 30 string cvrs dup length 36 exch sub exch putinterval + } { % mode=3 + % For alphanumeric postcode, trim or pad with spaces to 6 chars and encode to binary + /pccw [ + ( ) 6 string copy dup 0 pcode length 6 gt {pcode 0 6 getinterval} {pcode} ifelse putinterval + {seta exch get} forall + ] def + 0 1 5 { + /i exch def + pcb pccw i get 2 6 string cvrs dup length 6 i mul 6 add exch sub exch putinterval + } for + } ifelse + + % Convolute the binary values into the structured carrier message + /scm 60 string def + scm 2 mdb putinterval + scm 38 pcb 0 4 getinterval putinterval + scm 30 pcb 4 6 getinterval putinterval + scm 24 pcb 10 6 getinterval putinterval + scm 18 pcb 16 6 getinterval putinterval + scm 12 pcb 22 6 getinterval putinterval + scm 6 pcb 28 6 getinterval putinterval + scm 0 pcb 34 2 getinterval putinterval + scm 52 ccb 0 2 getinterval putinterval + scm 42 ccb 2 6 getinterval putinterval + scm 36 ccb 8 2 getinterval putinterval + scm 54 scb 0 6 getinterval putinterval + scm 48 scb 6 4 getinterval putinterval + + % Evaluate the structured carrier message as codewords + /pri [ 0 0 0 0 0 0 0 0 0 0 ] def + 0 1 59 { + /i exch def + /ps i 6 idiv def + /ep 2 5 i 6 mod sub exp cvi scm i get 48 sub mul def + pri ps pri ps get ep add put + } for + + % Pad the encoded message into the secondary component + /sec [ 84 {padval} repeat ] def + sec 0 encmsg putinterval + + } if + + % Derive the primary and secondary codewords for modes 4, 5 and 6 + mode 4 eq mode 5 eq or mode 6 eq or mode -1 eq or { + + % If mode isn't specified then use EEC if message fits, otherwise SEC + mode -1 eq { + /mode encmsg length 77 le {5} {4} ifelse def + } if + + % First symbol is the mode and the remainder are the padded message + /cws [ mode 5 eq {78} {94} ifelse {padval} repeat ] def + cws 0 mode put + cws 1 encmsg putinterval + + % Fit the message into the primary and secondary components + /pri cws 0 10 getinterval def + /sec cws 10 cws length 10 sub getinterval def + + } if + + % Calculate the log and anti-log tables + /rsalog [ 1 63 { dup 2 mul dup 64 ge {67 xor} if } repeat ] def + /rslog 64 array def + 1 1 63 {dup rsalog exch get exch rslog 3 1 roll put} for + + % Function to calculate the product in the field + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add 63 mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate error correction codewords + /rscodes { + + /rsnum exch def + /cwb exch def + + % Generate the coefficients + /coeffs [ 1 rsnum {0} repeat ] def + 1 1 rsnum { + /i exch def + coeffs i coeffs i 1 sub get put + i 1 sub -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + + % Calculate the error correction codewords + /ecb [ rsnum {0} repeat ] def + 0 1 cwb length 1 sub { + /t exch cwb exch get ecb 0 get xor def + ecb length 1 sub -1 0 { + /i exch def + /p ecb length i sub 1 sub def + ecb p t coeffs i get rsprod put + i 0 gt { ecb p ecb p 1 add get ecb p get xor put } if + } for + } for + + ecb + + } bind def + + % Split secondary codeword into odd and even elements + /seco [ 0 2 sec length 1 sub { sec exch get } for ] def + /sece [ 1 2 sec length 1 sub { sec exch get } for ] def + + % Calculate the parity codewords for secondary codeword parts based on mode + /scodes sec length 84 eq {20} {28} ifelse def % SEC/EEC mode + /secochk seco scodes rscodes def + /secechk sece scodes rscodes def + + % Recompose the secondary parity codewords + /secchk [ 0 1 scodes 1 sub { dup secochk exch get exch secechk exch get } for ] def + + % Concatinate the data into final codewords + /codewords [ + pri aload pop + pri 10 rscodes aload pop + sec aload pop + secchk aload pop + ] def + + % Convert the codewords into module bits + /mods [ 864 {0} repeat ] def + 0 1 143 { + /i exch def + /cw [ codewords i get 2 6 string cvrs {48 sub} forall ] def + mods 6 i mul 6 cw length sub add cw putinterval + } for + + % Maps modules to pixels in the grid + /modmap [ + 469 529 286 316 347 346 673 672 703 702 647 676 283 282 313 312 370 610 618 379 + 378 409 408 439 705 704 559 589 588 619 458 518 640 701 675 674 285 284 315 314 + 310 340 531 289 288 319 349 348 456 486 517 516 471 470 369 368 399 398 429 428 + 549 548 579 578 609 608 649 648 679 678 709 708 639 638 669 668 699 698 279 278 + 309 308 339 338 381 380 411 410 441 440 561 560 591 590 621 620 547 546 577 576 + 607 606 367 366 397 396 427 426 291 290 321 320 351 350 651 650 681 680 711 710 + 1 0 31 30 61 60 3 2 33 32 63 62 5 4 35 34 65 64 7 6 + 37 36 67 66 9 8 39 38 69 68 11 10 41 40 71 70 13 12 43 42 + 73 72 15 14 45 44 75 74 17 16 47 46 77 76 19 18 49 48 79 78 + 21 20 51 50 81 80 23 22 53 52 83 82 25 24 55 54 85 84 27 26 + 57 56 87 86 117 116 147 146 177 176 115 114 145 144 175 174 113 112 143 142 + 173 172 111 110 141 140 171 170 109 108 139 138 169 168 107 106 137 136 167 166 + 105 104 135 134 165 164 103 102 133 132 163 162 101 100 131 130 161 160 99 98 + 129 128 159 158 97 96 127 126 157 156 95 94 125 124 155 154 93 92 123 122 + 153 152 91 90 121 120 151 150 181 180 211 210 241 240 183 182 213 212 243 242 + 185 184 215 214 245 244 187 186 217 216 247 246 189 188 219 218 249 248 191 190 + 221 220 251 250 193 192 223 222 253 252 195 194 225 224 255 254 197 196 227 226 + 257 256 199 198 229 228 259 258 201 200 231 230 261 260 203 202 233 232 263 262 + 205 204 235 234 265 264 207 206 237 236 267 266 297 296 327 326 357 356 295 294 + 325 324 355 354 293 292 323 322 353 352 277 276 307 306 337 336 275 274 305 304 + 335 334 273 272 303 302 333 332 271 270 301 300 331 330 361 360 391 390 421 420 + 363 362 393 392 423 422 365 364 395 394 425 424 383 382 413 412 443 442 385 384 + 415 414 445 444 387 386 417 416 447 446 477 476 507 506 537 536 475 474 505 504 + 535 534 473 472 503 502 533 532 455 454 485 484 515 514 453 452 483 482 513 512 + 451 450 481 480 511 510 541 540 571 570 601 600 543 542 573 572 603 602 545 544 + 575 574 605 604 563 562 593 592 623 622 565 564 595 594 625 624 567 566 597 596 + 627 626 657 656 687 686 717 716 655 654 685 684 715 714 653 652 683 682 713 712 + 637 636 667 666 697 696 635 634 665 664 695 694 633 632 663 662 693 692 631 630 + 661 660 691 690 721 720 751 750 781 780 723 722 753 752 783 782 725 724 755 754 + 785 784 727 726 757 756 787 786 729 728 759 758 789 788 731 730 761 760 791 790 + 733 732 763 762 793 792 735 734 765 764 795 794 737 736 767 766 797 796 739 738 + 769 768 799 798 741 740 771 770 801 800 743 742 773 772 803 802 745 744 775 774 + 805 804 747 746 777 776 807 806 837 836 867 866 897 896 835 834 865 864 895 894 + 833 832 863 862 893 892 831 830 861 860 891 890 829 828 859 858 889 888 827 826 + 857 856 887 886 825 824 855 854 885 884 823 822 853 852 883 882 821 820 851 850 + 881 880 819 818 849 848 879 878 817 816 847 846 877 876 815 814 845 844 875 874 + 813 812 843 842 873 872 811 810 841 840 871 870 901 900 931 930 961 960 903 902 + 933 932 963 962 905 904 935 934 965 964 907 906 937 936 967 966 909 908 939 938 + 969 968 911 910 941 940 971 970 913 912 943 942 973 972 915 914 945 944 975 974 + 917 916 947 946 977 976 919 918 949 948 979 978 921 920 951 950 981 980 923 922 + 953 952 983 982 925 924 955 954 985 984 927 926 957 956 987 986 58 89 88 118 + 149 148 178 209 208 238 269 268 298 329 328 358 389 388 418 449 448 478 509 508 + 538 569 568 598 629 628 658 689 688 718 749 748 778 809 808 838 869 868 898 929 + 928 958 989 988 + ] def + + % Lookup pixels for enabled modules from modmap + /pixs 864 array def + /j 0 def + 0 1 mods length 1 sub { + /i exch def + mods i get 1 eq { + pixs j modmap i get put + /j j 1 add def + } if + } for + /pixs [ pixs 0 j getinterval {} forall 28 29 280 281 311 457 488 500 530 670 700 677 707 ] def + + % Return the arguments + << + /ren //renmaximatrix + /pixs pixs + /opt options + >> + + dontdraw not //renmaximatrix if + + end + +} bind def +/maxicode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER maxicode-- @@ -5979,219 +17197,1321 @@ DJ+B\;u~> % --EXAM: This is Aztec Code % --EXOP: format=full % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp azteccode 0.0 0 0 0 -%%BeginData: 117 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%52X=FD5Z2F- 8_M1G <3G Eas # uAW f6? 1G< 9WDKKE 0@ K FD5 Z2F*j(NAmo LsAWf3'P!FG -Y<0B5(@ZmRN0oc8 tP)XR( F_- _ !H]f tD5* C&O 5*@^MH]ft& EckrV1OYEdI -?J0)*g/N:DfBf4D f0WZ5* @^M P#Q@ =FD5 Z2F *j'+I?I/TC ghU#EcW@>@< -lF)F-8);1G<05?Y6Ou&8 DOuS6tL]`f6 -Ot:HkB9GGnL]N[L]`f(P"^:NOuR<"B9GGnP!5%SP%&0h!AA2N5*@]T@UX: -eDe*E%D0'?G!,@ZjOu&7dI?ITYP%B')<%i*0B4>RsF,g6`1M1QGD..OH"EJX&AWgnN@<[k;HS9 -5WB4>RsF!+q#Eas#uAWeitP#Q%3Ec#6,NWaBFDInuJEaa0TE0:?N04J@1Ch7K,@UX:eDe*FB@Z -iNV@<-0qDMTBt@=+"<0JG170SfmqV32^Z3+?<:Ch7L?!f.#CV33Nq30Ia,"d2'4WKKH.GqWZ;P -!5$bI=$tc0JG170JG170JG170JG17L_,`GOr9EB@UX:nAT!;GP,X6=L_,`GOt`%YP%'4YP!5&. -P!5%S04SLT5*@^MP#X/F@r,^o+CeoE@ZiN#D0'?!BlnEP"_2%YAT!Y3@UX:nAT!;0P&-9^P,4< -tD0'?!BlnEP!0.4;0ekC;P'LncB4>RsF,1!0A!2+n!/LYb@<-0qDMS=VWI$:4P!5$bNX.qP&-9^L]`J5P)#3GI?I-LP#O)OATVs,@ribs+Bsj/Ecl82L]E52L]E58>p*@3#@h[hE -+*6uL]N;4L_5FI>p*@3"D2dmCkr+J!JhJH#$i?UNX''4D/`onFGL!S!/N%Z#$i?UNW`s:Ci"n/ -L]N;cL^%-->E/quDf'H%@s!M/L]E5eL^79/>E/huF_klM",Hu64GX8K+Bsj2@rH4'@:OD8"Gd& -69S`s[+Bsj/Ap%p+L]iM7LffH=>p*@3"D2dmCkr7N!JkuV#[JQWNW`s:Ci"n3L]N51S;7GV+Bs -j/Ap%p+L^/_:L&f/J#[JQWNW`s:Ci"n5L]N51n;%?U+Bsj/Ap%p+L^AkL&jDm$=+cYNW`s:Ci"n9L]N52CkrF(+Bsj/Ap%p+L^f.@L -&ms'$=+cYNW`s:Ci"n;L]N52eqaZ=+Bsj/Ap%p+L_#:BL&qpB$=+cYNW`s:Ci"n=L]N539Sa$] -+Bsj/Ap%p+L_5FDL'!+C1-d0564B -Ou%G$K05kW7Gp$^-Cia0N1OYEcCghU#Ec[':P&5#DH"D#;+Dkq? -Eft:&"FDe?CLMK2AmoLsAWeitP#Q:>B4>RsF-:!AE+=*T2NeW7/8fTIA7KhH:jXj6CLMK2AmoL -sAWeitP#Q@8@Ou%NLAM7k.H"D#;+Dkq?Efr43AoD^,@<G@D\)G -@H_EL]N[$KEcZ&8B9GHA99MJZF)5c-P!5%%Oo]TEB4cr#P,XUZEcYZ* -DeG4sP"U4MP')q1L]DjdP"TR5@rGpjAof)8F)GJ1C6GQP!KsFF96,) -mEc5KO_30%kP":"a89/c]GB8Q?EcY`7F-:!g!KsFF9RW'6Ou$]gEc#6,NW`s:Ci#7tHS95SA7Z -m"@9Id -$A7^Jqn<*p1r/qS-De*F8&!@'$Ou"b.De*E%D/WrrL]rSGL_FfM@rGmhF-8>-P#Q%3Ec#6,NWa -BFDIntoHS95SA7Zlm@<,jrA7^oTOu"b.De*E%>9Id$A7^Jqn<*p1r/qS-De*F8&!@'$Ou"b.De -*E%D/WrrL]rSGL_FfM@rGmhF-8=4D/Wrr+Bot*De*F+L^K<]I?I0-Ou%NL<%i*,A7]4aFE8RAD -e*FB@Yb/MCm(WX1Pc$e!GuacAR]@qF-:!g!KsF/D/Wrr@VKq*P!4m,0Tp^0P":B/L]M@2A7^p5 -L]N[9I2o>9I2o>9I2o>9I2o>9I2o>9I2o>DPP#6X:g=+C-*oL&h:/!A.S">9I -2o>D<7\L'.fg+Boso+BsR3!/;&!>p*F91G<6^F!+t:F!,@1GB4m:GB8pVP,WJCE+*cqD0$h/E+ -=*T97))M8TJl^De*F#Ou$]gEc#6,NW`s:Ci#7tHS8opeBlnEZ5)oXtP'MJ=8;I8%!H)CkF,0j[WI$: -4P!5$bA79Rg@VKq*+CfV:+DI!3L]V%)@s=*4Ot`%YP%%m>@s=)"P,Vo0@s9&0P&-9^A79Rg@VK -q*P%&<=GB4m9E+=*TCm(c\!KoX0H$tiH04SjBHQ[BDH=`7UP,W;4Aj<,?)ZEejaZ4aUdbL]W`;Ci"B;L]W`UOo]B.Blo.4P%p-\Cj0T(L]N[ -4GDH<`;J^/pEejd[Cm"g8@VKq?!g7;]!Kq>1D0C>j<,?)ZEejg\4aUdbL] -N[)[Bk3#$P#@):P,W8,Blo.4P#?+?Bk3BAP,XU^@ -r6C;P#Qjm%[&V[DfT]'FH-K9F_klW4aShoGDHZj1OXU'Ap9%;Ou%NLVF-8_M1N7&QF!,:-H"D"=E,Te?Ci+>9J!$H=\4?BmO?RCjV!;I?K4gOu%moL_+WAH=_m6P#?W -[Bp(ZC1Pc$e!HVt$AV^AMWI$:5P!5$bDK'<7F!,O!Jgf?C0d!JDK'<7F!,OOo^@?P%n9cH#@S8G]P!A+EM7CAV^DN;Nbp4Oo]'0Fs(!3F(or3L]W`;C6AU3Oo^@>Oo^@?P - %n9cH#@S8G]P!AP&>>TH=_m6P#@H\C6AU-D0@%++EM7CAV^DN;JM?qBp&LQ!KmJ>!g7;(P'MJ -=8:?Xl05?:COu%moL]MC4Bm=]^@Yb&JWI$:4P!5$bDK'<7F!,1[98NS14aV'cBm=\ABcqA/G]P -!BP"Us_05;VEL]NY>Ou%NL<.0p#05tWMF!,@>Bm=]^1OYEc04oDNAp9%4P#@H!Ap9DUL]M+3HS -9)r5*@^6GEQj"!G6P&05?Y6Ou%&kG]P!A+DN$/D0@%9OoT6[!0U0*Bp&IEHYS]DI?ITd!KmJ>! -g7;]G^Y`GI?I-*+Bot#GDH9_!Kq>4GDH9*+Bot#GDH9_!Kq>4GDH9_!Jgb^+Bot#GEQiUGDH9_ -!Jgb^+Bot#GDH9_!G6P3!KmJ>!F6gP+D,hR!KmIqGDH9*+Bot#GDH9_!G6P=DMS=!+Bot#G9CL -AL]NY>L]C^'>9IO%L]NY>Ap9%3Oo^_`L]C^'>9IO%+D,hR!KmJHDMS9u+Bot#GEQiUGDH9_!Kq ->V!*p^O+D,hR!KmJHDJ"*K!KmJHDMS9u+Bot#GDH9_!Kq>4GEQj"!*p^QHQ[9AG]T$3H[V&KL] -`G6P)!OaG*5%PG^Y`HAoD^,@<@M4Ap%p+P!+.FD/WrrD..B+>9I.+qhPJ_+Bs["L^.3.>DW66# -@/HVM#N28>p*@-s+gnc+BsX&L^.3.>DN?:#@/HVL]`G<>p*@-"Gd:g+BsX*L^.3.>DNN?"^N6T -L^/_=>p*@-#D`If+BsX,L]Uj)>DNN?!F6gPL^/b9>p*@-#Di@b+BsX,M#CU%>DNN?r*:FLL^/b -5>p*@-"c2t[+BsX)M"t=!>DNB;q->+IL]WD.>p*@-!JpPW+Bs[%M"t=!>DW97q->+IM#E/*>p* -@-r.t/S+Bs[!M"t=!>DW*2qct=KM"ul)>p*@-q2"uT+BsZtM#L[&>DW*2s'6aOM"ui->p*@-q1 -o)X+BsZtL]^p*>DW*2"C3-SM"ui1>p*F91OXU'D/WrrD..B+>9I.+rJ1V_+Bs[$L]q',>DW<8" -^N6TL]E57>p*@-!Jgnb+BsX'L]q',>DNB;"^N6TL]rS:>p*@-"c*4c+BsX*L]Ld(>DNH=!*p^O -L]rV7>p*@-"c3.`+BsX*M#CU%>DNB;qct=KL]WD0>p*@-!JpVY+BsX%M#1I#>DW<8qct=KM#N5 -->p*@-rJ:>V+Bs[!M#CU%>DW04r`pXNM#3#.>p*@-qhP5X+Bs[!L]Ld(>DW04!aQpQM#2u1>p* -F91OYEdL]E53D/WrrD..CH@Yb&JWI$:4P!5$bE+sQ<+Dl%-ASkjp+DI!3H[V&K@r6B3D/Wrr@V -Kq*+DI!3LbP!kP'DD<83B!fEb0,A061WAD..O,Bm;:MBm=\AE+sQ<05tWMGT_'AH=\aKBm=nGF -(or305+p2B4uB0F(or3L]W`ULe*[e06_,@FD)eD_?-CEcQG7F`MS -BDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/azteccode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp azteccode 0.0 2015050900 163082 186690 +%%BeginData: 679 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/azteccode { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /format (unset) def % full, compact or rune + /readerinit false def + /layers -1 def + /eclevel 23 def + /ecaddchars 3 def + /raw false def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /layers layers cvi def + /eclevel eclevel cvr def + /ecaddchars ecaddchars cvi def + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + % Convert from input into message bitstream + /msgbits () def + format (rune) ne raw and {/msgbits barcode def} if + format (rune) ne raw not and { + + % State key: "U"pper, "L"ower, "M"ixed, "P"unctuation, "D"igit, "B"inary + /U 0 def /L 1 def /M 2 def /P 3 def /D 4 def /B 5 def + + % Special function characters + /lu -1 def /ll -2 def /lm -3 def + /lp -4 def /ld -5 def /su -6 def + /sp -7 def /sb -8 def /fl -9 def + /p2 -10 def /p3 -11 def /p4 -12 def /p5 -13 def + + % Character maps for each state + /charmaps [ + % U L M P D + [ sp sp sp fl sp ] % 0 + [ 32 32 32 13 32 ] % 1 + [ (A) (a) 1 p2 (0) ] % 2 p2 = CR LF + [ (B) (b) 2 p3 (1) ] % 3 p3 = ". " + [ (C) (c) 3 p4 (2) ] % 4 p4 = ", " + [ (D) (d) 4 p5 (3) ] % 5 p5 = ": " + [ (E) (e) 5 (!) (4) ] % 6 + [ (F) (f) 6 (") (5) ] % 7 + [ (G) (g) 7 (#) (6) ] % 8 + [ (H) (h) 8 ($) (7) ] % 9 + [ (I) (i) 9 (%) (8) ] % 10 + [ (J) (j) 10 (&) (9) ] % 11 + [ (K) (k) 11 (') (,) ] % 12 + [ (L) (l) 12 40 (.) ] % 13 + [ (M) (m) 13 41 lu ] % 14 + [ (N) (n) 27 (*) su ] % 15 + [ (O) (o) 28 (+) -99 ] % 16 + [ (P) (p) 29 (,) -99 ] % 17 + [ (Q) (q) 30 (-) -99 ] % 18 + [ (R) (r) 31 (.) -99 ] % 19 + [ (S) (s) (@) (/) -99 ] % 20 + [ (T) (t) 92 (:) -99 ] % 21 + [ (U) (u) (^) (;) -99 ] % 22 + [ (V) (v) (_) (<) -99 ] % 23 + [ (W) (w) (`) (=) -99 ] % 24 + [ (X) (x) (|) (>) -99 ] % 25 + [ (Y) (y) (~) (?) -99 ] % 26 + [ (Z) (z) 127 ([) -99 ] % 27 + [ ll su ll (]) -99 ] % 28 + [ lm lm lu ({) -99 ] % 29 + [ ld ld lp (}) -99 ] % 30 + [ sb sb sb lu -99 ] % 31 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 32 dict 32 dict 32 dict 32 dict 16 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 4 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + + % Punctuation compression + /pcomp << + <0d0a> p2 % CR LF + (. ) p3 + (, ) p4 + (: ) p5 + >> def + + /e 10000 def % "Empty" + + /latlen [ % Bit length of latch between states + % To: U L M P D B From + [ 0 5 5 10 5 10 ] % U + [ 9 0 5 10 5 10 ] % L + [ 5 5 0 5 10 10 ] % M + [ 5 10 10 0 10 15 ] % P + [ 4 9 9 14 0 14 ] % D + [ 0 0 0 0 0 0 ] % B + ] def + + /latseq [ % Latch sequences between states + % To: U L M P D B From + [ [] [ll] [lm] [lm lp] [ld] [sb] ] % U + [ [ld lu] [] [lm] [lm lp] [ld] [sb] ] % L + [ [lu] [ll] [] [lp] [lu ld] [sb] ] % M + [ [lu] [lu ll] [lu lm] [] [lu ld] [lu sb] ] % P + [ [lu] [lu ll] [lu lm] [lu lm lp] [] [lu sb] ] % D + [ [lu] [ll] [lm] [] [] [] ] % B + ] def + + /shftlen [ % Bit length of shift to state + % To: U L M P D From + [ e e e 5 e ] % U + [ 5 e e 5 e ] % L + [ e e e 5 e ] % M + [ e e e e e ] % P + [ 4 e e 4 e ] % D + ] def + + % U L M P D B + /charsize [ 5 5 5 5 4 8 ] def + + % U L M P D B + /curlen [ 0 e e e e e ] def + /curseq [ [] [] [] [] [] [] ] def + + /backto U def % U + /lastchar () def + + % Derive the optimal sequences ending in each state + barcode { + + /char exch def + + % Check for optimisations in the current sequences by latching from x to y + { % loop + /imp false def + [ U L M P D B ] { + /x exch def + [ U L M P D B ] { + /y exch def + x B ne y backto eq or { % Only B -> backto + /cost curlen x get latlen x get y get add def + cost curlen y get lt { + curlen y cost put + curseq y [ + curseq x get aload pop + latseq x get y get aload pop + ] put + y B eq { % Set backto to previous state + /backto x P eq x D eq or {U} {x} ifelse def + } if + /imp true def + } if + } if + } forall + } forall + imp not {exit} if % Repeat unless no improvement + } loop + + % Determine optimal next sequences for each valid encoding + /nxtlen [ e e e e e e ] def + /nxtseq 6 array def + + [ U L M P D B ] { + /x exch def + + { % loop for common exit + + % Skip states that cannot encode character + x B ne {charvals x get char known not {exit} if} if + + % Extend directly + /cost curlen x get charsize x get add def + cost nxtlen x get lt { + nxtlen x cost put + nxtseq x [ curseq x get aload pop char ] put + } if + + % Optimise for direct shifts from y to x + x B eq {exit} if % B is treated as a latch + [ U L M P D ] { + /y exch def + x y ne { + /cost curlen y get shftlen y get x get add charsize x get add def + cost nxtlen y get lt { + nxtlen y cost put + nxtseq y [ + curseq y get aload pop + x U eq {su} {sp} ifelse + char + ] put + } if + } if + } forall + + exit + } loop + + } forall + + % Optimise using P compression + lastchar () ne { + /pchars 2 string dup 0 lastchar put dup 1 char put def + pcomp pchars known { + curlen P get nxtlen P get lt { + nxtlen P curlen P get put + nxtseq P [ curseq P get aload pop pop pcomp pchars get ] put + } if + } if + } if + + % Account for binary extension for 32 or more bytes + /numbytes 0 def + nxtseq B get { + sb eq {0} {numbytes 1 add} ifelse /numbytes exch def + } forall + numbytes 32 eq {nxtlen B nxtlen B get 11 add put} if + + /curlen nxtlen def + /curseq nxtseq def + /lastchar char def + + } forall + + % Select the optimal sequence + /minseq e def + [ U L M P D B ] { + /i exch def + curlen i get minseq lt { + /minseq curlen i get def + /seq curseq i get def + } if + } forall + + % Encoding functions + /tobin { + string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } bind def + /encu {charvals U get exch get 5 tobin} bind def + /encl {charvals L get exch get 5 tobin} bind def + /encm {charvals M get exch get 5 tobin} bind def + /encp {charvals P get exch get 5 tobin} bind def + /encd {charvals D get exch get 4 tobin} bind def + /encfuncs [ /encu /encl /encm /encp /encd ] def + /addtomsgbits { + /v exch def + msgbits j v putinterval + /j j v length add def + } bind def + + % Encode the sequence + /state U def + /msgbits minseq string def + /i 0 def /j 0 def { + i seq length ge {exit} if + + state B ne { + + /char seq i get def + + % Encode character + char encfuncs state get load exec addtomsgbits + /i i 1 add def + + % Encode shifted next character + char su eq char sp eq or { + seq i get char su eq {encu} {encp} ifelse addtomsgbits + /i i 1 add def + } if + + % Latches to new state + char lu eq {/state U def} if + char ll eq {/state L def} if + char lm eq {/state M def} if + char lp eq {/state P def} if + char ld eq {/state D def} if + char sb eq {/state B def} if + + } { % Binary + + % Find number of bytes before latch or end + /numbytes 0 def { + i numbytes add seq length ge {exit} if + seq i numbytes add get 0 lt {exit} if + /numbytes numbytes 1 add def + } loop + + % Encode length + numbytes 31 le { + numbytes 5 tobin addtomsgbits + } { + 0 5 tobin addtomsgbits + numbytes 31 sub 11 tobin addtomsgbits + } ifelse + + % Encode bytes + numbytes { + seq i get 8 tobin addtomsgbits + /i i 1 add def + } repeat + + % Return to previous state as indicated + i seq length lt { + /char seq i get def + /i i 1 add def + char lu eq {/state U def} if + char ll eq {/state L def} if + char lm eq {/state M def} if + } if + + } ifelse + + } loop + + } if + + % Lookup the most appropriate symbol specification + /metrics [ + [ (rune) 0 0 0 6 ] % Special metric for rune symbols + [ (compact) 1 1 17 6 ] [ (full) 1 1 21 6 ] [ (compact) 2 0 40 6 ] + [ (full) 2 1 48 6 ] [ (compact) 3 0 51 8 ] [ (full) 3 1 60 8 ] + [ (compact) 4 0 76 8 ] [ (full) 4 1 88 8 ] [ (full) 5 1 120 8 ] + [ (full) 6 1 156 8 ] [ (full) 7 1 196 8 ] [ (full) 8 1 240 8 ] + [ (full) 9 1 230 10 ] [ (full) 10 1 272 10 ] [ (full) 11 1 316 10 ] + [ (full) 12 1 364 10 ] [ (full) 13 1 416 10 ] [ (full) 14 1 470 10 ] + [ (full) 15 1 528 10 ] [ (full) 16 1 588 10 ] [ (full) 17 1 652 10 ] + [ (full) 18 1 720 10 ] [ (full) 19 1 790 10 ] [ (full) 20 1 864 10 ] + [ (full) 21 1 940 10 ] [ (full) 22 1 1020 10 ] [ (full) 23 0 920 12 ] + [ (full) 24 0 992 12 ] [ (full) 25 0 1066 12 ] [ (full) 26 0 1144 12 ] + [ (full) 27 0 1224 12 ] [ (full) 28 0 1306 12 ] [ (full) 29 0 1392 12 ] + [ (full) 30 0 1480 12 ] [ (full) 31 0 1570 12 ] [ (full) 32 0 1664 12 ] + ] def + + /i 0 def + { % loop + /m metrics i get def + /frmt m 0 get def % Format of the symbol + /mlyr m 1 get def % Data layers + /icap m 2 get def % Reader initialisation capable + /ncws m 3 get def % Total of codewords + /bpcw m 4 get def % Bits per codeword + /numecw ncws eclevel mul 100 div ecaddchars add ceiling cvi def + msgbits length 0 eq {/numecw 0 def} if % Error correction codewords + /numdcw ncws numecw sub def % Data codewords + /okay true def + format (unset) ne format frmt ne and {/okay false def} if + readerinit icap 1 ne and {/okay false def} if + layers -1 ne layers mlyr ne and {/okay false def} if + msgbits length bpcw div ceiling cvi numdcw gt {/okay false def} if + okay {exit} if + /i i 1 add def + } loop + /layers mlyr def + /format frmt def + + % Expand message bits into codewords avoiding codewords with all zeros or all ones + /allzero {dup length (000000000000) 0 3 -1 roll getinterval eq} bind def + /allones {dup length (111111111111) 0 3 -1 roll getinterval eq} bind def + /cws ncws array def + /m 0 def /c 0 def + { + msgbits length m le {exit} if + msgbits length m sub bpcw ge { + /cwb msgbits m bpcw 1 sub getinterval def % All but last bit + /cwf msgbits m bpcw add 1 sub 1 getinterval def % Last bit + cwb allzero {/cwf (1) def /m m 1 sub def} if % Flip last bit to avoid zeros + cwb allones {/cwf (0) def /m m 1 sub def} if % Flip last bit to avoid ones + % Concatinate the bits + 12 string dup 0 cwb putinterval + dup bpcw 1 sub cwf putinterval + 0 bpcw getinterval + /cwb exch def + } { % Final codeword + /cwb msgbits m msgbits length m sub getinterval def + /cwb (111111111111) 12 string copy dup 0 cwb putinterval 0 bpcw getinterval def + cwb allones {cwb cwb length 1 sub (0) putinterval} if % Prevent all ones + } ifelse + % Conversion of binary data into byte array + /cw 0 def + 0 1 bpcw 1 sub { + /i exch def + /cw cw 2 bpcw i sub 1 sub exp cvi cwb i get 48 sub mul add def + } for + cws c cw put + /m m bpcw add def + /c c 1 add def + } loop + /cws cws 0 c getinterval def + + % Reed-Solomon algorithm + /rscodes { + + /rspm exch def + /rsgf exch def + /rsnc exch def + /rscws exch def + + % Calculate the log and anti-log tables + /rsalog [ 1 rsgf 1 sub { dup 2 mul dup rsgf ge {rspm xor} if } repeat ] def + /rslog rsgf array def + 1 1 rsgf 1 sub {dup rsalog exch get exch rslog 3 1 roll put} for + + % Function to calculate the product in the field + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add rsgf 1 sub mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate the coefficients + /coeffs [ 1 rsnc {0} repeat ] def + 1 1 rsnc { + /i exch def + coeffs i coeffs i 1 sub get put + i 1 sub -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + + % Extend the input with the error correction values + /nd rscws length def + /rscws [ rscws {} forall rsnc {0} repeat 0 ] def + 0 1 nd 1 sub { + /k exch rscws exch get rscws nd get xor def + 0 1 rsnc 1 sub { + /j exch def + rscws nd j add rscws nd j add 1 add get k coeffs rsnc j sub 1 sub get rsprod xor put + } for + } for + + % Return all but the last codeword + rscws 0 rscws length 1 sub getinterval + + } bind def + + % Create the codewords and bit string for the mode + format (full) eq { + /mode layers 1 sub 11 bitshift cws length 1 sub add def + readerinit {/mode mode 2#0000010000000000 or def} if + /mode [ + mode 2#1111000000000000 and -12 bitshift + mode 2#0000111100000000 and -8 bitshift + mode 2#0000000011110000 and -4 bitshift + mode 2#0000000000001111 and + ] def + /mode mode 6 16 19 rscodes def + } if + format (compact) eq { + /mode layers 1 sub 6 bitshift cws length 1 sub add def + readerinit {/mode mode 2#00100000 or def} if + /mode [ + mode 2#11110000 and -4 bitshift + mode 2#00001111 and + ] def + /mode mode 5 16 19 rscodes def + } if + format (rune) eq { + /mode barcode cvi def + /mode [ + mode 2#11110000 and -4 bitshift + mode 2#00001111 and + ] def + /mode mode 5 16 19 rscodes def + /mode [mode {2#1010 xor} forall] def % Invert alternate bits + } if + /modebits mode length 4 mul string def + 0 1 modebits length 1 sub {modebits exch (0) putinterval} for + 0 1 mode length 1 sub { + /i exch def + modebits mode i get 2 4 string cvrs dup length 4 exch sub 4 i mul add exch putinterval + } for + + % Extend the data codewords with error correction codewords to create the bit string for the data + /rsparams [ + [] [] [] [] [] [] + [ 64 67 ] % 6-bit codewords + [] + [ 256 301 ] % 8-bit codewords + [] + [ 1024 1033 ] % 10-bit codewords + [] + [ 4096 4201 ] % 12-bit codewords + ] def + /cws cws ncws cws length sub rsparams bpcw get {} forall rscodes def + format (full) eq { + /databits layers layers mul 16 mul layers 112 mul add string def + } { + /databits layers layers mul 16 mul layers 88 mul add string def + } ifelse + 0 1 databits length 1 sub {databits exch (0) putinterval} for + 0 1 ncws 1 sub { + /i exch def + databits cws i get 2 bpcw string cvrs + dup length bpcw exch sub bpcw i mul add databits length ncws bpcw mul sub add + exch putinterval + } for + + % Move to a point in the cartesian plane centered on the bullseye + /cmv {size mul sub mid add} bind def + + % Move to a bit position within a layer + /lmv { + /lbit exch def + /llyr exch def + /lwid fw llyr 4 mul add def + /ldir lbit 2 idiv lwid idiv def + ldir 0 eq { % Top + lwid 1 sub 2 idiv neg 1 add lbit 2 idiv lwid mod add + fw 1 sub 2 idiv llyr 2 mul add lbit 2 mod add + cmv + } if + ldir 1 eq { % Right + fw 2 idiv llyr 2 mul add lbit 2 mod add + lwid 1 sub 2 idiv 1 sub lbit 2 idiv lwid mod sub + cmv + } if + ldir 2 eq { % Bottom + lwid 2 idiv neg 1 add lbit 2 idiv lwid mod add neg + fw 2 idiv llyr 2 mul add lbit 2 mod add neg + cmv + } if + ldir 3 eq { % Left + fw 1 sub 2 idiv llyr 2 mul add lbit 2 mod add neg + lwid 2 idiv 1 sub lbit 2 idiv lwid mod sub neg + cmv + } if + } bind def + + % Create the pixel map + % For full symbols we disregard the reference grid at this stage + format (full) eq {/fw 12 def} {/fw 9 def} ifelse + /size fw layers 4 mul add 2 add def + /pixs [size size mul {-1} repeat] def + /mid size 1 sub 2 idiv size mul size 1 sub 2 idiv add def + + % Data layers + /i 0 def + 1 1 layers { + /layer exch def + 0 1 fw layer 4 mul add 8 mul 1 sub { + /pos exch def + pixs layer pos lmv databits databits length i sub 1 sub get 48 sub put + /i i 1 add def + } for + } for + + % For full symbols expand the pixel map by inserting the reference grid + format (full) eq { + /fw 13 def + /size fw layers 4 mul add 2 add layers 10.5 add 7.5 div 1 sub cvi 2 mul add def + /mid size size mul 2 idiv def + /npixs [size size mul {-2} repeat] def + 0 16 size 2 idiv { + /i exch def + 0 1 size 1 sub { + /j exch def + npixs size 2 idiv neg j add i cmv [size 2 idiv j add i add 1 add 2 mod] putinterval + npixs size 2 idiv neg j add i neg cmv [size 2 idiv j add i add 1 add 2 mod] putinterval + npixs i size 2 idiv neg j add cmv [size 2 idiv j add i add 1 add 2 mod] putinterval + npixs i neg size 2 idiv neg j add cmv [size 2 idiv j add i add 1 add 2 mod] putinterval + } for + } for + /j 0 def + 0 1 npixs length 1 sub { + /i exch def + npixs i get -2 eq { + npixs i pixs j get put + /j j 1 add def + } if + } for + /pixs npixs def + } if + + % Finder pattern + /fw fw 2 idiv def + fw neg 1 fw { + /i exch def + fw neg 1 fw { + /j exch def + pixs i j cmv + i abs j abs gt {i abs} {j abs} ifelse 1 add 2 mod + put + } for + } for + + % Orientation bits + [ [ fw 1 add neg fw 1 ] [ fw 1 add neg fw 1 add 1 ] + [ fw neg fw 1 add 1 ] [ fw 1 add fw 1 add 1 ] + [ fw 1 add fw 1 ] [ fw 1 add fw neg 1 ] + [ fw fw 1 add 0 ] [ fw 1 add fw 1 add neg 0 ] + [ fw fw 1 add neg 0 ] [ fw neg fw 1 add neg 0 ] + [ fw 1 add neg fw 1 add neg 0 ] [ fw 1 add neg fw neg 0 ] + ] {pixs exch {} forall 3 1 roll cmv exch put} forall + + % Mode ring + format (full) eq { + /modemap [ + [-5 7] [-4 7] [-3 7] [-2 7] [-1 7] [ 1 7] [ 2 7] [ 3 7] [ 4 7] [ 5 7] + [ 7 5] [ 7 4] [ 7 3] [ 7 2] [ 7 1] [ 7 -1] [ 7 -2] [ 7 -3] [ 7 -4] [ 7 -5] + [ 5 -7] [ 4 -7] [ 3 -7] [ 2 -7] [ 1 -7] [-1 -7] [-2 -7] [-3 -7] [-4 -7] [-5 -7] + [-7 -5] [-7 -4] [-7 -3] [-7 -2] [-7 -1] [-7 1] [-7 2] [-7 3] [-7 4] [-7 5] + ] def + } { + /modemap [ + [-3 5] [-2 5] [-1 5] [ 0 5] [ 1 5] [ 2 5] [ 3 5] + [ 5 3] [ 5 2] [ 5 1] [ 5 0] [ 5 -1] [ 5 -2] [ 5 -3] + [ 3 -5] [ 2 -5] [ 1 -5] [ 0 -5] [-1 -5] [-2 -5] [-3 -5] + [-5 -3] [-5 -2] [-5 -1] [-5 0] [-5 1] [-5 2] [-5 3] + ] def + } ifelse + 0 1 modemap length 1 sub { + /i exch def + pixs modemap i get {} forall cmv modebits i get 48 sub put + } for + + << + /ren //renmatrix + /pixs pixs + /pixx size + /pixy size + /height size 2 mul 72 div + /width size 2 mul 72 div + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/azteccode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER azteccode-- +% --BEGIN ENCODER azteccodecompact-- +% --REQUIRES preamble raiseerror renmatrix azteccode-- +% --DESC: Compact Aztec Code +% --EXAM: 1234 +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp azteccodecompact 0.0 2015050900 60604 60376 +%%BeginData: 43 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /azteccode dup /uk.co.terryburton.bwipp findresource put +begin +/azteccodecompact { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Get the result of encoding with azteccode with format=compact + options (dontdraw) true put + options (format) (compact) put + + /args barcode options //azteccode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/azteccodecompact dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER azteccodecompact-- + +% --BEGIN ENCODER aztecrune-- +% --REQUIRES preamble raiseerror renmatrix azteccode-- +% --DESC: Aztec Runes +% --EXAM: 1 +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp aztecrune 0.0 2015050900 60573 60352 +%%BeginData: 43 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /azteccode dup /uk.co.terryburton.bwipp findresource put +begin +/aztecrune { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Get the result of encoding with azteccode with format=rune + options (dontdraw) true put + options (format) (rune) put + + /args barcode options //azteccode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/aztecrune dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER aztecrune-- + % --BEGIN ENCODER codeone-- % --REQUIRES preamble raiseerror renmatrix-- % --DESC: Code One % --EXAM: Code One % --EXOP: version=B % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp codeone 0.0 0 0 0 -%%BeginData: 82 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ KF D5Z 2F* j(NA moLsA -Wf3'P!FGY<0B5(@ ZmRN0o c8t P )XR (F _-_! H]f tD5*C&O5*@ ^MH]ft&Eckr -V1OYEdI?J0)*g/N :DfBf4 Df0 W Z5*@ ^MP# Q@= FD5Z2F*j'+ I?I/TF*)\HA -KZ/-EcYr5DMS:K! Kp-:!E 5.E Ou%0 $H#R >A0 61KF+EVXHA WeitP#QC/Ec -Yf=05YcC+C\c"@r GmhP% 'TNO u"b+L ]ESo @UX :eDe*F+NWE ILNI-gJD0'? -Q5&-6EP'N4"C6AU R!KmI :C6Cc D1Qlm D3/ @Qj"-Q?@/8 ]H@P!3W:!Ks -FF5*C/R30Ia,"-T X>"-Pj2 9RV8N3 ,N_LP !3W D5*C2S@VV& ,05?Y6Ou"b# -@<,jrA7Zm#F(^:/C6D8R1Qk"OP#ZpnAUT_@04J@1Ch7K,@UX:eDe*FB@ZiNf@<[&OASu!rA8,p -oNWX<1GEOb1P#Q"1@rGmlDJ+t3Eaa0T4aShlGB4m9@<-0qDNY"-Q?@/P'AWo+DHW4Oo^_%05;VEL]NY>Ou%NLOu"b++DQ]5Oo^_%I=#IJF!,4P!:,em@s;u:C5;nR!FoeOEeo4.WKMKZBcq,G!KmJH1 -GDOhd!Jgl7&;Um'+Bsj,7>NdV2Ma&A!4I\QL]N;7L_bd^>p*@3!Chl7LeN -UmL&l=L!/u^8L]iMLL`]nF>E/_SLhMTRLffB5gkGhHL]iMp*@3!D%qFP_K0mLj4XXaG -'aML^8e@L_PY6>p*@3"B-m,0Sg!j$]#.G"Gd2:!Jk6A@u+W#+Bsj/;_9aYL^8eOL_PXNL^8e;L -gu6NLgs^5>E/hb/Mf):#`'RY*f(5\%#=q?@u+WN@pL3]NW`<50fFh!L_5FSL^JqFL]Np*@3"B6s/15HKt+c%7s(l/`Z!Jk6A@u+W#+Bsj/<%TpdL_,@sLbOW3L_bdILgu6NLgs^5?'6u -sBnubP1OCcl+Dk\3EbT$)+DI!3Ou"b7ATDi7D281T99M(aEc6/C+Dlo8P"Uro04Sp:F!,=U!g6 -3>1G<9KDepP5L]`f5Ou"b%@s;u:D28=X99M(aEcY`7+DloGB8pVA7Kh)P#-KYDeid,+D,%uF(LLjI?IQJCLML8P!FGY<%hr.Bnue -Q!Ko6eP%A]VH#R>XE-j6JGB4m2+CfV:OogehA7Kh)+CfV:P%'TRH\MNOI?K4gOu%NL<%ha*@WN -Z4F(/sK$'I(tARf1j+EDO4Cm#*f1Pc$e!HN6jCkr+TWI$:4P!5$b04T38+Cnu$@Zh%\1Pc$e!G -#\Z@Yb&JWI$:5P!5$b@s;B)C*7#1F!,3?EcY]+P&+iq!Kp*=G^Y`G@s;C'+DDs.G@H_[I?I,SB -4`9-FEqh:H\`emH\MP$I?ITn1G$KEcZ -&8B9GHA99MJZF)5c-P!5%%Oo]3-/MWE'EcYZ*DeG4sP"U4MP')q1L]Djd9IF"@WNZ+P"U -r>P'(>GE+40M!.C#_?'7""!/LYd@rPn5!KsF/05Zk9Ou"b,+EDO5GB4mDP"UroL]E53ARf[gL] -N[Oo]'2AS,Oq+D#&%@N]EKWJCSP,Wkm8R7K=L]E56P -"[NNDfCk'Ou%msL]il704JjAP!5$bI=$tX0JG170SfmqV32^Z3+I/R+DI!3L]WA9P,4P,Wkm8R3uZ0p4_`1QDVm0JG17L]rsq]\CP!5$b06D,O+Bosu0o,gc"-Q?@!g7\915G -pd!g66?!g7\3Ou"b#Dfd+++Cd-^",I#A9TfI?F^m1_!f-rA9TfI?F^:.dI?ITID..N/EZen&De -tSQA!-k7DfCkbD/E^'+EE8=Oo]*'DetSQA!-k%Dfh.f04Q,7+EVO@P%'RTOu$SjA7KOoP!+.F@ -u(,J1G+F-:?d -M#VmdK3aWr04AmCBkCd`F+F*i]CI?K52Oq)hKDesKAL]MpeK7/mmH\_Z3DesKN!g9O -0L]MpeK89MUOq)hp!/LYcDesKN"Hoa2L]DjdK89Pa!.C"?HXgu1F,0j[WJCV=;L=6"I?K5=!Fp - %aF,0j[WJCV=;L=6"I?K52Oq)hKDesKN!KsF6&l.(1,1RA1G;(T#Ve(h1GgmE1G;+U#Ve(h1,1RA1G;.V$8F:j1GgmE1Ggm@7?.^01,1O -=1GgmE1G;4X$8F:j1,1O=1Ggm@7ue!41,1O=1GgmE1Ggm@8<+*51,1O=1,1RA1Ggm@;iV,@2E! -HJ1,h0Gq\Me>9I.+&;UQs+C-Wf+BosmL`2'X>p* -E+6m,\V>q\Vh>9I.+)Mf28+C-Wi+BosmL`2'l>p*@-7Yi0m+BsX?La$+I>DPb),$cDP_(0O5f,01[3i+BsX?LdkYm>DPV%7U7-@Lh_`8>p*@-)Mgpi+BsXgLe(eo>DR$M8 -6m?D02jGW0HaRB>q],.1,'hT+BsX/L]h!+>q],.1GBqU+BsX4L]h!+>DNfG#$i?W02sMX2BZ3H ->DNQ@$=+c[02sMZ1*BdD>DNiH$=+cYL_,@N>p*E+<%Tpd+BosmL_tpT>p*@-(l/T++BsX=L^m] -5>p) -% uk.co.terryburton.bwipp/codeone 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp codeone 0.0 2015050900 119329 129149 +%%BeginData: 512 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/codeone { + + 20 dict begin + + /options exch def + /barcode exch def + + /dontdraw false def + /version (unset) def + /encoding (ascii) def + /raw false def + /parse false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Parse ordinals of the form ^NNN to ASCII + parse { + /msg barcode length string def + /j 0 def + barcode + { % loop + (^) search { + dup msg exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi msg exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup msg exch j exch putinterval + length j add /j exch def + /barcode msg 0 j getinterval def + exit + } ifelse + } loop + } if + + /barlen barcode length def + + raw {/encoding (raw) def} if + + /stype version 0 1 getinterval (S) eq def + stype {/encoding (stype) def} if + + encoding (raw) eq { + /cws barlen array def + /i 0 def /j 0 def + { % loop + i barlen eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + cws j cw put + /i i 4 add def + /j j 1 add def + } loop + /cws cws 0 j getinterval def + } if + + encoding (ascii) eq { + /cws barlen 2 mul array def + /i 0 def /j 0 def + { % loop + i barlen eq {exit} if + /char barcode i get def + char 48 ge char 57 le and i barlen 1 sub lt and { + barcode i 1 add get dup 48 ge exch 57 le and { % Digit pair + cws j barcode i 2 getinterval cvi 130 add put + /i i 2 add def + /j j 1 add def + } { % Singular digit + cws j char 1 add put + /i i 1 add def + /j j 1 add def + } ifelse + } { char 127 le { % ASCII + cws j char 1 add put + /i i 1 add def + /j j 1 add def + } { % Extended ASCII + cws j 235 put + cws j 1 add char 127 sub put + /i i 1 add def + /j j 2 add def + } ifelse } ifelse + } loop + /cws cws 0 j getinterval def + } if + + encoding (stype) eq { + /vals [ + [ (0) (1) (10) (11) (100) + (101) (110) (111) (1000) (1001) + ] + [ (0) (1010) (10100) (11110) (101000) + (110010) (111100) (1000110) (1010000) (1011010) + ] + [ (0) (1100100) (11001000) (100101100) + (110010000) (111110100) (1001011000) + (1010111100) (1100100000) (1110000100) + ] + [ (0) (1111101000) (11111010000) (101110111000) + (111110100000) (1001110001000) (1011101110000) + (1101101011000) (1111101000000) (10001100101000) + ] + [ (0) (10011100010000) (100111000100000) (111010100110000) + (1001110001000000) (1100001101010000) (1110101001100000) + (10001000101110000) (10011100010000000) (10101111110010000) + ] + [ (0) (11000011010100000) (110000110101000000) (1001001001111100000) + (1100001101010000000) (1111010000100100000) (10010010011111000000) + (10101010111001100000) (11000011010100000000) (11011011101110100000) + ] + [ (0) (11110100001001000000) + (111101000010010000000) (1011011100011011000000) + (1111010000100100000000) (10011000100101101000000) + (10110111000110110000000) (11010101100111111000000) + (11110100001001000000000) (100010010101010001000000) + ] + [ (0) (100110001001011010000000) + (1001100010010110100000000) (1110010011100001110000000) + (10011000100101101000000000) (10111110101111000010000000) + (11100100111000011100000000) (100001011000001110110000000) + (100110001001011010000000000) (101010111010100101010000000) + ] + [ (0) (101111101011110000100000000) + (1011111010111100001000000000) (10001111000011010001100000000) + (10111110101111000010000000000) (11101110011010110010100000000) + (100011110000110100011000000000) (101001101110010010011100000000) + (101111101011110000100000000000) (110101101001001110100100000000) + ] + [ (0) (111011100110101100101000000000) + (1110111001101011001010000000000) (10110010110100000101111000000000) + (11101110011010110010100000000000) (100101010000001011111001000000000) + (101100101101000001011110000000000) (110100001001110111000011000000000) + (111011100110101100101000000000000) (1000011000011100010001101000000000) + ] + [ (0) (1001010100000010111110010000000000) + (10010101000000101111100100000000000) + (11011111100001000111010110000000000) + (100101010000001011111001000000000000) + (101110100100001110110111010000000000) + (110111111000010001110101100000000000) + (1000001001100010100110011110000000000) + (1001010100000010111110010000000000000) + (1010011110100011010110000010000000000) + ] + [ (0) (1011101001000011101101110100000000000) + (10111010010000111011011101000000000000) + (100010111011001011001001011100000000000) + (101110100100001110110111010000000000000) + (111010001101010010100101000100000000000) + (1000101110110010110010010111000000000000) + (1010001011111011010000000101100000000000) + (1011101001000011101101110100000000000000) + (1101000110001100001011100010100000000000) + ] + [ (0) (1110100011010100101001010001000000000000) + (11101000110101001010010100010000000000000) + (101011101001111101111011110011000000000000) + (111010001101010010100101000100000000000000) + (1001000110000100111001110010101000000000000) + (1010111010011111011110111100110000000000000) + (1100101110111010000100000110111000000000000) + (1110100011010100101001010001000000000000000) + (10000010111101111001110011011001000000000000) + ] + [ (0) (10010001100001001110011100101010000000000000) + (100100011000010011100111001010100000000000000) + (110110100100011101011010101111110000000000000) + (1001000110000100111001110010101000000000000000) + (1011010111100110001000001111010010000000000000) + (1101101001000111010110101011111100000000000000) + (1111111010101000100101001000100110000000000000) + (10010001100001001110011100101010000000000000000) + (10100011101101011000010000001111010000000000000) + ] + [ (0) (10110101111001100010000011110100100000000000000) + (101101011110011000100000111101001000000000000000) + (1000100001101100100110001011011101100000000000000) + (1011010111100110001000001111010010000000000000000) + (1110001101011111101010010011000110100000000000000) + (10001000011011001001100010110111011000000000000000) + (10011111001010010101110011010101111100000000000000) + (10110101111001100010000011110100100000000000000000) + (11001100101000101110010100010011000100000000000000) + ] + [ (0) (11100011010111111010100100110001101000000000000000) + (111000110101111110101001001100011010000000000000000) + (1010101010000111101111101110010100111000000000000000) + (1110001101011111101010010011000110100000000000000000) + (10001110000110111100100110111111000001000000000000000) + (10101010100001111011111011100101001110000000000000000) + (11000110111100111011010000001011011011000000000000000) + (11100011010111111010100100110001101000000000000000000) + (11111111110010111001111001010111110101000000000000000) + ] + [ (0) (100011100001101111001001101111110000010000000000000000) + (1000111000011011110010011011111100000100000000000000000) + (1101010100101001101011101001111010000110000000000000000) + (10001110000110111100100110111111000001000000000000000000) + (10110001101000101011110000101110110001010000000000000000) + (11010101001010011010111010011110100001100000000000000000) + (11111000101100001010000100001110010001110000000000000000) + (100011100001101111001001101111110000010000000000000000000) + (100111111101111101000010111101101110010010000000000000000) + ] + [ (0) (101100011010001010111100001011101100010100000000000000000) + (1011000110100010101111000010111011000101000000000000000000) + (10000101001110100000110100100011000100111100000000000000000) + (10110001101000101011110000101110110001010000000000000000000) + (11011110000010110110101100111010011101100100000000000000000) + (100001010011101000001101001000110001001111000000000000000000) + (100110110110111001100100101010001110110001100000000000000000) + (101100011010001010111100001011101100010100000000000000000000) + (110001111101011100010011101101001001110110100000000000000000) + ] + ] def + + /normalize { + /base exch def + /num exch def + num length 1 sub -1 1 { + /i exch def + num i 1 sub 2 copy get num i get base idiv add put + num i num i get base mod put + } for + { %loop - extend input as necessary + num 0 get base lt {exit} if + /num [0 num {} forall] def + num 0 num 0 get num 1 get base idiv add put + num 1 num 1 get base mod put + } loop + % Trim leading zeros + /num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def + num length 0 eq {/num [0] def} if + num + } bind def + + /bigadd { + 2 copy length exch length + 2 copy sub abs /offset exch def + lt {exch} if + /a exch def /b exch def + 0 1 b length 1 sub { + dup a exch offset add 2 copy get b 5 -1 roll get add put + } for + a + } bind def + + % Convert value plus one to binary + /v [ 1 ] def + 0 1 barlen 1 sub { + /i exch def + vals i get barcode barlen i sub 1 sub get 48 sub get + [ exch {48 sub} forall ] v bigadd /v exch def + } for + /v v 2 normalize def + + % Split into 5-bit codewords + /v [ 5 v length 5 mod sub 5 mod {0} repeat v aload pop ] def + /cws v length 5 idiv array def + 0 1 cws length 1 sub { + /i exch def + v i 5 mul 5 getinterval + 0 exch {add 2 mul} forall 2 idiv + cws exch i exch put + } for + + } if + + % Basic metrics for the each symbol + % ver row col dcol dcws rscw rsbl ro ri rl + /metrics [ + [ (A) 16 18 16 10 10 1 4 99 6 ] + [ (B) 22 22 20 19 16 1 4 99 8 ] + [ (C) 28 32 28 44 26 1 4 22 11 ] + [ (D) 40 42 36 91 44 1 4 16 16 ] + [ (E) 52 54 48 182 70 1 4 22 22 ] + [ (F) 70 76 68 370 140 2 4 22 31 ] + [ (G) 104 98 88 732 280 4 6 21 47 ] + [ (H) 148 134 120 1480 560 8 6 20 69 ] + [ (S-10) 8 11 10 4 4 1 99 99 99 ] + [ (S-20) 8 21 20 8 8 1 99 99 99 ] + [ (S-30) 8 31 30 12 12 1 99 99 99 ] + [ (T-16) 16 17 16 10 10 1 99 99 99 ] + [ (T-32) 16 33 32 24 16 1 99 99 99 ] + [ (T-48) 16 49 48 38 22 1 99 99 99 ] + ] def + + % Select metrics of an appropriate symbol + /i 0 def + { % loop + /m metrics i get def + /vers m 0 get def % Version of symbol + /rows m 1 get def % Rows in symbol + /cols m 2 get def % Columns in symbol + /dcol m 3 get def % Data columns in symbol + /dcws m 4 get def % Data codewords in symbol + /rscw m 5 get def % Error correction codewords + /rsbl m 6 get def % Error correction blocks + /riso m 7 get def % Riser offset + /risi m 8 get def % Riser interval + /risl m 9 get def % Riser length + /dcpb dcws rsbl idiv def % Data codewords per block + /ecpb rscw rsbl idiv def % Error codewords per block + /okay true def + version (unset) ne version vers ne and {/okay false def} if % The version must match that supplied + cws length dcws gt {/okay false def} if + okay {exit} if + /i i 1 add def + } loop + + % Extend cws to ncws codewords by addition of pad characters + stype not { + /cws [ cws aload pop dcws cws length sub {129} repeat ] def + } { + /cws [ dcws cws length sub {0} repeat cws aload pop ] def + } ifelse + + % De-interleave the codewords into blocks + /cwbs rsbl array def % Array of data codeword blocks + /ecbs rsbl array def % Array of error correction blocks + 0 1 rsbl 1 sub { + /i exch def + /cwb dcpb array def + 0 1 dcpb 1 sub { + /j exch def + cwb j cws j rsbl mul i add get put + } for + cwbs i cwb put + } for + + % Log and anti-log tables and function to calculate product in the field + /gf stype {32} {256} ifelse def + /gf-1 gf 1 sub def + /pm stype {37} {301} ifelse def + /rsalog [ 1 gf-1 { dup 2 mul dup gf ge {pm xor} if } repeat ] def + /rslog gf array def + 1 1 gf-1 {dup rsalog exch get exch rslog 3 1 roll put} for + /rsprod { + 2 copy 0 ne exch 0 ne and { + rslog exch get exch rslog exch get add gf-1 mod rsalog exch get + } { + pop pop 0 + } ifelse + } bind def + + % Generate the coefficients for the Reed-Solomon algorithm + /coeffs [ 1 ecpb {0} repeat ] def + 0 1 ecpb 1 sub { + /i exch def + coeffs i 1 add coeffs i get put + i -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + + % Reed-Solomon algorithm to derive the error correction codewords + 0 1 cwbs length 1 sub { + /i exch def + /rscws [ cwbs i get aload pop ecpb {0} repeat ] def + 0 1 dcpb 1 sub { + /m exch def + /k rscws m get def + 0 1 ecpb 1 sub { + /j exch def + rscws m j add 1 add coeffs ecpb j sub 1 sub get k rsprod rscws m j add 1 add get xor put + } for + } for + ecbs i rscws dcpb ecpb getinterval put + } for + + % Extend codewords with the interleaved error correction codes + /cws [ cws aload pop rscw {0} repeat ] def + 0 1 rscw 1 sub { + /i exch def + cws dcws i add ecbs i rsbl mod get i rsbl idiv get put + } for + + % Module matrix for layout of the codewords + /mmat dcws rscw add stype {5} {8} ifelse mul array def + /r 0 def /c 0 def + 0 stype {2} {1} ifelse cws length 1 sub { + /i exch def + stype not { + (00000000) 8 string copy dup cws i get 2 8 string cvrs + dup length 8 exch sub exch putinterval [ exch {48 sub} forall ] + dup 0 4 getinterval /top exch def + 4 4 getinterval /bot exch def + } { + (00000) 5 string copy dup cws i get 2 5 string cvrs + dup length 5 exch sub exch putinterval [ exch {48 sub} forall ] + /c1 exch def + (00000) 5 string copy dup cws i 1 add get 2 5 string cvrs + dup length 5 exch sub exch putinterval [ exch {48 sub} forall ] + /c2 exch def + /top [ c1 0 3 getinterval aload pop c2 0 2 getinterval aload pop ] def + /bot [ c1 3 2 getinterval aload pop c2 2 3 getinterval aload pop ] def + } ifelse + mmat r dcol mul c add top putinterval + mmat r 1 add dcol mul c add bot putinterval + /c c top length add def + c dcol eq {/c 0 def /r r 2 add def} if + } for + + % Create bitmap and add finder patterns + /mmv {cols mul add} bind def + /pixs [ rows cols mul {-1} repeat ] def + + % Centre pattern + /artifact [ + {cols {0} repeat} bind + {cols {1} repeat} bind + {0 cols 2 sub {1} repeat 0} bind + {0 1 cols 4 sub {0} repeat 1 0} bind + {cols 1 sub 2 idiv {-1} repeat 1 cols 1 sub 2 idiv {-1} repeat} bind + {cols 1 sub 2 idiv {-1} repeat 0 cols 1 sub 2 idiv {-1} repeat} bind + {1 cols 2 sub {0} repeat 1} bind + {1 0 cols 4 sub {1} repeat 0 1} bind + ] def + /cpat << + /A (121343) + /B (12134343) + /C (12121343) + /D (1213434343) + /E (1212134343) + /F (1212121343) + /G (121213434343) + /H (121212134343) + /S (56661278) + /T (5666666666127878) + >> vers 0 1 getinterval get def + pixs 0 rows cpat length sub 2 idiv mmv + [ cpat {artifact exch 49 sub get exec} forall ] putinterval + + % Risers + 0 1 risl 1 sub { + /i exch def + riso risi cols 1 sub { + /j exch def + [ 1 i 12 mod 0 eq {1} {0} ifelse ] dup + pixs j i mmv + 3 -1 roll putinterval + i risl 1 sub ne { + pixs cols j sub 2 sub rows i sub 1 sub mmv + 3 -1 roll putinterval + } {pop} ifelse + } for + } for + + % Black dots + << + /A [ [12 5] ] + /B [ [16 7] ] + /C [ [26 12] ] + /D [] + /E [ [26 23] ] + /F [ [26 32] [70 32] [26 34] [70 34] ] + /G [ [27 48] [69 48] ] + /H [ [26 70] [66 70] [106 70] [26 72] [66 72] [106 72] ] + /S-10 [] + /S-20 [ [10 4] ] + /S-30 [ [15 4] [15 6] ] + /T-16 [ [8 10] ] + /T-32 [ [16 10] [16 12] ] + /T-48 [ [24 10] [24 12] [24 14] ] + >> vers get {pixs exch aload pop mmv 1 put} forall + + % Place the modules onto a pixel map between alignment patterns + /j 0 def + 0 1 pixs length 1 sub { + /i exch def + pixs i get -1 eq { + pixs i mmat j get put + /j j 1 add def + } if + } for + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx cols + /pixy rows + /height rows 72 div 2 mul + /width cols 72 div 2 mul + /opt options + >> + + dontdraw not //renmatrix if + + end + +} bind def +/codeone dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER codeone-- @@ -6202,160 +18522,658 @@ HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: (01)95012345678903(3103)000123 % --EXOP: ccversion=b cccolumns=4 % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1-cc 0.0 0 0 0 -%%BeginData: 152 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ D/! L#DfB6 !1 bgqP3% oDi -/n8fPFCfK5H"(o: FDl%L @Wu O*E 0A q< G`i LhB 6,dZ@q 0k A'Tt>: %52 -X=FD5Z2F-8_M1G< 3GEa s#u AW f6 ?1G <9W DKK E0@< -Wi+@;L!rOu"b$@s 2F(F ( oQ 1N WER O1G <6J@ rH1+D -/OENs,o/kCh[d/H #R>T!0 T,k C h[d 2B k2=! M#W VoDfBf4Df0 WZY:js=EbTE -(FEqh:P!+/J!Ko= '%<$3- Bl@ m 1H]k FA@; L!r P!+/T5^eep OuSV6P,4G %>ARTI9 L]];QE +pe@<-F2@:O(aA;C: -?A79Rg@UX:uFCAZpARo^rDJ=n.04\L5@:EYcFE2MA@psIjA;C@AA79Rg@UX:nBl.R+ARpT!04\ -L5@:EYcAU&0&DIdpe@<,q(E+*WpARok(@:O(aA;C@P4s4ZUDKL/CAWf\>@q0"eCi -sT4F-8_M1OYEc04fBI@;]V&05505?Y6Ou&8DOuS6tL]`f6Ot:NoFHSh&L]N[L]`f( -P"^:NOuRB&FHSh&P!5%SP%&0h!AA2N5*@^?F``E>C6D8R5^eeqI?J/iOq*X204AR9+BosoOu"b -"Bm*p$L]W_sOu$QUEas#uAWf$9@Yb&JWJCS<5*ATdOuSI%P!+/T5^eepNWCSlNKSFI5*C&O5)o -XlP)XgO5*C&O5)9;s!Kr4dH]A)^",Hu@LOG=c>9I?gF-6TfFcm]"!g3SI=C!RgBlfG$Ou$N\G% -#3C",Hu@LLk^L@;]V=G^Y`dP'&ElF*2G@ATE-\3/Bk`8s2Ao>*<1GOq*X204A[9BON#G4GZ:Z!Jjp+OuS7`P,X6@FDkW&DLI[=LbOVcLcKgF3/@^#!Jgr%D -dmEuI?I-5DIYD]"Yh_d0ekjUOu"b/F_t]1Bk&8J4GWun!JkrHOuSI'0JJ:aP,4Fr?H@(f -7L^0*BL^/$?@VK_.P":BPNX.?o0eb=90JJ;,NX.?o0eb=90JSA0L]N;bH]g@C!6(*%L^8*@@VK -_.P":BiL]N;rH]g@C!5"BpL^8*@@VK_.P":C9NX.?o0ekC:0enJ,NX.?o0ekC;0JI<\F_t]1Bk -*/*0JG1s@;Kmr@;^4)ATDKpNWh*j0eb:F5*@^=ATVU(A<$^G0TnSG@;0e=!0U!8!\lEm4^i&GL -]ET2NWLpoP!+tKHXUW3@;I&pBlf(1P"Us2OuS6tL]W`5Ot;=gJt!g66?/DN<9!/LZ3!F:jEI?IT=BlfGHL]ETTHX -UW0L]ET2NWLphP!+.FB5hH*>9I?gG%#3I!\lBl97))M8R7K8@;0eG@Yb&J:jXj.E+U4s+D5Y*O -ogehAo;*5+C1-dI?IP_@;0d*@;0e=!F]\`P%'4JP,XU9I471OYEd05YW@;._UP%'SkHXUVK0Hb7PEb1%-Oo]!*3A?V*DK'W-P,X6D0(j@@;._UEb0*N@ZkST05YW"^u4dBOR&eH\_]Y!I^,1?'6us@;0d;+CSu*P%'4JP#-L6Blf(2P"U4MM# -VmdH4d'i404SO)+BosuA7gu+P'(2IF"r[V1,4qTH\_]Y! -.B3M!Jgc)P#YeN1OXU'@q90o>9IEdAs*4YFbg$'Ou%NL%),*0Hb7PEb1%-P"_$uH]hj$5*C&O5*C% -A@EV0sLbP!kI?I0-05b65FEP,Wkm8R3uX@VKq*P!5$b04SO)+BosuA -7gu+P'(YOBlnEZ!g7\7@VKq*Oogeh?'7!lH]AFe0JG170JG170Sg(!V32^Z3,WnJCkr.K$Bh6K -0TnDY@YbAS5*Dn.5*C1qP!45K0TrD`P"Aq4DIR=%F-8_M1QDVm0JG17L]rsq]VqBlnEZ5*@]T@q90o>9I -EdAs*4YFbg'S!Jgc4!Jgbo@VKq*Oogeh@:EqmF-6TfF^:.dI?ITIDe*F>#B"[$ATDKpP!+.FB5 -hH*>9I?g3A>JbD0p\o8RZ=SP%'4JP#-L;DIYDLP#P_M1OXU'ASu"!+Dl%-AW?q&CiF&rP!+/#C -iF&rI=!)FCiF&rDKTf-EbT$3P#[Z$055;H>9I?g3A>JbD0p\o8RZ=SP%'4JP#-L;DIYDLP#P_M -1Gp+'.FHSh&P!5%SP%&0h!AA2N5*@^MP"769A7crg+CeqoOogehDfp/X!,@ZjOogeh?'6 -usB5hH*>9I471LY!=P%'4JP#-"6A7^c)@;Kmr@?PJjEdKHVDe*F>#B"[$ATDKpOu%NL<.0p004 -AR9+CSu*L]LpuF-:!g!KsFF9Th2?BlfGHL]ETTHXUW00oc;j0p4\.Blc"h"?8(h1m1"bEdKHPE -+U4s+D5Y*Oogeh@;0mnC`m/#F"rhNH[V&K?'6us@;0d*@;0e=!F]\`P%'4JP,XUDN98!Jgl*I?I-,H]A -.]0SfdnV32^Z30H7W!Jgo8s,r.n0TlI"G[Y;uBm=3"L]`G6P)#3FI?I0+L^T">L_P2aP":BFL` -_ERLa7=qP":BX?$hA7L]Wa9Ot`%Y@;0=fG\(EA",Hu@LQZn1P"CH0L]LpuF-:!g!KsF/056S5O -u"b"BcphuF!,1[99M(aG%#20@;0mnC`m/#P"UroB5hIG@UWu6@Zgb8@;M*9Oo^^POuS6tB5hIG -H'1."E+Y8B@;-igP!45@P"ArBH'1."E+Y8B@;1m6Oo]`7C`lrF5'q^@8R7L)05#69P!5$bBcph -uF-:!g!KsFFD..-jBm=3"+CSu?!/L]>9TieHE0:?NB5hIG@Yb&J!KmbP3/@QIE+Y8YOuR)nAs- -V8DIYDaGV<]KAs,?@1OYEcI?I,SEb0)sBlnEC06M>IA1Ljpp*@+!2kPOMMQG3@Ydcb+BsR#`J+AjL&d*eCkthl+C-X0+BosmL -&k,*!@W['!/:L#L&dm&BS\WR+BsR&!/:Q2L&r3H!MG/J0STSSL&dTsE/7&@+C-*oL'40("8ITQ -8;72=L&pdu!FUW_#_i?+L&dTs@#-dJ+C-*R4s4?FG%G]8Bl@mP94MIADesQ5DKCU8P,XU;04JX -;@ps=tP!5$bM#UpuFCS`uF*j'0F`V,)P"L(a5(/SnP')298Wl&hs,q5GF`V,)P,Wkm<.0*U4>1 -3#s#rUh@q0[nEcYr5DN[YUFY@SSF`V,)L^9/%OqP&-:FL^'#WOo^_%D29U'@= -*e9I?IQHLaeKZD2&%`P$sLVH\`5]P#Q:Q!25QJD2&'VP$sLVH\`emP#Q:Q!C;l@H\aq8P#O)G@ -q0_(P!5$b05VhK+D#%mGB8oJL]`e@Ou"b$+Dbb0GA1T0BS\L.WJD.L;N`hQ+CgR4Lg#s@sWKK5s"d2c>#*Nec5)9B -*C6AUR#a0"e1NdbMA;24?P$r]ZB658=F(JmFWI9,Ls*^&1I?ITn3/ITt4aW?7@q0[nEcYr5DN4 -a+P!+.F@q0[nEcYr5DN4a,Ou%N5@q0[nEcYr5DN4a,P!*VqDKL/CAW@".F"o7$1,tF[Op$+b@q -0[nEcYr5DN4a-Ou"b$@q0FnF_u#;+Dbb0GA1T0BS\L.WJD.L;N`haHS8l=G%G]8Bl@mFs,o0dP -#Zpno(D.74$F+'3NI?G)'1G<DKTf-EbT$(F`)7C -BnuhR!Kp*3!g3SIG^XpVF_t]1Bk)1+DK?q7L]ET_I?ITn3+6WBBOPe$D.Ra%A!0$=@!cFD5f72Dd=1DJ -XS@BnubPG^XpVAU&<2F)Nrn2K*JLGp$fDDIn'7Ble2N1cB8iCj@.;L]NY>P"UT3Oo^_jI?ITYP -"76=E+W[!@tl+>OpR:-0564BOu"b+L]ESoHYFU8E+Y8BP!+/T5^eepHYm\3AW@"5F_t]1Bk*;h -HYFU8E+Y8BL]Wa=P$r]n!g9CC3/@QIE+U5,P"UrtAo;*5P!+/TFbj@PP#RThOuS6uB5hH*Bnue -Q!Kp*=3+d&<0p4\HP')ReI?IQmG`k%(F_t]1Bk*;iP$iWSF_t]1Bk&8sDI[TqAM7a?BnuhR!Ko -7%5^eepP'(SLCiF&rDKTf-EbT#+DKTf-EbT#+ASu!rA7[E2De*F>$t3skBOPe$D.Ra%A!/X25^ -dulE+U5,P"UrtLbP!(P!4[^P#.<^HYd,,E+iZtF_t]1Bk&9'F_t]1Bk&8sDI[TqAM7n=A7^c0@ -;Kmr@;^4)ATDKpOu&7dI?IP_Eb0)1@q927@VV&,Eb0)sBlnEZ1NI&DL]il5Eb0*D#*NDX"FH.5 -0JG170JJ:eP,4$t3skBOPe$D.Ra%A!0!%B5hH*Bp),$DIYDa4aUdY@k -f*7CiF&rDKTf-EbT#+ASu!rA7[E2De*F>#B"[$ATDKpOu"b*+DHW4Oo^_%P!FGY<+g/^+DI!3O -uR/sD`0F1P!5%:P!3;jE+iZtF_t]1Bk*;iP$jGlOp$,JBle2N1c?IbCiF&rDKTf-EbT#+ASu!r -A7[E2De*F>#&/-s2Dd=T1Qk"OP#Q=AD.Ra%@rc^0F!,1[98Ee88pbAlF_t]1Bk&8oCiF&rDKTf --EbT#+ASu!rA7[E2De*F>#B"[$ATDKpOu&7dI?IQIF_t]1Bk)1+DK?q7P"UrtL]il5P!3TC!G? -@`P%'S;Op$,JDKTf-EbT#+@;Kmr@;^4)ATDKp+D#G#De*E4D/WrrNX'HED.Ra%A!/X25^eepB5 -hH*Bp)+tCiF&rDKTf-EbT#+ASu!rA7[E.+DHW4Oo^_%P!FGY<,HPaAW?t/F)Nrn2Ng4MB5hH*B -p),$DIYDa4aUdY@kf*?F)Nrn2BZRK@rGmh05YWOu&7dI?IQI -F_t]1Bk)1+DK?q7P"UT6P"KV'G][Y@D`0F1Df0B:+DI!3L^K;;Op$,JDKTf-EbT#+Ble2N1c?I -fDI[TqAM7n=A7^c+DKTf-EbT$H1Qk"OP#Pk+E+iZtF_t]1Bk)1+DK?q7P"UT7P"KV'G][Y@D`0 -F1Df0B:+DI!3L^K;;Op$,J@;Kmr@;^4)ATDKp+DGn82Dd<7ASu!rA7[E2De*F>$t3skBOPe$D. -Ra%A!/X25^eepB5hH*Bp),'F)Nrn2BZRK@rGmh052PCL]NY>Ou&7dI?IQXP%B')AM7\8Aft`*A -n>jiL]D1Q9Th1bE+*9"@q927@V9XlP%'RTEb0)sBlnEZ$'I)`@:YO1L]ET7H\_ZX"`Rm\P%'4J -P,Wd]Bp(ZC1N6c5+DDs&L]E52L]N;3L]C_:!,u@WP%&-gWJC_6!g4Fa:j\?hI?IQmFcoF]H$ti -HD/WrrNX'HED.Ra%A!0!%05t?1+BsX%L]E52L]DC&ADN98!/LW2!/LW2! -/LY]LdZTG#EfCAP(R&'1Pc'f!Jj-j05?Y6Ou"b7L]ESoL^&\8L]MiUBp(ZC1GWI?IP_@WNZ$BlnD=@YdH^BlnEZ@UbM"L]W_WP#-Lg5(/SnP')p]Ou -"b#F)2t.F-:!q1G<6Z+CfV:+CcO'F)6X>P#@):Oo^_>Ou"b$F)2t/F-:!q1Pc$e!Fg+dL]N[E-,f4DKCgDA8c@-A9)+&FE2M8P'CnaFD5Z2F,g?4@psJ"F_-_\DfBf4Df0WV#@h[g -F_u#;@q0"eCisT4F-:c$@<-"%+C\c"@rGmh+E)4@Bl@m10/%0V@rcL,A7dYQ2j-Cg1OYEc@q0[ -nEcYr5DN4a,P!+.F@UX:eDe*E%@VKq*P%'4QP#@I>Ou%moL]LsnEas#uAWgMY!KsF/056S5Ou$ -Q]FE8R=L^9/[L^9/;L]ET%H]eDc!g7AJP"CH2P#>atEas#uAWf5kP!5%RI?I->E-,f4DKCgDA8 -c@-A9)+&FE2M8P'CnaFD5Z2F,g?4@q'P#F_-_\DfBf4Df0WV#@h[gF_u#;@q0"eCisT4F-:c$@ -<-"%+C\c"@rGmh+E)4@Bl@m10/%0V@rcL,A7dYQ2j-Cg1OYEc@q0[nEcYr5DN4a-P!+.F@UX:e -De*E%@VKq*P%'4QP#@I>Ou%moL]LsnEas#uAWgMY!KsF/056S5Ou$Q]FE8R=L^9/[L^9/;L]ET - %H]eDc!g7AJP"CH2P#>atEas#uAWf5kP!5%RI?I->E-,f4DKCgDA8c@-A9)+&FE2M8P'CnaFD -5Z2F,g?4@q0V$F_-_\DfBf4Df0WV#@h[gF_u#;@q0"eCisT4F-:c$@<-"%+C\c"@rGmh+E)4@B -l@m10/%9TAi)5$P!>*cI?IQ -% uk.co.terryburton.bwipp/gs1-cc 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp gs1-cc 0.0 2015050900 201765 192297 +%%BeginData: 650 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /pdf417 dup /uk.co.terryburton.bwipp findresource put +dup /micropdf417 dup /uk.co.terryburton.bwipp findresource put +begin +/gs1-cc { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /ccversion (a) def + /cccolumns -1 def + /lintype () def + /linwidth -1 def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /cccolumns cccolumns cvi def + /linwidth linwidth cvi def + + % Select columns based on linear type + cccolumns -1 eq { + << + /ean13 4 + /upca 4 + /ean8 3 + /upce 2 + /gs1-128 + ccversion (c) ne {4} {linwidth 52 sub 17 idiv} ifelse + /databaromni 4 + /databarstacked 2 + /databarstackedomni 2 + /databartruncated 4 + /databarlimited 3 + /databarexpanded 4 + /databarexpandedstacked 4 + >> lintype get /cccolumns exch def + } if + + % Expand ordinals of the form ^NNN to ASCII + /expand { + /in exch def + /out in length string def + /j 0 def + in + { % loop + (^) search { + dup out exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi out exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup out exch j exch putinterval + length j add /j exch def + out 0 j getinterval exit + } ifelse + } loop + } bind def + + % Parse out AIs + /ais [] def + /aival 2 dict def + barcode dup length 1 sub 1 exch getinterval + { % loop + dup () eq {exit} if + (\)) search pop + exch pop + exch (\() search { + exch pop exch 3 1 roll + } { + () 3 1 roll + } ifelse + [ ais aload pop counttomark 2 add index ] /ais exch def + aival 3 1 roll expand put + } loop + pop + + % Method selection + /isupper {dup 65 ge exch 90 le and} bind def % A-Z + /isnum0 {dup 48 ge exch 57 le and} bind def % 0-9 + /isnum1 {dup 49 ge exch 57 le and} bind def % 1-9 + { % common exit + + % (10/11/17)... + ais length 1 ge { + ais 0 get (10) eq ais 0 get (11) eq or ais 0 get (17) eq or { + -1 (10) exit + } if + } if + + % (90){0-3 digits not starting 0}{upper alpha}... + ais length 1 ge { + ais 0 get (90) eq { + /v aival (90) get def + v length 1 ge { + v 0 get isupper { + 0 (11) exit + } if + } if + v length 2 ge { + v 0 get isnum1 + v 1 get isupper and { + 1 (11) exit + } if + } if + v length 3 ge { + v 0 get isnum1 + v 1 get isnum0 and + v 2 get isupper and { + 2 (11) exit + } if + } if + v length 4 ge { + v 0 get isnum1 + v 1 get isnum0 and + v 2 get isnum0 and + v 3 get isupper and { + 3 (11) exit + } if + } if + } if + } if + + % Freeform + -1 (0) exit + + } loop + /method exch def + /npre exch def + + /fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def + + /tobin { + string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } bind def + + /alpha << + 65 1 90 {dup 65 sub 5 tobin} for + 48 1 57 {dup 4 add 6 tobin} for + fnc1 (11111) + >> def + + /numeric << + 0 1 119 { + dup (00) 2 string copy dup 3 -1 roll 11 2 string cvrs + dup length 2 exch sub exch putinterval + dup 0 get 65 eq {dup 0 94 put} if + dup 1 get 65 eq {dup 1 94 put} if + exch 8 add + (0000000) 7 string copy dup 3 -1 roll 2 7 string cvrs + dup length 7 exch sub exch putinterval + } for + lalphanumeric (0000) + >> def + + /alphanumeric << + 48 1 57 {dup 43 sub 5 tobin} for + fnc1 (01111) + 65 1 90 {dup 33 sub 6 tobin} for + 42 (111010) + 44 1 47 {dup 15 add 6 tobin} for + lnumeric (000) + liso646 (00100) + >> def + + /iso646 << + 48 1 57 {dup 43 sub 5 tobin} for + fnc1 (01111) + 65 1 90 {dup 1 sub 7 tobin} for + 97 1 122 {dup 7 sub 7 tobin} for + 33 (11101000) + 34 (11101001) + 37 1 47 {dup 197 add 8 tobin} for + 58 1 63 {dup 187 add 8 tobin} for + 95 (11111011) + 32 (11111100) + lnumeric (000) + lalphanumeric (00100) + >> def + + method (10) eq { % TODO: fixme + ais 0 get (11) eq ais 0 get (17) eq or { + aival ais 0 get get + dup 0 2 getinterval cvi 384 mul exch + dup 2 2 getinterval cvi 1 sub 32 mul exch + 4 2 getinterval cvi add add + (0000000000000000) 16 string copy dup 3 -1 roll 2 16 string cvrs + dup length 16 exch sub exch putinterval + [ 1 0 + 4 -1 roll {48 sub} forall + ais 0 get (11) eq {0} {1} ifelse + ] /cdf exch def + /ais ais 1 ais length 1 sub getinterval def + } { + /cdf [ 1 0 1 1 ] def + } ifelse + ais length 0 ne { + ais 0 get (10) eq { + /gpf [ aival (10) get {} forall ] def + ais length 1 gt {/gpf [ gpf aload pop fnc1 ] def} if % TODO: check + /ais ais 1 ais length 1 sub getinterval def + } { + /gpf [fnc1] def % TODO: check + } ifelse + } { + /cdf [ cdf aload pop 0 0 0 0 0 1 1 1 1 ] def + /gpf [] def + } ifelse + /mode (numeric) def + } if + + method (11) eq { + /cdf [ 1 1 ] def + /ai90 aival (90) get def + npre 1 add ai90 length ne { + ai90 npre 1 add ai90 length npre sub 1 sub getinterval + } { + () + } ifelse + /ai90rem exch def + /nalpha 0 ai90rem {dup 65 ge exch 90 le and {1 add} if} forall def + /nnums 0 ai90rem {dup 48 ge exch 57 le and {1 add} if} forall def + /mode nalpha nnums gt {(alpha)} {(numeric)} ifelse def + nalpha nnums add ai90rem length ne {/mode (alphanumeric) def} if + /cdf [ + cdf aload pop + mode (alphanumeric) eq {0} if + mode (numeric) eq {1 0} if + mode (alpha) eq {1 1} if + ] def + /ais1 ais length 1 gt {ais 1 get} {-1} ifelse def + ais1 (21) eq ais1 (8004) eq or { + /cdf [ cdf aload pop ais1 (21) eq {1 0} {1 1} ifelse ] def + } { + /cdf [ cdf aload pop 0 ] def + } ifelse + /nval npre 0 ne {ai90 0 npre getinterval cvi} {0} ifelse def + (BDHIJKLNPQRSTVXZ) ai90 npre 1 getinterval search { + length exch pop exch pop + /aval exch def + } { + pop /aval -1 def + } ifelse + nval 31 lt aval -1 ne and { + (00000) 5 string copy dup nval 2 5 string cvrs + dup length 5 exch sub exch putinterval + [ exch {48 sub} forall ] /nbits exch def + (0000) 4 string copy dup aval 2 4 string cvrs + dup length 4 exch sub exch putinterval + [ exch {48 sub} forall ] /abits exch def + /cdf [ + cdf aload pop + nbits aload pop + abits aload pop + ] def + } { + (0000000000) 10 string copy dup nval 2 10 string cvrs + dup length 10 exch sub exch putinterval + [ exch {48 sub} forall ] /nbits exch def + (00000) 5 string copy dup ai90 npre get 65 sub 2 5 string cvrs + dup length 5 exch sub exch putinterval + [ exch {48 sub} forall ] /abits exch def + /cdf [ + cdf aload pop + 1 1 1 1 1 + nbits aload pop + abits aload pop + ] def + } ifelse + mode (numeric) eq { + /gpf [ ai90rem {} forall ais length 1 gt {fnc1} if ] def + } { + /encs mode (alpha) eq {alpha} {alphanumeric} ifelse def + /in [ ai90rem {} forall ais length 1 gt {fnc1} if ] def + /out in length 6 mul array def + /j 0 def + 0 1 in length 1 sub { + in exch get encs exch get + dup [ exch {48 sub} forall ] out exch j exch putinterval + length j add /j exch def + } for + /cdf [ + cdf aload pop + out 0 j getinterval aload pop + ] def + /gpf [] def + ais length 1 gt mode (alpha) ne or {/mode (numeric) def} if + } ifelse + /ais ais 1 ais length 1 sub getinterval def + ais length 0 ne { + ais1 (21) eq ais1 (8004) eq or { + /gpf [ + gpf aload pop + aival ais1 get {} forall + ] def + /ais ais 1 ais length 1 sub getinterval def + ais length 0 ne {/gpf [gpf aload pop fnc1] def} if + } if + } if + } if + + method (0) eq { + /cdf [ 0 ] def + /gpf [] def + /mode (numeric) def + } if + + % Pre-defined fixed length data field AIs + % any AI whose prefix is not included in this table must be + % terminated with "FNC1", even if it's fixed length + /aifixed 23 dict def + [ + 0 1 4 {} for + ] { + (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put + } forall + [ + 11 1 20 {} for + 23 + 31 1 36 {} for + 41 + ] { + 10 2 string cvrs dup aifixed 3 1 roll put + } forall + + % Append the remaining AI data + 0 1 ais length 1 sub { + /i exch def + /ai ais i get def + /val aival ai get def + gpf length ai length add val length add array + dup 0 gpf putinterval + dup gpf length ai [ exch {} forall ] putinterval + dup gpf length ai length add val [ exch {} forall ] putinterval + /gpf exch def + i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + gpf length 1 add array + dup 0 gpf putinterval + dup gpf length fnc1 put + /gpf exch def + } if + } for + + % Calculate the number of bits remaining to the next valid symbol size + /rembits { + /used exch def + ccversion (c) ne { % cc-a or cc-b + << + /a [ + [167 138 118 108 88 78 59] + [167 138 118 98 78] + [197 167 138 108 78] + ] + /b [ + [ 336 296 256 208 160 104 56] + [ 768 648 536 416 304 208 152 112 72 32] + [1184 1016 840 672 496 352 264 208 152 96 56] + ] + >> ccversion get cccolumns 2 sub get /bitcaps exch def + -1 bitcaps {dup used ge {exch} if pop} forall + dup -1 ne {used sub} if + } { + << /c -1 >> ccversion get pop % Assert cc-c + /m used 8 div ceiling cvi dup 6 idiv 5 mul exch 6 mod add def + m 40 le {8 } if + m 41 ge m 160 le and {16} if + m 161 ge m 320 le and {32} if + m 321 ge {64} if + /eccws exch def + /m m eccws add 3 add def + /c linwidth 52 sub 17 idiv def + m c idiv 90 gt {/c c 1 add def} if + /r m c div ceiling cvi def + /tgt c r mul eccws sub 3 sub dup 5 idiv 6 mul exch 5 mod add 8 mul def + used 8296 le {tgt used sub} {-1} ifelse + } ifelse + dup -1 eq { % Upgrade CC-A to CC-B or CC-B to CC-C to fit + pop + ccversion (a) eq { + /ccversion (b) def + } { + ccversion (b) eq lintype (gs1-128) eq and { + /ccversion (c) def + /cccolumns linwidth 52 sub 17 idiv def + } { + /ccversion -1 def + } ifelse + } ifelse + used rembits + } if + } bind def + + /encode { + dup /raw ne {exch get} {pop} ifelse + [ exch {48 sub} forall ] + dup length exch + gpfenc exch j exch putinterval + /j exch j add def + } bind def + + % Pre-compute alphanumeric and numeric runlengths and position of next ISO646-only characters + /numericruns [ gpf length {0} repeat 0 -1 ] def + /alphanumericruns [ gpf length {0} repeat 0 ] def + /nextiso646only [ gpf length {0} repeat 9999 ] def + gpf length 1 sub -1 0 { + /i exch def + gpf i get + (00) 2 string copy + dup 0 gpf i get dup fnc1 eq {pop 94} if put + i gpf length 1 sub lt {dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put} if + numeric exch known { + numericruns i numericruns i 2 add get 2 add put + } { + numericruns i 0 put + } ifelse + dup alphanumeric exch known { + alphanumericruns i alphanumericruns i 1 add get 1 add put + } { + alphanumericruns i 0 put + } ifelse + dup iso646 exch known exch alphanumeric exch known not and { + nextiso646only i 0 put + } { + nextiso646only i nextiso646only i 1 add get 1 add put + } ifelse + } for + + % Encode the general purpose field + /gpfenc 8296 array def + /i 0 def /j 0 def + { % loop + i gpf length eq {exit} if + { % not a loop but common exit point + + mode (numeric) eq { + i gpf length 2 sub le { + 2 string + dup 0 gpf i get dup fnc1 eq {pop 94} if put + dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put + dup numeric exch known { + numeric encode + /i i 2 add def + exit + } if + pop + lalphanumeric numeric encode + /mode (alphanumeric) def + exit + } { + gpf i get dup 48 lt exch 57 gt or { + lalphanumeric numeric encode + /mode (alphanumeric) def + exit + } if + /rem cdf length j add rembits def + rem 4 ge rem 6 le and { % C1 + 1 into 4 to 6 bits + (000000) 6 string copy 0 rem getinterval + dup gpf i get 47 sub 2 4 string cvrs + dup length 4 exch sub exch putinterval /raw encode + /i i 1 add def + exit + } { % C1.FNC1 + 2 string dup 0 gpf i get put dup 1 94 put numeric encode + /i i 1 add def + exit + } ifelse + } ifelse + } if + + mode (alphanumeric) eq { + gpf i get fnc1 eq { + fnc1 alphanumeric encode + /mode (numeric) def + /i i 1 add def + exit + } if + gpf i get dup iso646 exch known exch alphanumeric exch known not and { + liso646 alphanumeric encode + /mode (iso646) def + exit + } if + numericruns i get 6 ge { + lnumeric alphanumeric encode + /mode (numeric) def + exit + } if + numericruns i get dup 4 ge exch i add gpf length eq and { + lnumeric alphanumeric encode + /mode (numeric) def + exit + } if + gpf i get alphanumeric encode + /i i 1 add def + exit + } if + + mode (iso646) eq { + gpf i get fnc1 eq { + fnc1 iso646 encode + /mode (numeric) def + /i i 1 add def + exit + } if + numericruns i get 4 ge nextiso646only i get 10 ge and { + lnumeric iso646 encode + /mode (numeric) def + exit + } if + alphanumericruns i get 5 ge nextiso646only i get 10 ge and { + lalphanumeric iso646 encode + /mode (alphanumeric) def + exit + } if + gpf i get iso646 encode + /i i 1 add def + exit + } if + + } loop + } loop + /gpf gpfenc 0 j getinterval def + + % Create pad + /pad cdf length gpf length add rembits array def + pad length 0 gt { + 0 5 pad length 1 sub { % Fill with 00100 + /i exch def + pad i [ 0 0 1 0 0 ] 0 pad length i sub 5 2 copy gt {exch} if pop getinterval putinterval + } for + mode (numeric) eq { % Prefix shift from numeric to ASCII + /pad [ 0 0 0 0 pad aload pop ] 0 pad length getinterval def + } if + mode (alpha) eq { % Prefix FNC1 + /pad [ 1 1 1 1 1 pad aload pop ] 0 pad length getinterval def + } if + } if + + % Concatinate fields + /bits [ + cdf aload pop + gpf aload pop + pad aload pop + ] def + + ccversion (a) eq { + /pwr928 [ + [ 0 0 0 0 0 0 1 ] + 68 {7 array} repeat + ] def + 1 1 68 { + /j exch def + /v 0 def + 6 -1 1 { + /i exch def + /v pwr928 j 1 sub get i get 2 mul v 928 idiv add def + pwr928 j get i v 928 mod put + } for + pwr928 j get 0 pwr928 j 1 sub get 0 get 2 mul v 928 idiv add put + } for + /cws [ 28 {0} repeat ] def + /b 0 def /c 0 def + { % loop + b bits length eq {exit} if + /bs bits b 69 bits length b sub 2 copy gt {exch} if pop getinterval def + /bsl bs length def + /cs cws c bsl 10 idiv 1 add getinterval def + /csl cs length def + 0 1 bsl 1 sub { + /i exch def + 0 1 csl 1 sub { + /j exch def + cs j 2 copy get + pwr928 i get j 7 add csl sub get + bs bsl i sub 1 sub get + mul add put + } for + } for + csl 1 sub -1 1 { + /i exch def + cs i 1 sub 2 copy get cs i get 928 idiv add put + cs i 2 copy get 928 mod put + } for + /b b bsl add def + /c c csl add def + } loop + /cws cws 0 c getinterval def + /barcode cws length 4 mul string def + 0 1 cws length 1 sub { + /i exch def + (^ ) 4 string copy dup cws i get 10 4 string cvrs + dup length 4 exch sub exch putinterval + barcode i 4 mul 3 -1 roll putinterval + } for + options (dontdraw) true put + options (cca) true put + options (columns) cccolumns put + /args barcode options //micropdf417 exec def + } if + + ccversion (b) eq { + /barcode bits length 8 idiv string def + 0 1 barcode length 1 sub { + /i exch def + bits i 8 mul 8 getinterval 0 exch {add 2 mul} forall 2 idiv + barcode exch i exch put + } for + options (dontdraw) true put + options (ccb) true put + options (columns) cccolumns put + /args barcode options //micropdf417 exec def + } if + + ccversion (c) eq { + /barcode bits length 8 idiv string def + 0 1 barcode length 1 sub { + /i exch def + bits i 8 mul 8 getinterval 0 exch {add 2 mul} forall 2 idiv + barcode exch i exch put + } for + options (dontdraw) true put + options (ccc) true put + options (columns) cccolumns put + /args barcode options //pdf417 exec def + } if + + args + dontdraw not //renmatrix if + + end + +} bind def +/gs1-cc dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER gs1-cc-- @@ -6366,30 +19184,80 @@ H\pKT_F(KH4@:O(eDJ+B\;u~> % --EXAM: 2112345678900|(99)1234-abcd % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp ean13composite 0.0 0 0 0 -%%BeginData: 22 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\\ /Rr:R3 %o Di/n8f PFC -fK5H"(o:FDl%L@W uO*E0 Aq< G`k $ >Eb 0-) Bl7 KjEfrC 8F _`U>D_ ?-C -EcQG7F`MSBDD#CB BlJ$S g6- ]D3 %o ;` DJ` g(E bTc]3% oD i/n8fP FCf -K5H"(o:FDl%L@Wu O*E0 Aq< G` iL hAR TI2 1Lk ??E, -Tf3FCffT'Tt>:%5 2X=F D 5Z 2F -8_ M1G <3GE as#uA -Wf6?1G<9WDKKE0@ DP!5%OP!5$bI =%,/FE 2M8 Ou%N L! IU&i HS9 2LDIm6sP!5 $bP'&EfDf'H -V5*@^MH]iN"P#[Z ?DfBf 4Df0W V#Ae* lFE qh:NWj!&DD FD5Z2F"]1X@;[eUP!:TQEb0-)Bl7KjEfrYCs+j4/L-.ROEb0,A061WAD..O,Bm;:MBm=\ -A>DN98!Jk$.L]DjdK89Pa!/LZ3!/Op-L]DjdK89M`!Jg`3!Jk$.L]DjdK89Pa!*q6sBm=lY@4u -S6G^5)I05+p2B4uCC#)Gg52D98gA9;L@@>II;2D8ufF\/Rr:R5;+[1ASu?nFE2)?P!>+(Ou[rR%[&V$ARTI21Lk??E -,Tf3FCgUpP%64gCG'+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYu -CM@[!P.H"'F`V,9E+*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/ean13composite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ean13composite 0.0 2015050900 84039 84015 +%%BeginData: 72 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /ean13 dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/ean13composite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (ean13) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //ean13 exec //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 93 {0} repeat 1 0 + 1 0 93 {0} repeat 0 1 + 0 1 93 {0} repeat 1 0 + ] + /pixx 97 + /pixy 3 + /height 6 72 div + /width 97 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/ean13composite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ean13composite-- @@ -6400,30 +19268,83 @@ CM@[!P.H"'F`V,9E+*6lBl7R3P#M~> % --EXAM: 02345673|(21)A12345678 % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp ean8composite 0.0 0 0 0 -%%BeginData: 22 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ B6 ,dZ @q1Z]0 6M %_@rEu AAT -Dg:@Wc^5Df.1:GA 2#8P1 l(D OuP + 8AS ue#06 M% _@rEuA ATD -g:@Wc^5Df.1:GA2 #8P1 l(D Op s' U@; \&7 Df' H3F( -o`-H\`B!23JD%Df Bf4D f 0W Z5 *@] T@U X:eD e*FB5 -*@]TA8c@-A9)+&+ D,%uF( LLj D fBf 4D f0WZ Y:j s=EbTE(FEq h:P!+/J!Ko= -'%<$3-Bl@m1H]kF A@;L!r P!+ / T5^e epOu SV6 P,4DN9 -8!Jj$gL]DjdK89Pa!/LZ3!/NpfL]DjdK89M`!Jg`3!Jj$gL]DjdK89Pa!*q6sBm=lY75&UoG^5 -)I05+p2B4uCC#)Gg52D98gA9;L@7>OKt2D8ufF30",\Bm=lc98H$"5*Dn$#*O]o061WAD..O,Bm>e*P"h*"I?G)'1 -G<D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgG -OuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/ean8composite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp ean8composite 0.0 2015050900 84340 84317 +%%BeginData: 75 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /ean8 dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/ean8composite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + % Get the result of encoding with ean8 and gs1-cc + options (lintype) (ean8) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //ean8 exec //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 65 {0} repeat 1 0 + 1 0 65 {0} repeat 0 1 + 0 1 65 {0} repeat 1 0 + ] + /pixx 69 + /pixy 3 + /height 6 72 div + /width 69 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + comp options //gs1-cc exec + dup (pixx) get 69 exch sub 6 rmoveto + //renmatrix exec + + grestore + + end + +} bind def +/ean8composite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER ean8composite-- @@ -6434,30 +19355,80 @@ OuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> % --EXAM: 416000336108|(99)1234-abcd % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp upcacomposite 0.0 0 0 0 -%%BeginData: 22 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\3 %oDi/ n8fP -FCfK5H"(o:FDl%L @WuO* E0A q B6 ,dZ @q1Z]0 6M %_@rEu AAT -Dg:@Wc^5Df.1:GA 2#8P1 l(D OuP + 8AS ue#06 M% _@rEuA ATD -g:@Wc^5Df.1:GA2 #8P1 l(D Op s' eE+ <!BkM+$L^&Z+Ou=t;Bk2=!Lgc*1Ou=t3E-*4@E-,f4DK?pa4teR0ASu?nFE2)?P!=d%L -^'#s@rH4'+E)4@Bl@m10/$sZ0eHmFP!:TQEb0-*@ -% uk.co.terryburton.bwipp/upcacomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp upcacomposite 0.0 2015050900 84017 84082 +%%BeginData: 72 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /upca dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/upcacomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (ean13) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //upca exec //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 93 {0} repeat 1 0 + 1 0 93 {0} repeat 0 1 + 0 1 93 {0} repeat 1 0 + ] + /pixx 97 + /pixy 3 + /height 6 72 div + /width 97 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/upcacomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER upcacomposite-- @@ -6468,32 +19439,95 @@ FCgUpP%64gCG'+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[ % --EXAM: 00123457|(15)021231 % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp upcecomposite 0.0 0 0 0 -%%BeginData: 24 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ B6 ,dZ @q1Z]0 6M %_@rEu AAT -Dg:@Wc^5Df.1:GA 2#8P1 l(D OuP + 8AS ue#06 M% _@rEuA ATD -g:@Wc^5Df.1:GA2 #8P1 l(D Op s' eE+ Eb0, A061W AD. .O,Bm;:MBm =\A>DN98!Ji -IWL]DjdK89Pa!/L Z3!/N@V L]DjdK 89M`! Jg` 3!JiIWL]Dj dK89Pa!*q6s -Bm=lY2(ro_G^5)I05+p2B4uCC#)Gg52D98gA9;L@22Fed2D8ufFq81_dDD*Y`AS -u?nFE2)?05tWMF!+\C!/LZ30me]VI?K5=!Jg`3!Jg`30me]VI?K5=!/LZ3!/LZ30me]VI?K5=! -Jg_]05tWMG_e41E+sQBL]];DASGdjFGL-W8.=E$0(e*P"h*"I?G) -'1GD_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qC -gGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/upcecomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp upcecomposite 0.0 2015050900 88475 84857 +%%BeginData: 87 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /upce dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/upcecomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + % Define the separator + /sep << + /ren //renmatrix + /pixs [ + 0 1 49 {0} repeat 1 0 + 1 0 49 {0} repeat 0 1 + 0 1 49 {0} repeat 1 0 + ] + /pixx 53 + /pixy 3 + /height 6 72 div + /width 53 72 div + /opt options + >> def + + gsave + + options (lintype) (upce) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //upce exec //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 49 {0} repeat 1 0 + 1 0 49 {0} repeat 0 1 + 0 1 49 {0} repeat 1 0 + ] + /pixx 53 + /pixy 3 + /height 6 72 div + /width 53 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/upcecomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER upcecomposite-- @@ -6504,38 +19538,108 @@ gGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> % --EXAM: (01)03612345678904|(11)990102 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databaromnicomposite 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <-:'D J>7n -06M%_@rEuAATDg: @Wc^5 Df. 1:G A2#8 P1 l(D OuP+-F "o 7VA!/f )F_ -`U>D_?-CEcQG7F` MSBDD #CB BlJ $ Sg6 -]D 3%o ;`DJX$ )A RTVB3% oDi -/n8fPFCfK5H"(o: FDl%L @Wu O*E 0A q< G`k $>E b0-*@< ?O (G`k$> F_` -U>D_?-CEcQG7F`M SBDD #CB Bl J$ Sg6 -]D %52 7#FC -AWeEc5f4Bk)'uE, Tf3F C ff T' Tt> :%5 2X=F D5Z2F --8_M1G<3GEas#uA Wf6?1G <9W D KKE 0@ DP! 5%O P!5$ bI=% ,/F E2M8Ou%NL< IL$AOrfcH05 -kfOBl@m1P!5$bI? IQJE- ,f4D KC/f1 OYEX @UX :eDe*F>!IU &iHS92LDIm6 -sP!5$bP'&EfDf'H V5*@^ MH]iN "P#[Z ?Df Bf4Df0WV#A e*lFEqh:NXK -B+FCAWeEc5f4Bp* ^ZE-,f4 DKCgCC h[d&@ :s. nEckrVG].P CBl@m1NX9E; -CNFH8ART,0!AK[]DfBf4Df0WV#\7jkFC]E#GB@kJAWh:SBl7KjEZf:>FD5Z2F"]1W@<>pe@<-: -'DJ>7uOuSI(F(03R9.t*qDKB9.P!5$bOuSI(@VBhG98ES298H-%CbKU=DJ3TqB4uCM5*@]T061 -WACh[cu@<.Mq06:]DAnc-nATE,NAoNnsOu$]hL]M+,L^]FIHS9)r5*@^2Dfd+9P"UT2P!+/$Df -d+9L]N[B!Jh/2OuQohFHSh" -E0:6b99MJN1Qjqb99MH$"FZG(HZNb;+D,R8>DN98!/LW2!/LW2!/LW2!/LW2!/LZ3!/LV\P'MJ -=<.0o>Ou$r`EbgI2Ch[d.@WQmP!KpQ@!KoTmH\_ZMI=$^!KoX0WI9q$?'7!bAT3G*>DN98!/LV\P'M+[E$045E0=[d"H -o`gL]E52L]E52?'9Jh&p%W'Anc-nATESlF(K<&Bl7HmEej^3Bl7TqBkM+$P(l(]061WA0/%?WD -J`g(EbTbOE+sQ<+EM+505tWMGT_'=E0=Z`E+sQBL]K/BASGdjFGKsR8.=E$0(e*P"h*"I?G)'1G<9IFCAWeEc5f4Bk)'uE,Tf3FCgUpP%64gCG'+8/p(ZFEd; -,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P# -M~> -% uk.co.terryburton.bwipp/databaromnicomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databaromnicomposite 0.0 2015050900 83884 87420 +%%BeginData: 100 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databaromni dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databaromnicomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databaromni) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databaromni exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def + //renlinear exec + + % Plot the separator + /sepfinder { + /fp exch def + fp 1 fp 12 add { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + /f3 [1 1 1 1 1 1 1 1 1 0 1 1 1] def + true 0 1 12 {dup bot exch fp add get exch f3 exch get eq and} for { + % Right shifted module for value 3 finder + sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval + } if + } bind def + mark + 0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall + counttomark 1 sub array astore /bot exch def pop pop + /sep [ bot {1 exch sub} forall ] def + sep 0 [0 0 0] putinterval + sep sep length 4 sub [0 0 0 0] putinterval + 18 sepfinder 64 sepfinder + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -5 1 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/databaromnicomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databaromnicomposite-- @@ -6546,36 +19650,104 @@ M~> % --EXAM: (01)03412345678900|(17)010200 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstackedcomposite 0.0 0 0 0 -%%BeginData: 28 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <-F2@ :O(a -AD_?-C EcQG7 F`M SBD D#CB Bl J$S g6-]D3 %n oc0eHm FOu -P+;CG'+8/p(ZFEd ;,:Ec c5; /n0 $ =E, ^uo P'E -L061W AD ..O,Bm >e# -06M%_@rEuAATDg: @Wc^5 Df. 1:G A2 #8 P1l (DO ps'T@< >p e@<-F2 @:O -(aA7KOpE,Tf3FCf fT'T t>: %5 2X =FD 5Z2 F-8 _M1G -<3GEas#uAWf6?1G <9WD K KE 0@ DP! 5%O P!5$bI=%,/ FE2M8Ou%NL< -IL$AOrfcH05kfOB l@m1P! 5$b I?IQ JE-, f4D KC/f1OYEX@ UX:eDe*F>!I -U&iHS92LDIm6sP! 5$bP' &EfD f'HV5 *@^M H]i N"P#[Z?DfB f4Df0WV#Ae* -lFEqh:NXfT.FCAW eEcZ> 2@r#X dP'Cn aFD 5Z2F,gKABl 7]pB4Z1*F_- -_\DfBf4Df0WV$#+ 9mF)Z/2 @:YB!0 Tp[!E -,f 4DKCgDA8c@ -A9)+&FE2M8 -P'CeWDIm6s+E)4@Bl@m10/$jEFCAWeEcZ>2@r#XdP!>*hNWa<8G]T$@L]E54P$!_IE+sQAP"Us -304JjAP!5$bOuSI)E+sQBP"RHEBl7TqBkM+$P!5$b0/%?WDJ`g(EbTc]5;.(hE+Wg%A7]e.04o -0d5*@^6E/4O,E/4pc!IHJ6P!5$b@W-?2Bp),F!0TKl@W-?2BnueQWKKo1!KoTmL]MpNF(K;5Bn -ueQWKKo1!0TKlL]MpNL]DjdDN<9!Jgc4!Jgc4! -Jgc4!Jgc4!/LZ3!Jgb^Ou%3#F_-@/L]N;?H]g?tDfh.+AoNn6P"Us%Ai#T6P"Us$Op$2r8:,Dh -E$/b3+BsX%L]E52L]E52L]E52L]E52L]E53L]E52?'9J]P#Qjm%[&V$F(K;5>9IBnFF/fEP!5& -.I?I0-Ou%/jE/4KuL]E52L]E52?'9JSAT/c5AT3fAL]im?>DN98!/LW2!*tb5L_=c?E+Wg%A7] -e;!,Q@eBOtmjBQTDl4?P9;ASs.SEb0-*@r! -Kr1IDf'G9DfBf4Df0VL05#>\/Rr:R5;+[1ASu?nFE2)?P!>+(Ou[rR%[&V$A79Rg@UX:uFCAZp -ARo:hD/aE7BlmpL30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1 -:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/databarstackedcomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarstackedcomposite 0.0 2015050900 89818 86093 +%%BeginData: 96 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databarstacked dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databarstackedcomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databarstacked) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databarstacked exec + dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def + dup (pixy) get /linheight exch def + //renmatrix exec + + % Plot the separator + /sepfinder { + /fp exch def + fp 1 fp 12 add { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + /f3 [1 1 1 1 1 1 1 1 1 0 1 1 1] def + true 0 1 12 {dup bot exch fp add get exch f3 exch get eq and} for { + % Right shifted module for value 3 finder + sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval + } if + } bind def + /sep [ bot {1 exch sub} forall ] def + sep 0 [ 0 0 0 0 ] putinterval + sep sep length 4 sub [ 0 0 0 0 ] putinterval + 18 sepfinder + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/databarstackedcomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarstackedcomposite-- @@ -6586,36 +19758,104 @@ ARo:hD/aE7BlmpL30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1 % --EXAM: (01)03612345678904|(11)990102 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstackedomnicomposite 0.0 0 0 0 -%%BeginData: 28 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <-F2@ :O(a -A8c=&Bp(G/F_`U> D_?-C EcQ G7F `MSB DD #CB BlJ$Sg 6- ]D3%no c0e -HmFOuP+;CG'+8/p (ZFEd ;,: Ecc 5 ;/n 0$= E,^ uoP'E- L0 61WAD. .O, -Bm>e#06M%_@rEuA ATDg: @Wc ^5D f. 1: GA2 #8P 1l(DOp s' T@<>pe @<- -F2@:O(aA8c=&Bk) 'uE, Tf3 FC ff T'T t>: %52 X=FD -5Z2F-8_M1G<3GEa s#uA W f6 ?1 G<9 WDK KE0@ DP!5%O P!5$bI=%,/F -E2M8Ou%NL!IU&iHS 92LDI m6sP !5$bP '&Ef Df' HV5*@^MH]i N"P#[Z?DfBf -4Df0WV#Ae*lFEqh :NY5l 2FCAW eEcZ> 2@r #XdDf'B+P' CnaFD5Z2F,g -KABl7]pB4Z1*F_- _\DfBf4 Df0WV$ #+9mF )Z/ 2@:YB!0Tp[ !E-,f4DKCgD -A8c@-A9)+&FE2M8P'CeWDIm6s+E)4@Bl@m10/$jEFCAWeEcZ>2@r#XdDf'B+P!>*hNWa<8G]T$ -@L]E54P$!_IE+sQAP"Us304JjAP!5$bOuSI)E+sQBP"RHEBl7TqBkM+$P!5$b0/%?WDJ`g(EbT -c]5;.(hE+Wg%A7]e.04o0d5*@^6E/4O,E/4pc!IHJ6P!5$b@W-?2Bp),F!0TKl@W-?2BnueQWK -Ko1!KoTmL]MpNF(K;5BnueQWKKo1!0TKlL]MpNL]DjdDN<9!Jgc4!Jgc4!Jgc4!Jgc4!/LZ3!Jgb^Ou%3#F_-@/L]N;?H]g?tDfh.+AoNn6P"Us% -Ai#T6P"Us$Op$2r8:,DhE$/b3+BsX%L]E52L]E52L]E52L]E52L]E53L]E52?'9J]P#Qjm%[&V -$F(K;5>9IBnFF/fEP!5&.I?I0-Ou%/jE/4KuL]E52L]C_DH#mP9+EM+5P%'4MP,VZA!/LW2!/L -V\P'MirF(K<&Bl7HmEej^3Bl7TqBkM+$P(l(]061WA0/%?WDJ`g(EbTbOE+sQ<+EM+505tWMGT -_'=E0=Z`E+sQBL]K/BASGdjFGKsR8L1>.=E$0(e*P"h*"I?G)' -1G<9IFCAWeEcZ>2@r#XdDf'B+@rH4'Df]W7AWf$9A1r(@/n8fPFCfK5H"(o:FDl%L@WuO*E$/\ -&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH4@:O(eDJ+B\;u~> -% uk.co.terryburton.bwipp/databarstackedomnicomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarstackedomnicomposite 0.0 2015050900 89894 86165 +%%BeginData: 96 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databarstackedomni dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databarstackedomnicomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databarstackedomni) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databarstackedomni exec + dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def + dup (pixy) get /linheight exch def + //renmatrix exec + + % Plot the separator + /sepfinder { + /fp exch def + fp 1 fp 12 add { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + /f3 [1 1 1 1 1 1 1 1 1 0 1 1 1] def + true 0 1 12 {dup bot exch fp add get exch f3 exch get eq and} for { + % Right shifted module for value 3 finder + sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval + } if + } bind def + /sep [ bot {1 exch sub} forall ] def + sep 0 [ 0 0 0 ] putinterval + sep sep length 4 sub [ 0 0 0 0 ] putinterval + 18 sepfinder + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/databarstackedomnicomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarstackedomnicomposite-- @@ -6626,38 +19866,108 @@ b0-*@L1>.=E$0(e*P"h*"I?G)' % --EXAM: (01)03612345678904|(11)990102 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databartruncatedcomposite 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <-I1F `(\t -FCf!G3%oDi/n8fP FCfK5 H"( o:F Dl%L @W uO* E0AqB6,d Z@q -1Z]06M%_@rEuAAT Dg:@W c^5 Df. 1 :GA 2#8 P1l (DOuP+ 8A Su -e#06M%_@rEuAATD g:@W c^5 Df .1 :GA 2#8 P1l (DOp -s'T@<>pe@<-I1F` (\tF C eu mD f'H 3F( o`-H \`B!2 -3JD%DfBf4Df0WZ5 *@]T@U X:e D e*F B5 *@]T A8c @-A9)+&+D, %uF(LLjDfBf -4Df0WZY:js=EbTE (FEqh: P!+ / J!Ko ='%< $3- Bl@m1H]kFA @;L!rP!+/T5 -^eepOuSV6P,4EDI[*sARprgOuSI(F(03R9.t*qDKB9.P!5$bOuSI(@VBhG98ES298H --%CbKU=DJ3TqB4uCM5*@]T061WACh[cu@<.Mq06:]DAnc-nATE,NAoNnsOu$]hL]M+,L^]FIHS -9)r5*@^2Dfd+9P"UT2P!+/$Dfd+9L]N[B!Jh/2OuQohFHSh"E0:6b99MJN1Qjqb99MH$"FZG(HZNb;+D,R8>DN98!/LW2!/LW -2!/LW2!/LW2!/LZ3!/LV\P'MJ=<.0o>Ou$r`EbgI2Ch[d.@WQmP!KpQ@!KoTmH\_ZMI=$^!KoX0WI9q$?'7!bAT3G*>D -N98!/LV\P'M+[E$045E0=[d"Ho`gL]E52L]E52?'9Jh&p%W'Anc-nATESlF(K<&Bl7HmEej^3B -l7TqBkM+$P(l(]061WA0/%?WDJ`g(EbTbOE+sQ<+EM+505tWMGT_'=E0=Z`E+sQBL]K/BASGdj -FGKsR8. -=E$0(e*P"h*"I?G)'1G<9IFCAWeEcc>EDI[*sARo -:hD/aE7BlmpL30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:AT -Vm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/databartruncatedcomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databartruncatedcomposite 0.0 2015050900 90784 87051 +%%BeginData: 100 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databartruncated dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databartruncatedcomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databartruncated) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databartruncated exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def + //renlinear exec + + % Plot the separator + /sepfinder { + /fp exch def + fp 1 fp 12 add { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + /f3 [1 1 1 1 1 1 1 1 1 0 1 1 1] def + true 0 1 12 {dup bot exch fp add get exch f3 exch get eq and} for { + % Right shifted module for value 3 finder + sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval + } if + } bind def + mark + 0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall + counttomark 1 sub array astore /bot exch def pop pop + /sep [ bot {1 exch sub} forall ] def + sep 0 [0 0 0] putinterval + sep sep length 4 sub [0 0 0 0] putinterval + 18 sepfinder 64 sepfinder + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -5 1 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/databartruncatedcomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databartruncatedcomposite-- @@ -6668,33 +19978,87 @@ Vm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> % --EXAM: (01)03512345678907|(21)abcdefghijklmnopqrstuv % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarlimitedcomposite 0.0 0 0 0 -%%BeginData: 25 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <-0uD /"*' -AD_?-C EcQG7 F`M SBD D#CB Bl J$S g6-]D3 %n oc0eHm FOu -P+;CG'+8/p(ZFEd ;,:Ec c5; /n0 $ =E, ^uo P'E -L061W AC h[cu@< .Mj -06M%_@rEuAATDg: @Wc^5 Df. 1:G A2 #8 P1l (DO uP+8AS u? nFE2)? OuP -+;CG'+8/p(ZFEd; ,:Ec c5; /n 0$ =E, ^uo P'E -!04 -\L5@:EYcCh[a#FC eumD f 'H 3F (o` -H\ `B!2 3JD%D -fBf4Df0WZ5*@]T@ UX:eDe *FB 5 *@] TA 8c@- A9) +&+D,%uF(L LjDfBf4Df0W -ZY:js=EbTE(FEqh :P!+/J !Ko = '%<$ 3-Bl @m1 H]kFA@;L!r P!+/T5^eepO -uSV6P,4A79Rg@UX :nBl.R+ ARpsKD fBf4D f0W V#Ae*lCLLj eFE2M8P'Cna -FD5Z2F,gQ@DJO<4Eb/ZiNWChsG].PCBl@m1NX006DKKE0@1_dDD*Y`ASu?nFE2)?05tWMF!,O8E%c0EG^(?PAT3fA05tWM -H&)JSBOtmjBQT%2Le*[e06_,@FD)ee -*@rH4'+E)4@Bl@m10/$sZ0eHmFP!>*hNWa<8G^,BELe*[mP,X6 -% uk.co.terryburton.bwipp/databarlimitedcomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarlimitedcomposite 0.0 2015050900 80661 80522 +%%BeginData: 79 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databarlimited dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databarlimitedcomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databarlimited) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databarlimited exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def + //renlinear exec + + % Plot the separator + mark + 1 linsbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall + counttomark 1 sub array astore /sep exch def pop pop + sep 0 [0 0 0] putinterval + sep sep length 4 sub [0 0 0 0] putinterval + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + comp options //gs1-cc exec + dup (pixx) get 72 exch sub 1 rmoveto + //renmatrix exec + + grestore + + end + +} bind def +/databarlimitedcomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarlimitedcomposite-- @@ -6705,36 +20069,106 @@ o%qBl7L&ATMd4Ear[DFcna % --EXAM: (01)93712345678904(3103)001234|(91)1A2B3C4D5E % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarexpandedcomposite 0.0 0 0 0 -%%BeginData: 28 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <,q(E +*Wp -ARpr`06M%_@rEuA ATDg: @Wc ^5D f.1: GA 2#8 P1l(DO uP +-F"o7 VA! -/f)F_`U>D_?-CEc QG7F` MSB DD# C BBl J$S g6- ]D3%o; `D JX$)AR TVB -3%oDi/n8fPFCfK5 H"(o: FDl %L@ Wu O* E0A qEb 0- *@F_`U>D_?-CEcQ G7F` MSB DD #C BBl J$S g6- ]D%5 -27#FCAWeEb0K7@; ]UeA 7 KO pE ,Tf 3FC ffT' Tt>:% -52X=FD5Z2F-8_M1 G<3GEa s#u A Wf6 ?1 G<9W DKK E0@ DP!5 %OP !5$bI=%,/F E2M8Ou%NL!IU& -iHS92LDIm6sP!5$ bP'&E fDf'H V5*@^ MH] iN"P#[Z?Df Bf4Df0WV#Ae -*lFEqh:NXoZ/FCA WeEb0K7 @;]UeA FD5Z -2F"]1W@<>pe@<,q(E+*WpARprgOuSI(F(03R9.t*qDKB9.P!5$bOuSI(@VBhG98ES298H-%CbK -U=DJ3TqB4uCM5*@]T061WACh[cu@<.Mq06:]DAnc-nATE,NAoNnsOu$]hL]M+,L^]FIHS9)r5* -@^2Dfd+9P"UT2P!+/$Dfd+9L]N[PD^Dfh -.OL^fNHH[V&J?$d]8AT26qDId=!I?I0X!,Q@eBOtmjBQTDl4?P9;ASs.SEb0-*@r!Kr1IDf'G9DfBf4Df0VL05#>\/Rr:R5;+[1ASu?nFE2)? -P!>+(Ou[rR%[&V$A79Rg@UX:gG]7)/A7]:]Df'H3F(o`-OuSV806M%_@rEuAATDg:@Wc^5Df.1 -:GA2#8+Co%qBl7L&ATMd4Ear[DFcna -% uk.co.terryburton.bwipp/databarexpandedcomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarexpandedcomposite 0.0 2015050900 86979 83324 +%%BeginData: 98 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databarexpanded dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databarexpandedcomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databarexpanded) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databarexpanded exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def + //renlinear exec + + % Plot the separator + /sepfinder { + /fp exch def + fp 1 fp 12 add { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + } bind def + mark + 0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall + counttomark 1 sub array astore /bot exch def pop pop + /sep [ bot {1 exch sub} forall ] def + sep 0 [0 0 0] putinterval + sep sep length 4 sub [0 0 0 0] putinterval + [ % Finder pattern module positions + 18 98 bot length 13 sub {} for + 69 98 bot length 13 sub {} for + ] {sepfinder} forall + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/databarexpandedcomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarexpandedcomposite-- @@ -6745,36 +20179,103 @@ P!>+(Ou[rR%[&V$A79Rg@UX:gG]7)/A7]:]Df'H3F(o`-OuSV806M%_@rEuAATDg:@Wc^5Df.1 % --EXAM: (01)00012345678905(10)ABCDEF|(21)12345678 % --EXOP: segments=4 % --RNDR: renmatrix renlinear -%%BeginResource: uk.co.terryburton.bwipp databarexpandedstackedcomposite 0.0 0 0 0 -%%BeginData: 28 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ pe@ <,q(E +*Wp -ARok(@:O(aA D_? -CE cQG7 F` MSB DD#CBB lJ $Sg6-] D3% -noc0eHmFOuP+;CG '+8/p (ZF Ed; , :Ec c5; /n0 $=E,^u oP 'E-L06 1WA -D..O,Bm>e#06M%_ @rEuA ATD g:@ Wc ^5 Df. 1:G A2#8P1 l( DOps'T @<> -pe@<,q(E+*WpARo k(@: O(a A7 KO pE, Tf3 FCf fT'T -t>:%52X=FD5Z2F- 8_M1 G <3 GE as# uAW f6?1 G<9WD -KKE0@DP!5%OP -!5$bI=%,/FE2M8O u%NL!I U&iH S92LD Im6s P!5 $bP'&EfDf' HV5*@^MH]iN -"P#[Z?DfBf4Df0W V#Ae* lFEqh :NYZ/ 6FC AWeEb0K7@; ]UeA92j$@r# -XdP'CnaFD5Z2F,g KABl7]p B4Z1*F _-_\D fBf 4Df0WV$#+9 mF)Z/2@:YB! -0Tp[!E-,f4DKCgDA8c@-A9)+&FE2M8P'CeWDIm6s+E)4@Bl@m10/$jEFCAWeEb0K7@;]UeA92j -$@r#XdP!>*hNWa<8G]T$@L]E54P$!_IE+sQAP"Us304JjAP!5$bOuSI)E+sQBP"RHEBl7TqBkM -+$P!5$b0/%?WDJ`g(EbTc]5;.(hE+Wg%A7]e.04o0d5*@^6E/4O,E/4pc!IHJ6P!5$b@W-?2Bp -),F!0TKl@W-?2BnueQWKKo1!KoTmL]MpNF(K;5BnueQWKKo1!0TKlL]MpNL]DjdDN98!/LW2!*tb5>DNrK@Ua7tP%'4VP,WeVP":BuLgjh3FHU*h%?d];I?I- -,HQ[B@E+Wg%A7]e0P"CH0Ch[d#ASGdjFHVA@4>1_dDD*Y`ASu?nFE2)?05tWMF!,O8E%c0EG^( -?PAT3fA05tWMH&)JSBOtmjBQT%2Le*[e06_,@FD)ee*@W-@E!0U!2!0TKlL]W!OL]Djd.=E$0(e*P"h*"I?G)'1G<9IFCAWeEb0K7@;]UeA92j$@r#Xd@rH4'Df]W7AWf$9A1r(@ -/n8fPFCfK5H"(o:FDl%L@WuO*E$/\&Anc-oEb0<1F`Lu'P')pJ06:]HE+*6lBl7RH\pKT_F(KH -4@:O(eDJ+B\;u~> -% uk.co.terryburton.bwipp/databarexpandedstackedcomposite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp databarexpandedstackedcomposite 0.0 2015050900 89645 89413 +%%BeginData: 95 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /databarexpandedstacked dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/databarexpandedstackedcomposite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (lintype) (databarexpandedstacked) put + options (linkage) true put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part + linear options //databarexpandedstacked exec + dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def + dup (pixy) get /linheight exch def + //renmatrix exec + + % Plot the separator + /sepfinder { + /fp exch def + fp 1 fp 12 add { + /i exch def + bot i get 0 eq { + bot i 1 sub get 1 eq { + 1 + } { + sep i 1 sub get 0 eq {1} {0} ifelse + } ifelse + } { + 0 + } ifelse + sep exch i exch put + } for + } bind def + /sep [ bot {1 exch sub} forall ] def + sep 0 [ 0 0 0 ] putinterval + sep sep length 4 sub [ 0 0 0 0 ] putinterval + [ % Finder pattern module positions + 19 98 bot length 13 sub {} for + 70 98 bot length 13 sub {} for + ] {sepfinder} forall + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + bot 0 get 0 eq {2} {0} ifelse 1 rmoveto + comp options //gs1-cc exec //renmatrix exec + + grestore + + end + +} bind def +/databarexpandedstackedcomposite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER databarexpandedstackedcomposite-- @@ -6785,38 +20286,108 @@ AT/c5AT3fAL]im?>DN98!/LW2!*tb5>DNrK@Ua7tP%'4VP,WeVP":BuLgjh3FHU*h%?d];I?I- % --EXAM: (00)030123456789012340|(02)13012345678909(37)24(10)1234567ABCDEFG % --EXOP: ccversion=c % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1-128composite 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\D_ -?-CEcQG7F`MSBDD #CBBl J$S g6- ] D3% o;` DJX $)ARTV B3 %oDi/n 8fP -FCfK5H"(o:FDl%L @WuO* E0A q Eb0 -*@ F_`U> D_? --CEcQG7F`MSBDD# CBBl J$S g6 -] D%5 2@8 0eG +83+ -HlDE,Tf3FCffT'T t>:% 5 2X =F D5Z 2F- 8_M1 G<3GE -as#uAWf6?1G<9WD KKE0@< Wi+ @ ;L! rO u%#q FD5 Z2F-<^[F*) G:DJ+':E+P1 -qH\_]c23JDeE-,f 4DKC/f X(G d VF(L LtH] gXB P#RT(P%'TN Othst4d(eHE -ckrV4aW>DP!5%OP !5$bI= %,/ FE2M 8Ou% NL< IL$AOrfcH0 5kfOBl@m1P! -5$bI?IQJE-,f4DK C/f1O YEX@ UX:eD e*F> !IU &iHS92LDIm 6sP!5$bP'&E -fDf'HV5*@^MH]iN "P#[Z ?DfBf 4Df0W V$# +9mF)Z/2@: YB!0Tp[!E-, -f4DKCgDA8c@-A9) +&FE2M8 P'CnaF D5Z2F ,gN BBl7]pB4YL nEckrVG\h)3 -ARTU%4?Oa)E-,f4DKC/QP"@i$0/$sZ0eG+830HLd"*7pmP"UT2P!45U!I^,&05P??GA1T0BTbQ -B1N.5SBl@m1NX'B7DKL/CAW@".F"o7$1,tGADfBf4Df0WV#]+3mGA1T0BP_C#GA1T0BTdUMDf' -G9DfBf4Df0VL05#>\/Rr:R5;-MbD/aQAD3@)G1Lk??E-$;ANWa<8G^,BELguT2H]A,8I=$tT@s -sM?05P??CNOi@AWf6?1MgcCCNOi@AW?e"P!+/1E-,f4DKCgDCh[d&@:s.[FE2M8P'CnaFD5Z2F -,gNBBl7]pB4YRb@;L!rP'DD%DfBf4Df0WV#]+3mCLLje@:iqaF(LMZDfBf4Df0WV#]+3mCLLje -@rua6AWh:dP#Z=4DIm6s+?Vb/DfBf4Df0WCI?I/c4teR%F"o7$1,tF]OuSI(F(03R9.t*qDKB9 -.P!5$bOuSI(@VBhG98ES298H-%CbKU=DJ3TqB4uCM5*@]T061WACh[cu@<.MqD..I#L]M=+DKB -9.H\_]c=GQs?4aVO3!I]BCH\_ZMI?ITnK7/nSOrK2XP,XTNOp`paAT3erOu&8DP')Q\Ch[d#AS -GdjFHVA@4>1_dDD*Y`ASu?nFE2)?05tWMF!,O8E%c0EG^(?PAT3fA05tWMH&)JSBOtmjBQT%2L -e*[e06_,@FD)ee*Ch[d&FEqh:NWERO -4aSi'+Dbb0GA1T0BSZ_QWJCqF;N`ghE$04X$'M9D!g6HE1Ge*P"h*"I?G -)'1G -% uk.co.terryburton.bwipp/gs1-128composite 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp gs1-128composite 0.0 2015050900 86884 89985 +%%BeginData: 100 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +2 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1-128 dup /uk.co.terryburton.bwipp findresource put +dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/gs1-128composite { + + 20 dict begin % Confine variables to local scope + + /options exch def + /barcode exch def + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Split the linear and composite parts + barcode (|) search { + /linear exch def + pop + /comp exch def + } { + pop + } ifelse + + gsave + + options (inkspread) (0) put + options (dontdraw) true put + + % Dummy plot of linear part with CC-A to get width + options (linkagea) true put + linear << options {} forall >> //gs1-128 exec + (sbs) get 0 exch {add} forall /linwidth exch def + + % Create 2D part and determine type + options (lintype) (gs1-128) put + options (linwidth) linwidth put + comp options //gs1-cc exec /compsym exch def + compsym (pixx) get 99 eq {(a)} {(c)} ifelse /linktype exch def + + % Plot linear part + linktype (a) eq { + options (linkagea) true put + options (linkagec) false put + } { + options (linkagea) false put + options (linkagec) true put + } ifelse + linear << options {} forall >> //gs1-128 exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def + //renlinear exec + + % Plot the separator + mark + 1 linsbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall + counttomark 1 sub array astore /sep exch def pop pop + 0 linheight rmoveto << + /ren //renmatrix + /pixs sep + /pixx sep length + /pixy 1 + /height 1 72 div + /width sep length 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + linktype (a) eq { + /s linwidth 2 sub 11 idiv def + /p s 9 sub 2 idiv def + /x s p sub 1 sub 11 mul 10 add p 0 eq {2 add} if 99 sub def + x 1 rmoveto + } { + -7 1 rmoveto + } ifelse + + compsym //renmatrix exec + + grestore + + end + +} bind def +/gs1-128composite dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER gs1-128composite-- @@ -6827,87 +20398,391 @@ p)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> % --EXAM: (01)03453120000011(17)120508(10)ABCD1234(410)9501101020917 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1datamatrix 0.0 0 0 0 -%%BeginData: 31 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\pp@< ?O( -G^G5\Ou8C305kfO Bl@m1 P!5 $b0 4J @1 @rG mhP !5$b04 ]! =FC]E# G9C -L+Cia0N1N.5SBl@ m1P- 6N[ FE 2) 5B6 8E< AWf 3'L] -NYrOpu>KFD5Z2F* j(NA m oL sA Wf3 'P! FGY< 0B5(@ -ZmRN0oc8tP)XR(F _-_!H] ftD 5 *C& O5 *@^M H]f t&EckrV1OY EdI?J0)*g/N -:DfBf4Df0WZ5*@^ MP#Q@= FD5 Z 2F*j '+I? I/T AU&0&DIe)I Bl9(tOu"b0F -`\a?DN\IlV33VfC 5;kQ1M L`R NWEI LNI- gJD fp/b5&-6EP 'N4"C6AUR!K -mI:C6CcD1QlmD3/ @Qj"- Q?@/ 8oZQP !3W: !Ks FF5*C/R30I a,"-TX>"-Pj -29RV8N3,`q]P!3W D5*C2 S@VV& ,05?Y 6Ou %$!FGKp3P" _$(I?ITYP%B -')%[&V$@;0d*>9I 471G<0N G%#3C! g5F(1 Lad 5@rGmhOuSV 6L]N[WI?IQi!@a1kP')pOP')pONWCPkNI-gPP')pOL]`G6P)"I4NW=k;L]NZoI?IT -7+CSu*OogehOrK2YOo^_J>q]W#F-8_M1LY!@@;L`%L]NZoAU&0&DIeoTI?J0)FY@0;AncL$A;D - %b23Kb"L]E53L]i'QP"8l*NWLmgL]Wa9Or9EBOuS6uL]rV7P)"iIOo^_j@;0=fG\(EA",Hu@L -QZn1P"Al6$]"h>'RP7k8;J(<+,BrR,^Xs&8;J^#H\`#b!g9CC0TnD(BkD((ARpT!L]NZoP'DD< -8M=[n@kif>Ou"b%D01"F>9INq@kf*3Ou%moL]LpuF-:!g!KsF/056S5Ou"b"BcphuF!,1[99M( -aG%#20@;0mnC`m/#P"UroA8QF5P%%j6P%'RTG%#3M@ZgbT$'I9(!+]qgG`m?83+QlJG`lNEBcp -WC5'q^@8R7L)OuQuhFEisX@;1m6Oo]`7C`lrF5'q^@8R7L)04\pAG`k7R1MIt?BlfGHL]N[;pL]E54P"_$HP&QQeHXpu8G`lNl!KmJH$'I9(!+]qgG`m?83+QlJG`lNJDIYDaG -V2G`lNl!KmJ>"d3\bV33VfBnubP1GOu%NLAM7M$Eas#uAKYGjEas#uAV^ ->$P"_#pDfBf4Df0WV#\7jkFC]E#GB@kJAWh:VE-,f4DKCgDE+*d.AS,giFE2M8P'AWgEbBG9@U -X:eDe*E%DfBf4Df0VL04\L5@;TFpEbTc]5E[g2EbBHR")i.#DfBf4Df0WZG[YW*F!,"3DKKE0@ -<[lR0/%?WDJ`g(EbTc]<0B7iOq*X205#>\A79RgD..O,Bm>e#P%64gCG'+8/p(ZFEd;,:Ecc5; -/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2!3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/gs1datamatrix 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp gs1datamatrix 0.0 2015050900 78248 77990 +%%BeginData: 134 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /datamatrix dup /uk.co.terryburton.bwipp findresource put +begin +/gs1datamatrix { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Expand ordinals of the form ^NNN to ASCII + /expand { + /in exch def + /out in length string def + /j 0 def + in + { % loop + (^) search { + dup out exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi out exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup out exch j exch putinterval + length j add /j exch def + out 0 j getinterval exit + } ifelse + } loop + } bind def + + % Parse out AIs + /ais [] def + /aival 2 dict def + barcode dup length 1 sub 1 exch getinterval + { % loop + dup () eq {exit} if + (\)) search pop + exch pop + exch (\() search { + exch pop exch 3 1 roll + } { + () 3 1 roll + } ifelse + [ ais aload pop counttomark 2 add index ] /ais exch def + aival 3 1 roll expand put + } loop + pop + + % Pre-defined fixed length data field AIs + % any AI whose prefix is not included in this table must be + % terminated with "FNC1", even if it's fixed length + /aifixed 23 dict def + [ + 0 1 4 {} for + ] { + (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put + } forall + [ + 11 1 20 {} for + 23 + 31 1 36 {} for + 41 + ] { + 10 2 string cvrs dup aifixed 3 1 roll put + } forall + + % Create the datamatrix data + /fnc1 -1 def + /dmtx [ fnc1 ] def + 0 1 ais length 1 sub { + /i exch def + /ai ais i get def + /val aival ai get def + dmtx length ai length add val length add array + dup 0 dmtx putinterval + dup dmtx length ai [ exch {} forall ] putinterval + dup dmtx length ai length add val [ exch {} forall ] putinterval + /dmtx exch def + i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + dmtx length 1 add array + dup 0 dmtx putinterval + dup dmtx length fnc1 put + /dmtx exch def + } if + } for + + % Compose input to datamatrix + /barcode dmtx length 1 add 5 mul string def + /i 0 def /j 0 def { + i dmtx length eq {exit} if + dmtx i get dup fnc1 eq { + pop barcode j (^FNC1) putinterval + /j j 4 add def + } { + barcode exch j exch put + } ifelse + /i i 1 add def + /j j 1 add def + } loop + /barcode barcode 0 j getinterval def + + % Get the result of encoding with code128 + options (dontdraw) true put + options (parsefnc) true put + /args barcode options //datamatrix exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/gs1datamatrix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER gs1datamatrix-- +% --BEGIN ENCODER gs1qrcode-- +% --REQUIRES preamble raiseerror renmatrix qrcode-- +% --DESC: GS1 QR Code +% --EXAM: (01)03453120000011(8200)http://www.abc.net(10)ABCD1234(410)9501101020917 +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp gs1qrcode 0.0 2015050900 78280 77938 +%%BeginData: 133 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /qrcode dup /uk.co.terryburton.bwipp findresource put +begin +/gs1qrcode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Expand ordinals of the form ^NNN to ASCII + /expand { + /in exch def + /out in length string def + /j 0 def + in + { % loop + (^) search { + dup out exch j exch putinterval + length j add 1 add /j exch def + pop + dup 0 3 getinterval cvi out exch j 1 sub exch put + dup length 3 sub 3 exch getinterval + } { + dup out exch j exch putinterval + length j add /j exch def + out 0 j getinterval exit + } ifelse + } loop + } bind def + + % Parse out AIs + /ais [] def + /aival 2 dict def + barcode dup length 1 sub 1 exch getinterval + { % loop + dup () eq {exit} if + (\)) search pop + exch pop + exch (\() search { + exch pop exch 3 1 roll + } { + () 3 1 roll + } ifelse + [ ais aload pop counttomark 2 add index ] /ais exch def + aival 3 1 roll expand put + } loop + pop + + % Pre-defined fixed length data field AIs + % any AI whose prefix is not included in this table must be + % terminated with "FNC1", even if it's fixed length + /aifixed 23 dict def + [ + 0 1 4 {} for + ] { + (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put + } forall + [ + 11 1 20 {} for + 23 + 31 1 36 {} for + 41 + ] { + 10 2 string cvrs dup aifixed 3 1 roll put + } forall + + % Create the qrcode data + /fnc1 -1 def + /qrc [ fnc1 ] def + 0 1 ais length 1 sub { + /i exch def + /ai ais i get def + /val aival ai get def + qrc length ai length add val length add array + dup 0 qrc putinterval + dup qrc length ai [ exch {} forall ] putinterval + dup qrc length ai length add val [ exch {} forall ] putinterval + /qrc exch def + i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + qrc length 1 add array + dup 0 qrc putinterval + dup qrc length fnc1 put + /qrc exch def + } if + } for + + % Compose input to qrcode + /barcode qrc length 1 add 5 mul string def + /i 0 def /j 0 def { + i qrc length eq {exit} if + qrc i get dup fnc1 eq { + pop barcode j (^FNC1) putinterval + /j j 4 add def + } { + barcode exch j exch put + } ifelse + /i i 1 add def + /j j 1 add def + } loop + /barcode barcode 0 j getinterval def + + % Get the result of encoding with qrcode + options (dontdraw) true put + options (parsefnc) true put + /args barcode options //qrcode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/gs1qrcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER gs1qrcode-- + % --BEGIN ENCODER hibccode39-- % --REQUIRES preamble raiseerror renlinear code39-- % --DESC: HIBC Code 39 % --EXAM: A123BJC5D6E71 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp hibccode39 0.0 0 0 0 -%%BeginData: 36 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\: - %52X=FD5Z2F-8_ M1G<3 GEa s#u AW f6 ?1G <9W DKKE0@ D -P!5%OP!5$bI=%,/ FE2M8O u%N L5FCf -]=F(or3OtVtS06C cMFEq e:Aoh O*+EV 1>F Eqe:AohO*O tVtS06CcMFE -h_9AohO*+EV1>FE h_9AohO *OtVtS 04J@1 @q] :kF,hb)0et OA2)[BQ3C,u -!6q'R884cEH9MJ8X:f1+h<)lt#=BSfZ/g)Dm.j^?704S[(Ectl-F,2?023KbO!/LZ3.XPZ=@<- -O"Cibb'OuQoZEarckEc[C-L]NZ4P!5%RI?I-W!/LYb@<,jrA7^p5L]N[%ARfLsF_upbP%p.9G% -#3$A79Rk@q]F`CO715@<,jrA7Zlm@<-0qDN[Y%@<,jk@<-E3@q]F`CNFW8P"UsTHS8iPBlJ#DB -PCpc@rGmh1HAoQA4($A@r"JHB5)IJ.nOVgDfTl0@rrha8O>ce6Z6LH+>Z##@q]F`CER/%B5)H1 -E,ol?Bk1dc0/%?SBldisEcQ)=P!=AX<%h]hEas#uAKYGjEas#uAV^=q@<-0qDN[\V1OYEc04J@ -1@rGmh+C\c"Ch7L?!g3SIV33fo!FfJX@rGmhP'N3H@UX:eDe*F8!/N.gG[b*%@rGmh+C\c"Ch7 -L?!KmIm@<,jk@<-E3@q]F`CNFW8P"Us_06CcMF*c@<-"%NWXBJFB]kl+EV1>F5>p*F9G[YW*F,gTLAU&D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hW -FDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/hibccode39 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibccode39 0.0 2015050900 63169 62924 +%%BeginData: 92 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code39 dup /uk.co.terryburton.bwipp findresource put +begin +/hibccode39 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /textxoffset 0 def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /textxoffset textxoffset cvr def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.hibccode39badCharacter (HIBC Code 39 must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibccode39badCheckDigit (Incorrect HIBC Code 39 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + /text barlen 4 add string def + text 0 42 put + text 1 barcode putinterval + text barlen 2 add barcode barlen 1 add get dup 32 eq {pop 95} if put + text barlen 3 add 42 put + + % Get the result of encoding with code39 + options (dontdraw) true put + options (includecheck) false put + options (validatecheck) false put + /args barcode options //code39 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/hibccode39 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibccode39-- @@ -6918,43 +20793,99 @@ FDtYuCM@[!I?IP~> % --EXAM: A123BJC5D6E71 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp hibccode128 0.0 0 0 0 -%%BeginData: 35 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\ Ou" b5AU -&F Cf]= AoD R/OtDhQ06C cMFE;/BAKZ) -+G]\"@H=`6mOu"b 5AU&< BDece6Z6LH+> -GW2+Dl7BF%ARfLsF_upbP%p -.9G%#3$A79Rk@q]F`CO715@<,jrA7Zlm@<-0qDN[Y%@<,jk@<-E3@q]F`CNFW8P"UsTHS8iPBl -J#DBPCpc@rGmh0et^t@:V`=ARfLDBkM.%N\!b>@rHC.ARfg)84c-8+@C'XAKW]_3$;^EARfKuA -8,[jFB/!>-d@<,jrA7Zl -m@<-0qDMS=V!FfJX@q]:kF!+t+ARfLsF`!:7P'AX%AU&;>@UX:nAT!;,Oo^`BOu%2kG]\`ALan -R4FCf]=L]LsnEas#uAWh=\AU&;>@UX:nAT!;*Oo]$#Eas#uAKYGjEbo<)L]NY>P"UrtL`hjDH] -iN-?[\):P'D([G]Y';@<-0qDMSCX!Ji4gG].PCBl@m1NX006DKKE0@9I,mFCf]=+EV1>FEh_9AohO*+EV1>FEqe:AohO*+EV1>FCoH/FG]\1=Ch[O"NWs!)DKKH1P'CDUB60(8DfBf:E-,f4DKCtc@<-"%+CoD.FC]E#GEQ -nu061WACh[cu@<.N1Ou[rR%[&V$BPCpc@rGmh0et_O30If*F_`U>D_?-CEcQG7F`MSBDD#CBBl -J#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/hibccode128 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibccode128 0.0 2015050900 67220 66909 +%%BeginData: 91 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /code128 dup /uk.co.terryburton.bwipp findresource put +begin +/hibccode128 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /textxoffset 0 def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /textxoffset textxoffset cvr def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.hibccode128badCharacter (HIBC Code 128 must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibccode128badCheckDigit (Incorrect HIBC Code 128 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + /text barlen 4 add string def + text 0 42 put + text 1 barcode putinterval + text barlen 2 add barcode barlen 1 add get dup 32 eq {pop 95} if put + text barlen 3 add 42 put + + % Get the result of encoding with code128 + options (dontdraw) true put + options (validatecheck) false put + /args barcode options //code128 exec def + + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put + args (textxalign) (center) put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} bind def +/hibccode128 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibccode128-- @@ -6965,38 +20896,82 @@ J#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrix 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\:%52X= FD5Z2 F-8 _M1 G< 3G Eas #uA Wf6?1G <9 WDKKE0 @p#9jr-aBm:b;F`VXI@rH7,@;0U%Df0B:+Co2!BlnD -I+Cei!Blmd"+DbV2FCfK6/0K"Q@:Nki+CT.u+EV:.+EMgF@W-((+>#2k0.S>%061K8F(Jp'Ec5 -u]5CJ\oI?I,S@UX:nASrW"@<,jrA7^p5G%#3$A79Rk@q]F`CO:j_5*@^MP"769BOt[hF*2=B@q]F`CNFW8Lb"X'Ou%8iCh[EgFCerqARfM&+C\c"@rGmh+C\c" -Ch7LI94D=M@q]:kF!+t+ARfLsF`!:7P&5P!@WuO*E%Yg<@UiqWFCB#pFE2)?6=FClBOt[h6tp: -JFH/"GDI[U*Eb/a&+@o'j6Qed*FC?:d@B/!>-d@<,jrA7Zlm@<-0qDMS=V!FfJX@q]:kF!+t+A -RfLsF`!:7P'CnaFD5Z2F,gN:Df0Z-Eaa06EckrVG].PCBl@m1NX^/?Ch[EgFCerqARfLf@;L!r -P'AWgEbBG9@UX:eDe*E%DfBf4Df0VL04\L5@;TFpEbTc]5E[g2EbBHR")i.#DfBf4Df0WZG[YW -*F!,"3DKKE0@<[lR0/%?WDJ`g(EbTc]<0B7iOq*X205,'/@q9"i@;TFpEbTc]30If*F_`U>D_? --CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM -@[!I?IP~> -% uk.co.terryburton.bwipp/hibcdatamatrix 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrix 0.0 2015050900 68711 64879 +%%BeginData: 74 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /datamatrix dup /uk.co.terryburton.bwipp findresource put +begin +/hibcdatamatrix { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.hibcdatamatrixBadCharacter (HIBC Data Matrix must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibcdatamatrixBadCheckDigit (Incorrect HIBC Data Matrix check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + % Get the result of encoding with datamatrix + options (dontdraw) true put + options (validatecheck) false put + /args barcode options //datamatrix exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/hibcdatamatrix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibcdatamatrix-- @@ -7007,38 +20982,86 @@ P'AWgEbBG9@UX:eDe*E%DfBf4Df0VL04\L5@;TFpEbTc]5E[g2EbBHR")i.#DfBf4Df0WZG[YW % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcpdf417 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\: - %52X=FD5Z2F-8_ M1G<3 GEa s#u AW f6 ?1G <9W DKKE0@ U!0T-o!/LYb@<-0qDMS=VWI&)_Eas#uAWf65!Kp,dBOPq)@;L"J5*AQ -KBOt[hF*2>_!A@qrARfLsF`!:*Ou%NL82"IdARfLsF_r72BOt[hF*2>U/!=Y11Nm2CBk1XoARf -Cb@r$E6@UX:eDe*E%@UX:nAT!Z(@UX:eBOPq&+Cf(r@r$..D3@PTD0mpFGA2#8/nes.@rPsj1b -gpU@:V`=ARfLDBkM.%N[dV<@rHC.ARfg)84c-8+AbHq1bgp3@q]F`CER/%B5)H1E,ol?Bk1dc0 -/%?SBldisEcQ)=P!=AX<%h]hEas#uAKYGjEas#uAV^=q@<-0qDN[\V1OYEc04J@1@rGmh+C\c" -Ch7L?!g3SIV33fo!FfJX@rGmhP'N3H@UX:eDe*F8!/N.gG[b*%@rGmh+C\c"Ch7L?!KmIm@<,j -k@<-E3@q]F`CNFW8P"Us_DfBf4Df0WV#\7jkFC]E#GB@kJAWh:VE-,f4DKCgC@rH1+D/OE)Des -Q5DKCtcDfBf4Df0WV%e?Ou[rR% -[&V$BPCpcE+EQ;0fP7TP%64gCG'+8/p(ZFEd;,:Ecc5;/n0$=E,Zq1AS,XoATD@'Dfp)1AWh2! -3A5GbFDtYuCM@[!P.H"'F`V,9E+*6lBl7R3P#M~> -% uk.co.terryburton.bwipp/hibcpdf417 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibcpdf417 0.0 2015050900 65468 65072 +%%BeginData: 78 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /pdf417 dup /uk.co.terryburton.bwipp findresource put +begin +/hibcpdf417 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /columns 2 def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /columns columns cvi def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.hibcpdf417BadCharacter (HIBC PDF417 must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibcpdf417BadCheckDigit (Incorrect HIBC PDF417 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + % Get the result of encoding with pdf417 + options (dontdraw) true put + options (columns) columns put + options (validatecheck) false put + /args barcode options //pdf417 exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/hibcpdf417 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibcpdf417-- @@ -7049,39 +21072,86 @@ EQ;0fP7[Ou$NeB60(8DfBf:E-,f4DKCtc@<-"%+CoD.FC]E#GEQnu061WAD..O,Bm>e?Ou[rR% % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcmicropdf417 0.0 0 0 0 -%%BeginData: 31 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\DP!5% OP!5$b I=% , /FE2 M8Ou %NL +F_u#;O t;bP04J@1@q -]:kF,hb)0etOA2) [BQ3C ,u!6 q'R88 4cEH 9MJ 8X:f1+h<)l t#=BSfZ/g)D -m.j^?704S[(Ectl -F,2? 023Kb O!/LZ 3.X PZ=@<-O"Ci bb'OuQoZEar -ckEc[C-L]NZ4P!5 %RI?I-W !/LYb@ <,jrA 7^p 5L]N[U!0T-o!/LYb@<-0qDMS=VWI&)_Eas#uA -Wf65!Kp,dBOPq)@;L"J5*AQKBOt[hF*2>_!A@qrARfLsF`!:*Ou%NL82"IdARfLsF_r72BOt[h -F*2>U/!=Y11Nm2CBk1XoARfCb@r$E6@UX:eDe*E%@UX:nAT!Z(@UX:eBOPq&+Cf(r@r$..D3@P -TD0mpFGA2#8/nes.@r5piEc5o-Ai)5$6=FClBOt[h6tp:JFH/"GDI[U*Eb/a&+@o'j6Qf*;@rc -Ka6q0!f2]uUDARfKuA8,[jFB/!>-d@<,jrA7Zlm@<-0qDMS=V!FfJX@q]:kF!+t+ARfLsF`!:7P'CnaFD5Z2F,gN:Df0Z- -Eaa06EckrVG].PCBl@m1NX''4CisT4F(9-)F_u#;P'CnaFD5Z2F,g]Q@;KXg@ -% uk.co.terryburton.bwipp/hibcmicropdf417 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibcmicropdf417 0.0 2015050900 65606 65195 +%%BeginData: 78 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /micropdf417 dup /uk.co.terryburton.bwipp findresource put +begin +/hibcmicropdf417 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /columns 2 def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /columns columns cvi def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.hibcmicropdf417BadCharacter (HIBC MicroPDF417 must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibcmicropdf417BadCheckDigit (Incorrect HIBC MicroPDF417 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + % Get the result of encoding with micropdf417 + options (dontdraw) true put + options (columns) columns put + options (validatecheck) false put + /args barcode options //micropdf417 exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/hibcmicropdf417 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibcmicropdf417-- @@ -7092,37 +21162,82 @@ cVEbBG9A8c@-A9)+&P&N'-Eb0-*@: - %52X=FD5Z2F-8_ M1G<3 GEa s#u AW f6 ?1G <9W DKKE0@ FA7Zm#F`VXI@rH7,@;0U%Df0B:+Co2!BlnDI+Cei!Blmd"+DbV2FCf -K6/0K"Q@:Nki+CT.u+EV:.+EMgF@W-((+>#2k0.S>%061K8F(Jp'Ec5u]5CJ\oI?I,S@UX:nAS -rW"@<,jrA7^p5G%#3$A79Rk@q]F`CO:j_5*@^MP"769BOt[h -F*2=B@q]F`CNFW8Lb"X'Ou%8iCh[EgFCerqARfM&+C\c"@rGmh+C\c"Ch7LI94D=M@q]:kF!+t -+ARfLsF`!:7P&5P!@WuO*E%Yg<@UjCu@rGmh6=FClBOt[h6tp:JFH.kCDI[U*Eb/a&+@o'j6Qf -6(+@C'XAKYJrARfKuA8,[jFB/!>-d@<,jrA7Zlm@<-0qDMS=V!FfJX@q]:kF!+t+ARfLsF`!:7P'CnaFD5Z2F,gN:Df0Z- -Eaa06EckrVG].PCBl@m1NX^/?Ch[EgFCerqARfLf@;L!rP'AWgEbBG9@UX:eDe*E%DfBf4Df0V -L06)#BDe*FB5E[g2EbBHR")i.#DfBf4Df0WZG[YW*F!,"3DKKE0@<[lR0/%?WDJ`g(EbTc]<0B -7iOq*X205,'/@rZO!De*FB30If*F_`U>D_?-CEcQG7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@q -CgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> -% uk.co.terryburton.bwipp/hibcqrcode 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibcqrcode 0.0 2015050900 64983 68179 +%%BeginData: 74 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /qrcode dup /uk.co.terryburton.bwipp findresource put +begin +/hibcqrcode { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.hibcqrcodeBadCharacter (HIBC QR Code must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibcqrcodeBadCheckDigit (Incorrect HIBC QR Code check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + % Get the result of encoding with qrcode + options (dontdraw) true put + options (validatecheck) false put + /args barcode options //qrcode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/hibcqrcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibcqrcode-- @@ -7133,38 +21248,82 @@ CgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I?IP~> % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibccodablockf 0.0 0 0 0 -%%BeginData: 30 ASCII Lines -currentfile /ASCII85Decode filter cvx exec -06:]HE+*6lBl7RH \pKT_ @s)g4 ASuU/ @: O(e DJ()6E ckq9F(K -H4@:O(eDJ+B\3% -oDi/n8fPFCfK5H" (o:FD l%L @Wu O *E0 Aq< G`i LhBPCp c@ rGmd@V fsm -CM%pL'Tt>:%52X= FD5Z2 F-8 _M1 G< 3G Eas #uA Wf6?1G <9 WDKKE0 @#2k0.S>%061K8F(Jp'Ec5u]5CJ -\oI?I,S@UX:nASrW"@<,jrA7^p5G%#3$A79Rk@q]F`CO:j_5 -*@^MP"769BOt[hF*2=B@q]F`CNFW8Lb"X'Ou%8iCh[EgFCerqARfM&+C\c"@rGmh+C\c"Ch7LI -94D=M@q]:kF!+t+ARfLsF`!:7P&5P!@WuO*E%Yg<@UindA78q`De!Qp6=FClBOt[h6tp:JFH/" -GDI[U*Eb/a&+@o'j6Qea7A78q`De!Q*7Nc2SARfKuA8,[jFB/!>-d@<,jrA7Zlm@<-0qDMS=V!FfJX@q]:kF!+t+ARfLsF -`!:7P'CnaFD5Z2F,gN:Df0Z-Eaa06EckrVG].PCBl@m1NX^/?Ch[EgFCerqARfLf@;L!rP'AWg -EbBG9@UX:eDe*E%DfBf4Df0VL04Sp2@:F%k@r#\>5E[g2EbBHR")i.#DfBf4Df0WZG[YW*F!," -3DKKE0@<[lR0/%?WDJ`g(EbTc]<0B7iOq*X205,'/@q0Ff@:F%k@r#\>30If*F_`U>D_?-CEcQ -G7F`MSBDD#CBBlJ#6A7]@eDImj"F)Q2A@qCgGOuY1:ATVm"@r#drB9KiQP'(hWFDtYuCM@[!I? -IP~> -% uk.co.terryburton.bwipp/hibccodablockf 0.0 0 +%%BeginResource: uk.co.terryburton.bwipp hibccodablockf 0.0 2015050900 60823 64313 +%%BeginData: 74 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /codablockf dup /uk.co.terryburton.bwipp findresource put +begin +/hibccodablockf { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /validatecheck false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + /charvals 43 dict def + 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for + + % Validate the input + 0 1 barcode length 1 sub { + barcode exch 1 getinterval charvals exch known not { + /bwipp.codablockfBadCharacter (HIBC Codablock F must contain only digits, capital letters, spaces and the symbols -.$/+%) //raiseerror exec + } if + } for + + /barlen barcode length validatecheck {1 sub} if def + + /checksum 41 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 43 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.hibccodablockfBadCheckDigit (Incorrect HIBC Codablock F check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + } if + + /barcode barlen 2 add string dup 1 barcode putinterval def + barcode 0 43 put + barcode barlen 1 add barchars checksum get put + + % Get the result of encoding with codablockf + options (dontdraw) true put + options (validatecheck) false put + /args barcode options //codablockf exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} bind def +/hibccodablockf dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if %%EndData %%EndResource % --END ENCODER hibccodablockf-- diff --git a/Master/texmf-dist/tex/generic/pst-barcode/pst-barcode.tex b/Master/texmf-dist/tex/generic/pst-barcode/pst-barcode.tex index a0710af9811..a5a5420f165 100644 --- a/Master/texmf-dist/tex/generic/pst-barcode/pst-barcode.tex +++ b/Master/texmf-dist/tex/generic/pst-barcode/pst-barcode.tex @@ -19,8 +19,8 @@ \let\PSTBarcodeLoaded\endinput \ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi % -\def\fileversion{0.12} -\def\filedate{2013/10/26} +\def\fileversion{0.13} +\def\filedate{2015/05/11} \message{`PST-barcode' v\fileversion, \filedate\space (tb,hv)} % \edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax diff --git a/Master/texmf-dist/tex/latex/pst-barcode/pst-barcode.sty b/Master/texmf-dist/tex/latex/pst-barcode/pst-barcode.sty index ed02c1e4a1b..3cffbfaa237 100644 --- a/Master/texmf-dist/tex/latex/pst-barcode/pst-barcode.sty +++ b/Master/texmf-dist/tex/latex/pst-barcode/pst-barcode.sty @@ -6,6 +6,6 @@ [\filedate\space v\fileversion\space `PST-barcode' (hv)] \IfFileExists{pst-barcode.pro}{% \ProvidesFile{pst-barcode.pro} - [2011/03/12 PostScript prologue file (hv)] + [2015/05/11 PostScript prologue file (hv)] \@addtofilelist{pst-barcode.pro}}{}% \endinput -- cgit v1.2.3