#!/usr/bin/perl

# Drak Bug Report 
# Copyright (C) 2002-2004 Mandrakesoft (daouda at mandrakesoft dot com)
#                                       Stew Benedict (sbenedict at mandrakesoft dot com) 
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

use strict;
use diagnostics;
use lib qw(/usr/lib/libDrakX);

use standalone;
use common;
use ugtk2 qw(:all);
use Config;

my ($bugzilla, $wizard_name);
my $prog;
my ($incident, $stable_release) = (0, 0);
my ($bugdesc, $bugwrite, $table, $comb_app, $button_pkg, $package, $extra_data, $summary, $textview, $kversion, $cpuinfo, $lspci);

foreach (@ARGV) {
    next unless defined $_;
    /^--report$/ && shift @ARGV and $prog = shift @ARGV;
    /^--incident$/ && shift @ARGV and do { $incident = 1; $prog = shift @ARGV };
}

my $window = ugtk2->new(N("Mandrakelinux Bug Report Tool"), center => 1);
$window->{rwindow}->set_border_width(5);
$window->{window}->signal_connect("delete_event", sub { ugtk2->exit(0) });

my $mdk_app = { 
	       N("Mandrakelinux Control Center") => 'drakconf',
	       N("First Time Wizard") => 'drakfw',
	       N("Synchronization tool") => 'draksync',  
	       N("Standalone Tools") => ['adduserdrake', 'diskdrake', 'drakautoinst', 'drakbackup', 'drakboot', 'DrakBug', 'DrakClock', 'DrakConnect', 'drakfloppy', 'drakfirewall', 'drakfont', 'drakgw', 'DrakSec', 'draksplash', 'drakvpn', 'drakxservices', 'drakxtools', 'drakxtv', 'keyboardrake', 'logdrake', 'mousedrake', 'net_monitor', 'printerdrake', 'scannerdrake', 'XFdrake'],
	       N("HardDrake") => 'harddrake2',
	       N("Mandrakeonline") => 'mdkonline',
	       N("Menudrake") => 'menudrake',
	       N("Msec") => 'msec',
	       N("Remote Control") => 'rfbdrake',
	       N("Software Manager") => 'rpmdrake',
	       N("Urpmi") => 'urpmi',
	       N("Windows Migration tool") => 'transfugdrake',
	       N("Userdrake") => 'userdrake',
	       N("Configuration Wizards") => 'wizdrake',
	      };

my @generic_tool = keys %$mdk_app; 
my @all_drakxtools = @{ $mdk_app->{N("Standalone Tools")} };
push(@generic_tool,@all_drakxtools);

my $kernel_release = chomp_(`uname -r`);
my $mandrake_release = chomp_(cat_('/etc/mandrakelinux-release'));
#- unused for now
#- (my $mandrake_version) = $mandrake_release =~ /(\d+\.\d+)/;

if ($mandrake_release =~ /(official|community)/i) {
    my $anthill = 'http://bugs.mandrakelinux.com';
    $bugzilla = $anthill . '/drakbug.php?request=1';
    $stable_release = 1;
    $wizard_name = "Anthill";
} else {
    $bugzilla = 'http://qa.mandrakesoft.com/enter_bug.cgi';
    $wizard_name = "Bugzilla wizard";
}

if ($stable_release == 0) {
    $table = create_packtable({ col_spacings => 5, row_spacings => 10 },
			      [ Gtk2::Label->new(N("Application:")), $comb_app = Gtk2::ComboBox->new_text ],
			      [ Gtk2::Label->new(N("Package: ")), $package = Gtk2::Entry->new_with_text("...") ], # complain on gtk-perl@ml
			      [ Gtk2::Label->new(N("Kernel:")), gtkset_editable(Gtk2::Entry->new_with_text($kernel_release), 0) ],
			      [ Gtk2::Label->new(N("Release: ")), gtkset_editable(Gtk2::Entry->new_with_text($mandrake_release), 0) ]
                             );
    $comb_app->set_popdown_strings("", sort(@generic_tool));
} else {
    $table = create_packtable({ col_spacings => 5, row_spacings => 5 },
			      [Gtk2::Label->new(N("Application Name\nor Full Path:")), 
			       gtkpack_(Gtk2::HBox->new(0,5),
					1, $comb_app = gtkset_editable(Gtk2::Entry->new, 1), 
					0, $button_pkg = Gtk2::Button->new(N("Find Package")),
				       )],
			      [ Gtk2::Label->new(N("Package: ")), $package = gtkset_editable(Gtk2::Entry->new_with_text("..."), 0) ],
			      [ Gtk2::Label->new(N("Release: ")), gtkset_editable(Gtk2::Entry->new_with_text($mandrake_release), 0) ],
			      [ Gtk2::Label->new(N("Summary: ")), $summary = gtkset_editable(Gtk2::Entry->new_with_text(""), 1) ]
			     );
    
    $textview = Gtk2::TextView->new;
    
    $extra_data = gtkpack_(Gtk2::VBox->new(0,1),
			   0, Gtk2::Label->new(N("Bug Description/System Information")),
			   1, create_scrolled_window(gtktext_insert($textview,  N("YOUR TEXT HERE"), editable => 1, visible => 1)),
			   0, gtkpack_(Gtk2::HBox->new(0,20),
				       0, Gtk2::HBox->new(0,0),
				       1, $kversion = Gtk2::CheckButton->new(N("Submit kernel version")),
				       1, $cpuinfo = Gtk2::CheckButton->new(N("Submit cpuinfo")),
				       1, $lspci = Gtk2::CheckButton->new(N("Submit lspci")),
				      ),
			   0, Gtk2::HSeparator->new,		
			  );
    $kversion->set_active(1);
    $cpuinfo->set_active(1);
    $lspci->set_active(1);
}

gtkadd($window->{window},
       gtkpack_(Gtk2::VBox->new(0,5),
		0, gtkadd($table),
		1, gtkadd($extra_data),
		0, gtkpack(Gtk2::HBox->new(0,0),
			   gtkpack(gtkset_justify(Gtk2::WrappedLabel->new(formatAlaTeX(N("To submit a bug report, click on the report button.\nThis will open  a web browser window on %s\n where you'll find a form to fill in.  The information displayed above will be \ntransferred to that server.", $wizard_name))), "left")),
			  ),
		0, gtkpack(Gtk2::HSeparator->new),
		0, gtkpack_(Gtk2::HBox->new(0,0),
			    0, gtksignal_connect(Gtk2::Button->new(N("Help")), clicked => sub { system("drakhelp --id drakbug &") }),
			    1, Gtk2::Label->new(""),
			    0, gtksignal_connect(Gtk2::Button->new(N("Report")), clicked => sub {
						     if ($stable_release == 0) { 
							 my $options = "mdkbugreport=1";
							 $options .= "&incident=1" if $incident;
							 my $p = $package->get_text;
							 my ($product, $version) = $p =~ /^(.*)-([^-]+-[^-]+mdk)$/;
							 my $app = $comb_app->entry->get_text;
							 my $component = if_(member($app, @all_drakxtools), $app) || $mdk_app->{$app};
							 $options .= "&product=$product" if $product;
							 $options .= "&component=$component" if $component;
							 $options .= "&version=$version" if $version;
							 $options .= "&kernel=$kernel_release";
							 print($bugzilla . "?" . $options . "\n");
							 connect_bugzilla($bugzilla . "?" . $options);
						      } else {
							  # anthill variant - we'll create a text file, then connect to upload
							  my $check = write_anthill_file(); 
							  connect_bugzilla($bugzilla) if !$check;
						      }
						 }
						),
			    0, gtksignal_connect(Gtk2::Button->new(N("Close")), clicked => sub { ugtk2->exit(0) }),
			   )));

if ($stable_release == 0) {
    if (defined $prog) {
    	update_app($prog); 
    	$comb_app->set_text($prog);
    };
    $comb_app->entry->signal_connect('changed', sub { update_app($comb_app->entry->get_text) });
} else {
    $window->{window}->set_size_request(600, 460);
    $button_pkg->signal_connect('clicked', sub { 
				    my $pkg_name = get_pkg_name($comb_app->get_text);
				    $package->set_text($pkg_name);
				});
}

$window->{window}->show_all;
$window->main;
ugtk2->exit(0);

sub update_app {
    my ($text) = @_;
    my $app_choice;
    $ENV{PATH} = "/sbin:/usr/sbin:$ENV{PATH}";
    if (member($text,@all_drakxtools) || $text eq N("Standalone Tools")) {
	$app_choice = chomp_(`rpm -q drakxtools`);
    } elsif (exists($mdk_app->{$text}) && $text ne N("Standalone Tools")) {	
	$app_choice = get_package($mdk_app->{$text});
    } else {
      LOOP: while (my ($key, $value) = each %$mdk_app) {
	    next if $key eq N("Standalone Tools");
	    if ($value eq $text) { 
		$app_choice = get_package($text);
		$prog = $key; 
		last LOOP;
	    }
	}
	
    }
    $app_choice ? $package->set_text($app_choice) : $package->set_text(N("Not installed"));
}

my %packages;

sub get_package {
    my ($executable) = @_;
    my ($rpm_package, $which_app);
    $rpm_package = $packages{$executable};
    if (!defined $rpm_package) {
        $which_app = chomp_(`which '$executable' 2> /dev/null`);
        # deush, rpm can takes some time aka it'll sleeps if something has opened rpm db !
        $rpm_package = $which_app eq "" ? N("Package not installed") : chomp_(`rpm -qf '$which_app' 2>&1`);
        $packages{$executable} = $rpm_package;
    }
    $rpm_package;
}

sub get_pkg_name {
    my ($executable) = @_;
    my $which_app = chomp_(`which '$executable' 2> /dev/null`);
    my $rpm_package;
    if ($which_app eq "") {
	$rpm_package = chomp_(`rpm -q '$executable' --qf '%{NAME}' 2>&1`);
    } else {
	$rpm_package = chomp_(`rpm -qf '$which_app' --qf '%{NAME}' 2>&1`);
    }
    $rpm_package = chomp_(`rpm -qf '$executable' --qf '%{NAME}' 2>&1`) if $rpm_package =~ /not installed$/;
    $rpm_package = (split(/-2/, $rpm_package))[0] if $rpm_package =~ /^kernel/;
    $rpm_package ||= N("NOT FOUND");
    $rpm_package;
}

sub connect_bugzilla {
    my ($url) = @_;
    if (!$stable_release) {
	my $_w = create_dialog(N("Please wait"), N("connecting to %s...", $wizard_name)); 
	sleep(3);
    }
    exec $ENV{BROWSER},$url if exists $ENV{BROWSER};
    my @browser = qw(mozilla konqueror galeon);
    foreach (@browser) {
	if (-e "/usr/bin/$_") { log::explanations("Contacting $url with $_\n "); exec $_,$url } 
    }
    create_dialog(N("Error"), N("No browser available! Please install one"));
}

sub write_anthill_file() {
    my $buffer = $textview->get_buffer;
    my $siter = $buffer->get_start_iter;
    my $eiter = $buffer->get_end_iter; 
    $bugdesc = $buffer->get_text($siter, $eiter, 0);
    
    #- create anthill upload file in specified format
    my $file;
    open($file, "> /tmp/drakbug.report") or return 1;
    print $file "--- BEGIN DRAKBUG REPORT ---\n";
    print $file "%product: $mandrake_release\n";
    my $version = arch();
    $version = "x86" if $version =~ /^i.86/;
    print $file "%version: $version\n";
    my $pkg_name = $package->get_text;
    if ($pkg_name eq "..." || $pkg_name eq "") {
	my $_w = create_dialog(N("Error"), N("Please enter a package name."));
	return 1;
    }
    print $file "%component: $pkg_name\n";
    my $summary_text = $summary->get_text;
    if ($summary_text eq "") {
	my $_w = create_dialog(N("Error"), N("Please enter summary text."));
	return 1;
    }
    
    print $file "%summary: $summary_text\n";
    print $file "%description:\n";
    
    #- gave me fits wanted to wrap what was wrapped in the GUI
    #- plus include user's \n
    my @buglist = split("\n", $bugdesc);
    foreach my $bugdesc (@buglist) {
	if (length($bugdesc) > 77) {
	    $bugwrite = $bugdesc;
	    select($file);
	    local $~ = "PFORMAT";
	    write $file;
	    select(STDOUT);
	    $bugwrite = '';
	} else {
	    print $file "   $bugdesc\n";
	}
    }
    
    print $file "-" x 80 . "\n";
    print $file "Kernel: $kernel_release\n" . "Uname: " . `uname -a` . "\n" if $kversion->get_active;
    print $file "Cpuinfo: \n" . cat_("/proc/cpuinfo") if $cpuinfo->get_active;
    print $file "Lspci Output:\n" . `lspci` if $lspci->get_active;
    print $file "--- END DRAKBUG REPORT ---\n";
    close $file or return 1;
    return 0
}

format PFORMAT =
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$bugwrite
.

<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
<a id='n594' href='#n594'>594</a>
<a id='n595' href='#n595'>595</a>
<a id='n596' href='#n596'>596</a>
<a id='n597' href='#n597'>597</a>
<a id='n598' href='#n598'>598</a>
<a id='n599' href='#n599'>599</a>
<a id='n600' href='#n600'>600</a>
<a id='n601' href='#n601'>601</a>
<a id='n602' href='#n602'>602</a>
<a id='n603' href='#n603'>603</a>
<a id='n604' href='#n604'>604</a>
<a id='n605' href='#n605'>605</a>
<a id='n606' href='#n606'>606</a>
<a id='n607' href='#n607'>607</a>
<a id='n608' href='#n608'>608</a>
<a id='n609' href='#n609'>609</a>
<a id='n610' href='#n610'>610</a>
<a id='n611' href='#n611'>611</a>
<a id='n612' href='#n612'>612</a>
<a id='n613' href='#n613'>613</a>
<a id='n614' href='#n614'>614</a>
<a id='n615' href='#n615'>615</a>
<a id='n616' href='#n616'>616</a>
<a id='n617' href='#n617'>617</a>
<a id='n618' href='#n618'>618</a>
<a id='n619' href='#n619'>619</a>
<a id='n620' href='#n620'>620</a>
<a id='n621' href='#n621'>621</a>
<a id='n622' href='#n622'>622</a>
<a id='n623' href='#n623'>623</a>
<a id='n624' href='#n624'>624</a>
<a id='n625' href='#n625'>625</a>
<a id='n626' href='#n626'>626</a>
<a id='n627' href='#n627'>627</a>
<a id='n628' href='#n628'>628</a>
<a id='n629' href='#n629'>629</a>
<a id='n630' href='#n630'>630</a>
<a id='n631' href='#n631'>631</a>
<a id='n632' href='#n632'>632</a>
<a id='n633' href='#n633'>633</a>
<a id='n634' href='#n634'>634</a>
<a id='n635' href='#n635'>635</a>
<a id='n636' href='#n636'>636</a>
<a id='n637' href='#n637'>637</a>
<a id='n638' href='#n638'>638</a>
<a id='n639' href='#n639'>639</a>
<a id='n640' href='#n640'>640</a>
<a id='n641' href='#n641'>641</a>
<a id='n642' href='#n642'>642</a>
<a id='n643' href='#n643'>643</a>
<a id='n644' href='#n644'>644</a>
<a id='n645' href='#n645'>645</a>
<a id='n646' href='#n646'>646</a>
<a id='n647' href='#n647'>647</a>
<a id='n648' href='#n648'>648</a>
<a id='n649' href='#n649'>649</a>
<a id='n650' href='#n650'>650</a>
<a id='n651' href='#n651'>651</a>
<a id='n652' href='#n652'>652</a>
<a id='n653' href='#n653'>653</a>
<a id='n654' href='#n654'>654</a>
<a id='n655' href='#n655'>655</a>
<a id='n656' href='#n656'>656</a>
<a id='n657' href='#n657'>657</a>
<a id='n658' href='#n658'>658</a>
<a id='n659' href='#n659'>659</a>
<a id='n660' href='#n660'>660</a>
<a id='n661' href='#n661'>661</a>
<a id='n662' href='#n662'>662</a>
<a id='n663' href='#n663'>663</a>
<a id='n664' href='#n664'>664</a>
<a id='n665' href='#n665'>665</a>
<a id='n666' href='#n666'>666</a>
<a id='n667' href='#n667'>667</a>
<a id='n668' href='#n668'>668</a>
<a id='n669' href='#n669'>669</a>
<a id='n670' href='#n670'>670</a>
<a id='n671' href='#n671'>671</a>
<a id='n672' href='#n672'>672</a>
<a id='n673' href='#n673'>673</a>
<a id='n674' href='#n674'>674</a>
<a id='n675' href='#n675'>675</a>
<a id='n676' href='#n676'>676</a>
<a id='n677' href='#n677'>677</a>
<a id='n678' href='#n678'>678</a>
<a id='n679' href='#n679'>679</a>
<a id='n680' href='#n680'>680</a>
<a id='n681' href='#n681'>681</a>
<a id='n682' href='#n682'>682</a>
<a id='n683' href='#n683'>683</a>
<a id='n684' href='#n684'>684</a>
<a id='n685' href='#n685'>685</a>
<a id='n686' href='#n686'>686</a>
<a id='n687' href='#n687'>687</a>
<a id='n688' href='#n688'>688</a>
<a id='n689' href='#n689'>689</a>
<a id='n690' href='#n690'>690</a>
<a id='n691' href='#n691'>691</a>
<a id='n692' href='#n692'>692</a>
<a id='n693' href='#n693'>693</a>
<a id='n694' href='#n694'>694</a>
<a id='n695' href='#n695'>695</a>
<a id='n696' href='#n696'>696</a>
<a id='n697' href='#n697'>697</a>
<a id='n698' href='#n698'>698</a>
<a id='n699' href='#n699'>699</a>
<a id='n700' href='#n700'>700</a>
<a id='n701' href='#n701'>701</a>
<a id='n702' href='#n702'>702</a>
<a id='n703' href='#n703'>703</a>
<a id='n704' href='#n704'>704</a>
<a id='n705' href='#n705'>705</a>
<a id='n706' href='#n706'>706</a>
<a id='n707' href='#n707'>707</a>
<a id='n708' href='#n708'>708</a>
<a id='n709' href='#n709'>709</a>
<a id='n710' href='#n710'>710</a>
<a id='n711' href='#n711'>711</a>
<a id='n712' href='#n712'>712</a>
<a id='n713' href='#n713'>713</a>
<a id='n714' href='#n714'>714</a>
<a id='n715' href='#n715'>715</a>
<a id='n716' href='#n716'>716</a>
<a id='n717' href='#n717'>717</a>
<a id='n718' href='#n718'>718</a>
<a id='n719' href='#n719'>719</a>
<a id='n720' href='#n720'>720</a>
<a id='n721' href='#n721'>721</a>
<a id='n722' href='#n722'>722</a>
<a id='n723' href='#n723'>723</a>
<a id='n724' href='#n724'>724</a>
<a id='n725' href='#n725'>725</a>
<a id='n726' href='#n726'>726</a>
<a id='n727' href='#n727'>727</a>
<a id='n728' href='#n728'>728</a>
<a id='n729' href='#n729'>729</a>
<a id='n730' href='#n730'>730</a>
<a id='n731' href='#n731'>731</a>
<a id='n732' href='#n732'>732</a>
<a id='n733' href='#n733'>733</a>
<a id='n734' href='#n734'>734</a>
<a id='n735' href='#n735'>735</a>
<a id='n736' href='#n736'>736</a>
<a id='n737' href='#n737'>737</a>
<a id='n738' href='#n738'>738</a>
<a id='n739' href='#n739'>739</a>
<a id='n740' href='#n740'>740</a>
<a id='n741' href='#n741'>741</a>
<a id='n742' href='#n742'>742</a>
<a id='n743' href='#n743'>743</a>
<a id='n744' href='#n744'>744</a>
<a id='n745' href='#n745'>745</a>
<a id='n746' href='#n746'>746</a>
<a id='n747' href='#n747'>747</a>
<a id='n748' href='#n748'>748</a>
<a id='n749' href='#n749'>749</a>
<a id='n750' href='#n750'>750</a>
<a id='n751' href='#n751'>751</a>
<a id='n752' href='#n752'>752</a>
<a id='n753' href='#n753'>753</a>
<a id='n754' href='#n754'>754</a>
<a id='n755' href='#n755'>755</a>
<a id='n756' href='#n756'>756</a>
<a id='n757' href='#n757'>757</a>
<a id='n758' href='#n758'>758</a>
<a id='n759' href='#n759'>759</a>
<a id='n760' href='#n760'>760</a>
<a id='n761' href='#n761'>761</a>
<a id='n762' href='#n762'>762</a>
<a id='n763' href='#n763'>763</a>
<a id='n764' href='#n764'>764</a>
<a id='n765' href='#n765'>765</a>
<a id='n766' href='#n766'>766</a>
<a id='n767' href='#n767'>767</a>
<a id='n768' href='#n768'>768</a>
<a id='n769' href='#n769'>769</a>
<a id='n770' href='#n770'>770</a>
<a id='n771' href='#n771'>771</a>
<a id='n772' href='#n772'>772</a>
<a id='n773' href='#n773'>773</a>
<a id='n774' href='#n774'>774</a>
<a id='n775' href='#n775'>775</a>
<a id='n776' href='#n776'>776</a>
<a id='n777' href='#n777'>777</a>
<a id='n778' href='#n778'>778</a>
<a id='n779' href='#n779'>779</a>
<a id='n780' href='#n780'>780</a>
<a id='n781' href='#n781'>781</a>
<a id='n782' href='#n782'>782</a>
<a id='n783' href='#n783'>783</a>
<a id='n784' href='#n784'>784</a>
<a id='n785' href='#n785'>785</a>
<a id='n786' href='#n786'>786</a>
<a id='n787' href='#n787'>787</a>
<a id='n788' href='#n788'>788</a>
<a id='n789' href='#n789'>789</a>
<a id='n790' href='#n790'>790</a>
<a id='n791' href='#n791'>791</a>
<a id='n792' href='#n792'>792</a>
<a id='n793' href='#n793'>793</a>
<a id='n794' href='#n794'>794</a>
<a id='n795' href='#n795'>795</a>
<a id='n796' href='#n796'>796</a>
<a id='n797' href='#n797'>797</a>
<a id='n798' href='#n798'>798</a>
<a id='n799' href='#n799'>799</a>
<a id='n800' href='#n800'>800</a>
<a id='n801' href='#n801'>801</a>
<a id='n802' href='#n802'>802</a>
<a id='n803' href='#n803'>803</a>
<a id='n804' href='#n804'>804</a>
<a id='n805' href='#n805'>805</a>
<a id='n806' href='#n806'>806</a>
<a id='n807' href='#n807'>807</a>
<a id='n808' href='#n808'>808</a>
<a id='n809' href='#n809'>809</a>
<a id='n810' href='#n810'>810</a>
<a id='n811' href='#n811'>811</a>
<a id='n812' href='#n812'>812</a>
<a id='n813' href='#n813'>813</a>
<a id='n814' href='#n814'>814</a>
<a id='n815' href='#n815'>815</a>
<a id='n816' href='#n816'>816</a>
<a id='n817' href='#n817'>817</a>
<a id='n818' href='#n818'>818</a>
<a id='n819' href='#n819'>819</a>
<a id='n820' href='#n820'>820</a>
<a id='n821' href='#n821'>821</a>
<a id='n822' href='#n822'>822</a>
<a id='n823' href='#n823'>823</a>
<a id='n824' href='#n824'>824</a>
<a id='n825' href='#n825'>825</a>
<a id='n826' href='#n826'>826</a>
<a id='n827' href='#n827'>827</a>
<a id='n828' href='#n828'>828</a>
<a id='n829' href='#n829'>829</a>
<a id='n830' href='#n830'>830</a>
<a id='n831' href='#n831'>831</a>
<a id='n832' href='#n832'>832</a>
<a id='n833' href='#n833'>833</a>
<a id='n834' href='#n834'>834</a>
<a id='n835' href='#n835'>835</a>
<a id='n836' href='#n836'>836</a>
<a id='n837' href='#n837'>837</a>
<a id='n838' href='#n838'>838</a>
<a id='n839' href='#n839'>839</a>
<a id='n840' href='#n840'>840</a>
<a id='n841' href='#n841'>841</a>
<a id='n842' href='#n842'>842</a>
<a id='n843' href='#n843'>843</a>
<a id='n844' href='#n844'>844</a>
<a id='n845' href='#n845'>845</a>
<a id='n846' href='#n846'>846</a>
<a id='n847' href='#n847'>847</a>
<a id='n848' href='#n848'>848</a>
<a id='n849' href='#n849'>849</a>
<a id='n850' href='#n850'>850</a>
<a id='n851' href='#n851'>851</a>
<a id='n852' href='#n852'>852</a>
<a id='n853' href='#n853'>853</a>
<a id='n854' href='#n854'>854</a>
<a id='n855' href='#n855'>855</a>
<a id='n856' href='#n856'>856</a>
<a id='n857' href='#n857'>857</a>
<a id='n858' href='#n858'>858</a>
<a id='n859' href='#n859'>859</a>
<a id='n860' href='#n860'>860</a>
<a id='n861' href='#n861'>861</a>
<a id='n862' href='#n862'>862</a>
<a id='n863' href='#n863'>863</a>
<a id='n864' href='#n864'>864</a>
<a id='n865' href='#n865'>865</a>
<a id='n866' href='#n866'>866</a>
<a id='n867' href='#n867'>867</a>
<a id='n868' href='#n868'>868</a>
<a id='n869' href='#n869'>869</a>
<a id='n870' href='#n870'>870</a>
<a id='n871' href='#n871'>871</a>
<a id='n872' href='#n872'>872</a>
<a id='n873' href='#n873'>873</a>
<a id='n874' href='#n874'>874</a>
<a id='n875' href='#n875'>875</a>
<a id='n876' href='#n876'>876</a>
<a id='n877' href='#n877'>877</a>
<a id='n878' href='#n878'>878</a>
<a id='n879' href='#n879'>879</a>
<a id='n880' href='#n880'>880</a>
<a id='n881' href='#n881'>881</a>
<a id='n882' href='#n882'>882</a>
<a id='n883' href='#n883'>883</a>
<a id='n884' href='#n884'>884</a>
<a id='n885' href='#n885'>885</a>
<a id='n886' href='#n886'>886</a>
<a id='n887' href='#n887'>887</a>
<a id='n888' href='#n888'>888</a>
<a id='n889' href='#n889'>889</a>
<a id='n890' href='#n890'>890</a>
<a id='n891' href='#n891'>891</a>
<a id='n892' href='#n892'>892</a>
<a id='n893' href='#n893'>893</a>
<a id='n894' href='#n894'>894</a>
<a id='n895' href='#n895'>895</a>
<a id='n896' href='#n896'>896</a>
<a id='n897' href='#n897'>897</a>
<a id='n898' href='#n898'>898</a>
<a id='n899' href='#n899'>899</a>
<a id='n900' href='#n900'>900</a>
<a id='n901' href='#n901'>901</a>
<a id='n902' href='#n902'>902</a>
<a id='n903' href='#n903'>903</a>
<a id='n904' href='#n904'>904</a>
<a id='n905' href='#n905'>905</a>
<a id='n906' href='#n906'>906</a>
<a id='n907' href='#n907'>907</a>
<a id='n908' href='#n908'>908</a>
<a id='n909' href='#n909'>909</a>
<a id='n910' href='#n910'>910</a>
<a id='n911' href='#n911'>911</a>
<a id='n912' href='#n912'>912</a>
<a id='n913' href='#n913'>913</a>
<a id='n914' href='#n914'>914</a>
<a id='n915' href='#n915'>915</a>
<a id='n916' href='#n916'>916</a>
<a id='n917' href='#n917'>917</a>
<a id='n918' href='#n918'>918</a>
<a id='n919' href='#n919'>919</a>
<a id='n920' href='#n920'>920</a>
<a id='n921' href='#n921'>921</a>
<a id='n922' href='#n922'>922</a>
<a id='n923' href='#n923'>923</a>
<a id='n924' href='#n924'>924</a>
<a id='n925' href='#n925'>925</a>
<a id='n926' href='#n926'>926</a>
<a id='n927' href='#n927'>927</a>
<a id='n928' href='#n928'>928</a>
<a id='n929' href='#n929'>929</a>
<a id='n930' href='#n930'>930</a>
<a id='n931' href='#n931'>931</a>
<a id='n932' href='#n932'>932</a>
<a id='n933' href='#n933'>933</a>
<a id='n934' href='#n934'>934</a>
<a id='n935' href='#n935'>935</a>
<a id='n936' href='#n936'>936</a>
<a id='n937' href='#n937'>937</a>
<a id='n938' href='#n938'>938</a>
<a id='n939' href='#n939'>939</a>
<a id='n940' href='#n940'>940</a>
<a id='n941' href='#n941'>941</a>
<a id='n942' href='#n942'>942</a>
<a id='n943' href='#n943'>943</a>
<a id='n944' href='#n944'>944</a>
<a id='n945' href='#n945'>945</a>
<a id='n946' href='#n946'>946</a>
<a id='n947' href='#n947'>947</a>
<a id='n948' href='#n948'>948</a>
<a id='n949' href='#n949'>949</a>
<a id='n950' href='#n950'>950</a>
<a id='n951' href='#n951'>951</a>
<a id='n952' href='#n952'>952</a>
<a id='n953' href='#n953'>953</a>
<a id='n954' href='#n954'>954</a>
<a id='n955' href='#n955'>955</a>
<a id='n956' href='#n956'>956</a>
<a id='n957' href='#n957'>957</a>
<a id='n958' href='#n958'>958</a>
<a id='n959' href='#n959'>959</a>
<a id='n960' href='#n960'>960</a>
<a id='n961' href='#n961'>961</a>
<a id='n962' href='#n962'>962</a>
<a id='n963' href='#n963'>963</a>
<a id='n964' href='#n964'>964</a>
<a id='n965' href='#n965'>965</a>
<a id='n966' href='#n966'>966</a>
<a id='n967' href='#n967'>967</a>
<a id='n968' href='#n968'>968</a>
<a id='n969' href='#n969'>969</a>
<a id='n970' href='#n970'>970</a>
<a id='n971' href='#n971'>971</a>
<a id='n972' href='#n972'>972</a>
<a id='n973' href='#n973'>973</a>
<a id='n974' href='#n974'>974</a>
<a id='n975' href='#n975'>975</a>
<a id='n976' href='#n976'>976</a>
<a id='n977' href='#n977'>977</a>
<a id='n978' href='#n978'>978</a>
<a id='n979' href='#n979'>979</a>
<a id='n980' href='#n980'>980</a>
<a id='n981' href='#n981'>981</a>
<a id='n982' href='#n982'>982</a>
<a id='n983' href='#n983'>983</a>
<a id='n984' href='#n984'>984</a>
<a id='n985' href='#n985'>985</a>
<a id='n986' href='#n986'>986</a>
<a id='n987' href='#n987'>987</a>
<a id='n988' href='#n988'>988</a>
<a id='n989' href='#n989'>989</a>
<a id='n990' href='#n990'>990</a>
<a id='n991' href='#n991'>991</a>
<a id='n992' href='#n992'>992</a>
<a id='n993' href='#n993'>993</a>
<a id='n994' href='#n994'>994</a>
<a id='n995' href='#n995'>995</a>
<a id='n996' href='#n996'>996</a>
<a id='n997' href='#n997'>997</a>
<a id='n998' href='#n998'>998</a>
<a id='n999' href='#n999'>999</a>
<a id='n1000' href='#n1000'>1000</a>
<a id='n1001' href='#n1001'>1001</a>
<a id='n1002' href='#n1002'>1002</a>
<a id='n1003' href='#n1003'>1003</a>
<a id='n1004' href='#n1004'>1004</a>
<a id='n1005' href='#n1005'>1005</a>
<a id='n1006' href='#n1006'>1006</a>
<a id='n1007' href='#n1007'>1007</a>
<a id='n1008' href='#n1008'>1008</a>
<a id='n1009' href='#n1009'>1009</a>
<a id='n1010' href='#n1010'>1010</a>
<a id='n1011' href='#n1011'>1011</a>
<a id='n1012' href='#n1012'>1012</a>
<a id='n1013' href='#n1013'>1013</a>
<a id='n1014' href='#n1014'>1014</a>
<a id='n1015' href='#n1015'>1015</a>
<a id='n1016' href='#n1016'>1016</a>
<a id='n1017' href='#n1017'>1017</a>
<a id='n1018' href='#n1018'>1018</a>
<a id='n1019' href='#n1019'>1019</a>
<a id='n1020' href='#n1020'>1020</a>
<a id='n1021' href='#n1021'>1021</a>
<a id='n1022' href='#n1022'>1022</a>
<a id='n1023' href='#n1023'>1023</a>
<a id='n1024' href='#n1024'>1024</a>
<a id='n1025' href='#n1025'>1025</a>
<a id='n1026' href='#n1026'>1026</a>
<a id='n1027' href='#n1027'>1027</a>
<a id='n1028' href='#n1028'>1028</a>
<a id='n1029' href='#n1029'>1029</a>
<a id='n1030' href='#n1030'>1030</a>
<a id='n1031' href='#n1031'>1031</a>
<a id='n1032' href='#n1032'>1032</a>
<a id='n1033' href='#n1033'>1033</a>
<a id='n1034' href='#n1034'>1034</a>
<a id='n1035' href='#n1035'>1035</a>
<a id='n1036' href='#n1036'>1036</a>
<a id='n1037' href='#n1037'>1037</a>
<a id='n1038' href='#n1038'>1038</a>
<a id='n1039' href='#n1039'>1039</a>
<a id='n1040' href='#n1040'>1040</a>
<a id='n1041' href='#n1041'>1041</a>
<a id='n1042' href='#n1042'>1042</a>
<a id='n1043' href='#n1043'>1043</a>
<a id='n1044' href='#n1044'>1044</a>
<a id='n1045' href='#n1045'>1045</a>
<a id='n1046' href='#n1046'>1046</a>
<a id='n1047' href='#n1047'>1047</a>
<a id='n1048' href='#n1048'>1048</a>
<a id='n1049' href='#n1049'>1049</a>
<a id='n1050' href='#n1050'>1050</a>
<a id='n1051' href='#n1051'>1051</a>
<a id='n1052' href='#n1052'>1052</a>
<a id='n1053' href='#n1053'>1053</a>
<a id='n1054' href='#n1054'>1054</a>
<a id='n1055' href='#n1055'>1055</a>
<a id='n1056' href='#n1056'>1056</a>
<a id='n1057' href='#n1057'>1057</a>
<a id='n1058' href='#n1058'>1058</a>
<a id='n1059' href='#n1059'>1059</a>
<a id='n1060' href='#n1060'>1060</a>
<a id='n1061' href='#n1061'>1061</a>
<a id='n1062' href='#n1062'>1062</a>
<a id='n1063' href='#n1063'>1063</a>
<a id='n1064' href='#n1064'>1064</a>
<a id='n1065' href='#n1065'>1065</a>
<a id='n1066' href='#n1066'>1066</a>
<a id='n1067' href='#n1067'>1067</a>
<a id='n1068' href='#n1068'>1068</a>
<a id='n1069' href='#n1069'>1069</a>
<a id='n1070' href='#n1070'>1070</a>
<a id='n1071' href='#n1071'>1071</a>
<a id='n1072' href='#n1072'>1072</a>
<a id='n1073' href='#n1073'>1073</a>
<a id='n1074' href='#n1074'>1074</a>
<a id='n1075' href='#n1075'>1075</a>
<a id='n1076' href='#n1076'>1076</a>
<a id='n1077' href='#n1077'>1077</a>
<a id='n1078' href='#n1078'>1078</a>
<a id='n1079' href='#n1079'>1079</a>
<a id='n1080' href='#n1080'>1080</a>
<a id='n1081' href='#n1081'>1081</a>
<a id='n1082' href='#n1082'>1082</a>
<a id='n1083' href='#n1083'>1083</a>
<a id='n1084' href='#n1084'>1084</a>
<a id='n1085' href='#n1085'>1085</a>
<a id='n1086' href='#n1086'>1086</a>
<a id='n1087' href='#n1087'>1087</a>
<a id='n1088' href='#n1088'>1088</a>
<a id='n1089' href='#n1089'>1089</a>
<a id='n1090' href='#n1090'>1090</a>
<a id='n1091' href='#n1091'>1091</a>
<a id='n1092' href='#n1092'>1092</a>
<a id='n1093' href='#n1093'>1093</a>
<a id='n1094' href='#n1094'>1094</a>
<a id='n1095' href='#n1095'>1095</a>
<a id='n1096' href='#n1096'>1096</a>
<a id='n1097' href='#n1097'>1097</a>
<a id='n1098' href='#n1098'>1098</a>
<a id='n1099' href='#n1099'>1099</a>
<a id='n1100' href='#n1100'>1100</a>
<a id='n1101' href='#n1101'>1101</a>
<a id='n1102' href='#n1102'>1102</a>
<a id='n1103' href='#n1103'>1103</a>
<a id='n1104' href='#n1104'>1104</a>
<a id='n1105' href='#n1105'>1105</a>
<a id='n1106' href='#n1106'>1106</a>
<a id='n1107' href='#n1107'>1107</a>
<a id='n1108' href='#n1108'>1108</a>
<a id='n1109' href='#n1109'>1109</a>
<a id='n1110' href='#n1110'>1110</a>
<a id='n1111' href='#n1111'>1111</a>
<a id='n1112' href='#n1112'>1112</a>
<a id='n1113' href='#n1113'>1113</a>
<a id='n1114' href='#n1114'>1114</a>
<a id='n1115' href='#n1115'>1115</a>
<a id='n1116' href='#n1116'>1116</a>
<a id='n1117' href='#n1117'>1117</a>
<a id='n1118' href='#n1118'>1118</a>
<a id='n1119' href='#n1119'>1119</a>
<a id='n1120' href='#n1120'>1120</a>
<a id='n1121' href='#n1121'>1121</a>
<a id='n1122' href='#n1122'>1122</a>
<a id='n1123' href='#n1123'>1123</a>
<a id='n1124' href='#n1124'>1124</a>
<a id='n1125' href='#n1125'>1125</a>
<a id='n1126' href='#n1126'>1126</a>
<a id='n1127' href='#n1127'>1127</a>
<a id='n1128' href='#n1128'>1128</a>
<a id='n1129' href='#n1129'>1129</a>
<a id='n1130' href='#n1130'>1130</a>
<a id='n1131' href='#n1131'>1131</a>
<a id='n1132' href='#n1132'>1132</a>
<a id='n1133' href='#n1133'>1133</a>
<a id='n1134' href='#n1134'>1134</a>
<a id='n1135' href='#n1135'>1135</a>
<a id='n1136' href='#n1136'>1136</a>
<a id='n1137' href='#n1137'>1137</a>
<a id='n1138' href='#n1138'>1138</a>
<a id='n1139' href='#n1139'>1139</a>
<a id='n1140' href='#n1140'>1140</a>
<a id='n1141' href='#n1141'>1141</a>
<a id='n1142' href='#n1142'>1142</a>
<a id='n1143' href='#n1143'>1143</a>
<a id='n1144' href='#n1144'>1144</a>
<a id='n1145' href='#n1145'>1145</a>
<a id='n1146' href='#n1146'>1146</a>
<a id='n1147' href='#n1147'>1147</a>
<a id='n1148' href='#n1148'>1148</a>
<a id='n1149' href='#n1149'>1149</a>
<a id='n1150' href='#n1150'>1150</a>
<a id='n1151' href='#n1151'>1151</a>
<a id='n1152' href='#n1152'>1152</a>
<a id='n1153' href='#n1153'>1153</a>
<a id='n1154' href='#n1154'>1154</a>
<a id='n1155' href='#n1155'>1155</a>
<a id='n1156' href='#n1156'>1156</a>
<a id='n1157' href='#n1157'>1157</a>
<a id='n1158' href='#n1158'>1158</a>
<a id='n1159' href='#n1159'>1159</a>
<a id='n1160' href='#n1160'>1160</a>
<a id='n1161' href='#n1161'>1161</a>
<a id='n1162' href='#n1162'>1162</a>
<a id='n1163' href='#n1163'>1163</a>
<a id='n1164' href='#n1164'>1164</a>
<a id='n1165' href='#n1165'>1165</a>
<a id='n1166' href='#n1166'>1166</a>
<a id='n1167' href='#n1167'>1167</a>
<a id='n1168' href='#n1168'>1168</a>
<a id='n1169' href='#n1169'>1169</a>
<a id='n1170' href='#n1170'>1170</a>
<a id='n1171' href='#n1171'>1171</a>
<a id='n1172' href='#n1172'>1172</a>
<a id='n1173' href='#n1173'>1173</a>
<a id='n1174' href='#n1174'>1174</a>
<a id='n1175' href='#n1175'>1175</a>
<a id='n1176' href='#n1176'>1176</a>
<a id='n1177' href='#n1177'>1177</a>
<a id='n1178' href='#n1178'>1178</a>
<a id='n1179' href='#n1179'>1179</a>
<a id='n1180' href='#n1180'>1180</a>
<a id='n1181' href='#n1181'>1181</a>
<a id='n1182' href='#n1182'>1182</a>
<a id='n1183' href='#n1183'>1183</a>
<a id='n1184' href='#n1184'>1184</a>
<a id='n1185' href='#n1185'>1185</a>
<a id='n1186' href='#n1186'>1186</a>
<a id='n1187' href='#n1187'>1187</a>
<a id='n1188' href='#n1188'>1188</a>
<a id='n1189' href='#n1189'>1189</a>
<a id='n1190' href='#n1190'>1190</a>
<a id='n1191' href='#n1191'>1191</a>
<a id='n1192' href='#n1192'>1192</a>
<a id='n1193' href='#n1193'>1193</a>
<a id='n1194' href='#n1194'>1194</a>
<a id='n1195' href='#n1195'>1195</a>
<a id='n1196' href='#n1196'>1196</a>
<a id='n1197' href='#n1197'>1197</a>
<a id='n1198' href='#n1198'>1198</a>
<a id='n1199' href='#n1199'>1199</a>
<a id='n1200' href='#n1200'>1200</a>
<a id='n1201' href='#n1201'>1201</a>
<a id='n1202' href='#n1202'>1202</a>
<a id='n1203' href='#n1203'>1203</a>
<a id='n1204' href='#n1204'>1204</a>
<a id='n1205' href='#n1205'>1205</a>
<a id='n1206' href='#n1206'>1206</a>
<a id='n1207' href='#n1207'>1207</a>
<a id='n1208' href='#n1208'>1208</a>
<a id='n1209' href='#n1209'>1209</a>
<a id='n1210' href='#n1210'>1210</a>
<a id='n1211' href='#n1211'>1211</a>
<a id='n1212' href='#n1212'>1212</a>
<a id='n1213' href='#n1213'>1213</a>
<a id='n1214' href='#n1214'>1214</a>
<a id='n1215' href='#n1215'>1215</a>
<a id='n1216' href='#n1216'>1216</a>
<a id='n1217' href='#n1217'>1217</a>
<a id='n1218' href='#n1218'>1218</a>
<a id='n1219' href='#n1219'>1219</a>
<a id='n1220' href='#n1220'>1220</a>
<a id='n1221' href='#n1221'>1221</a>
<a id='n1222' href='#n1222'>1222</a>
<a id='n1223' href='#n1223'>1223</a>
<a id='n1224' href='#n1224'>1224</a>
<a id='n1225' href='#n1225'>1225</a>
<a id='n1226' href='#n1226'>1226</a>
<a id='n1227' href='#n1227'>1227</a>
<a id='n1228' href='#n1228'>1228</a>
<a id='n1229' href='#n1229'>1229</a>
<a id='n1230' href='#n1230'>1230</a>
<a id='n1231' href='#n1231'>1231</a>
<a id='n1232' href='#n1232'>1232</a>
<a id='n1233' href='#n1233'>1233</a>
<a id='n1234' href='#n1234'>1234</a>
<a id='n1235' href='#n1235'>1235</a>
<a id='n1236' href='#n1236'>1236</a>
<a id='n1237' href='#n1237'>1237</a>
<a id='n1238' href='#n1238'>1238</a>
<a id='n1239' href='#n1239'>1239</a>
<a id='n1240' href='#n1240'>1240</a>
<a id='n1241' href='#n1241'>1241</a>
<a id='n1242' href='#n1242'>1242</a>
<a id='n1243' href='#n1243'>1243</a>
<a id='n1244' href='#n1244'>1244</a>
<a id='n1245' href='#n1245'>1245</a>
<a id='n1246' href='#n1246'>1246</a>
<a id='n1247' href='#n1247'>1247</a>
<a id='n1248' href='#n1248'>1248</a>
<a id='n1249' href='#n1249'>1249</a>
<a id='n1250' href='#n1250'>1250</a>
<a id='n1251' href='#n1251'>1251</a>
<a id='n1252' href='#n1252'>1252</a>
<a id='n1253' href='#n1253'>1253</a>
<a id='n1254' href='#n1254'>1254</a>
<a id='n1255' href='#n1255'>1255</a>
<a id='n1256' href='#n1256'>1256</a>
<a id='n1257' href='#n1257'>1257</a>
<a id='n1258' href='#n1258'>1258</a>
<a id='n1259' href='#n1259'>1259</a>
<a id='n1260' href='#n1260'>1260</a>
<a id='n1261' href='#n1261'>1261</a>
<a id='n1262' href='#n1262'>1262</a>
<a id='n1263' href='#n1263'>1263</a>
<a id='n1264' href='#n1264'>1264</a>
<a id='n1265' href='#n1265'>1265</a>
<a id='n1266' href='#n1266'>1266</a>
<a id='n1267' href='#n1267'>1267</a>
<a id='n1268' href='#n1268'>1268</a>
<a id='n1269' href='#n1269'>1269</a>
<a id='n1270' href='#n1270'>1270</a>
<a id='n1271' href='#n1271'>1271</a>
<a id='n1272' href='#n1272'>1272</a>
<a id='n1273' href='#n1273'>1273</a>
<a id='n1274' href='#n1274'>1274</a>
<a id='n1275' href='#n1275'>1275</a>
<a id='n1276' href='#n1276'>1276</a>
<a id='n1277' href='#n1277'>1277</a>
<a id='n1278' href='#n1278'>1278</a>
<a id='n1279' href='#n1279'>1279</a>
<a id='n1280' href='#n1280'>1280</a>
<a id='n1281' href='#n1281'>1281</a>
<a id='n1282' href='#n1282'>1282</a>
<a id='n1283' href='#n1283'>1283</a>
<a id='n1284' href='#n1284'>1284</a>
<a id='n1285' href='#n1285'>1285</a>
<a id='n1286' href='#n1286'>1286</a>
<a id='n1287' href='#n1287'>1287</a>
<a id='n1288' href='#n1288'>1288</a>
<a id='n1289' href='#n1289'>1289</a>
<a id='n1290' href='#n1290'>1290</a>
<a id='n1291' href='#n1291'>1291</a>
<a id='n1292' href='#n1292'>1292</a>
<a id='n1293' href='#n1293'>1293</a>
<a id='n1294' href='#n1294'>1294</a>
<a id='n1295' href='#n1295'>1295</a>
<a id='n1296' href='#n1296'>1296</a>
<a id='n1297' href='#n1297'>1297</a>
<a id='n1298' href='#n1298'>1298</a>
<a id='n1299' href='#n1299'>1299</a>
<a id='n1300' href='#n1300'>1300</a>
<a id='n1301' href='#n1301'>1301</a>
<a id='n1302' href='#n1302'>1302</a>
<a id='n1303' href='#n1303'>1303</a>
<a id='n1304' href='#n1304'>1304</a>
<a id='n1305' href='#n1305'>1305</a>
<a id='n1306' href='#n1306'>1306</a>
<a id='n1307' href='#n1307'>1307</a>
<a id='n1308' href='#n1308'>1308</a>
<a id='n1309' href='#n1309'>1309</a>
<a id='n1310' href='#n1310'>1310</a>
<a id='n1311' href='#n1311'>1311</a>
<a id='n1312' href='#n1312'>1312</a>
<a id='n1313' href='#n1313'>1313</a>
<a id='n1314' href='#n1314'>1314</a>
<a id='n1315' href='#n1315'>1315</a>
<a id='n1316' href='#n1316'>1316</a>
<a id='n1317' href='#n1317'>1317</a>
<a id='n1318' href='#n1318'>1318</a>
<a id='n1319' href='#n1319'>1319</a>
<a id='n1320' href='#n1320'>1320</a>
<a id='n1321' href='#n1321'>1321</a>
<a id='n1322' href='#n1322'>1322</a>
<a id='n1323' href='#n1323'>1323</a>
<a id='n1324' href='#n1324'>1324</a>
<a id='n1325' href='#n1325'>1325</a>
<a id='n1326' href='#n1326'>1326</a>
<a id='n1327' href='#n1327'>1327</a>
<a id='n1328' href='#n1328'>1328</a>
<a id='n1329' href='#n1329'>1329</a>
<a id='n1330' href='#n1330'>1330</a>
<a id='n1331' href='#n1331'>1331</a>
<a id='n1332' href='#n1332'>1332</a>
<a id='n1333' href='#n1333'>1333</a>
<a id='n1334' href='#n1334'>1334</a>
<a id='n1335' href='#n1335'>1335</a>
<a id='n1336' href='#n1336'>1336</a>
<a id='n1337' href='#n1337'>1337</a>
<a id='n1338' href='#n1338'>1338</a>
<a id='n1339' href='#n1339'>1339</a>
<a id='n1340' href='#n1340'>1340</a>
<a id='n1341' href='#n1341'>1341</a>
<a id='n1342' href='#n1342'>1342</a>
<a id='n1343' href='#n1343'>1343</a>
<a id='n1344' href='#n1344'>1344</a>
<a id='n1345' href='#n1345'>1345</a>
<a id='n1346' href='#n1346'>1346</a>
<a id='n1347' href='#n1347'>1347</a>
<a id='n1348' href='#n1348'>1348</a>
<a id='n1349' href='#n1349'>1349</a>
<a id='n1350' href='#n1350'>1350</a>
<a id='n1351' href='#n1351'>1351</a>
<a id='n1352' href='#n1352'>1352</a>
<a id='n1353' href='#n1353'>1353</a>
<a id='n1354' href='#n1354'>1354</a>
<a id='n1355' href='#n1355'>1355</a>
<a id='n1356' href='#n1356'>1356</a>
<a id='n1357' href='#n1357'>1357</a>
<a id='n1358' href='#n1358'>1358</a>
<a id='n1359' href='#n1359'>1359</a>
<a id='n1360' href='#n1360'>1360</a>
<a id='n1361' href='#n1361'>1361</a>
<a id='n1362' href='#n1362'>1362</a>
<a id='n1363' href='#n1363'>1363</a>
<a id='n1364' href='#n1364'>1364</a>
<a id='n1365' href='#n1365'>1365</a>
<a id='n1366' href='#n1366'>1366</a>
<a id='n1367' href='#n1367'>1367</a>
<a id='n1368' href='#n1368'>1368</a>
<a id='n1369' href='#n1369'>1369</a>
<a id='n1370' href='#n1370'>1370</a>
<a id='n1371' href='#n1371'>1371</a>
<a id='n1372' href='#n1372'>1372</a>
<a id='n1373' href='#n1373'>1373</a>
<a id='n1374' href='#n1374'>1374</a>
<a id='n1375' href='#n1375'>1375</a>
<a id='n1376' href='#n1376'>1376</a>
<a id='n1377' href='#n1377'>1377</a>
<a id='n1378' href='#n1378'>1378</a>
<a id='n1379' href='#n1379'>1379</a>
<a id='n1380' href='#n1380'>1380</a>
<a id='n1381' href='#n1381'>1381</a>
<a id='n1382' href='#n1382'>1382</a>
<a id='n1383' href='#n1383'>1383</a>
<a id='n1384' href='#n1384'>1384</a>
<a id='n1385' href='#n1385'>1385</a>
<a id='n1386' href='#n1386'>1386</a>
<a id='n1387' href='#n1387'>1387</a>
<a id='n1388' href='#n1388'>1388</a>
<a id='n1389' href='#n1389'>1389</a>
<a id='n1390' href='#n1390'>1390</a>
<a id='n1391' href='#n1391'>1391</a>
<a id='n1392' href='#n1392'>1392</a>
<a id='n1393' href='#n1393'>1393</a>
<a id='n1394' href='#n1394'>1394</a>
<a id='n1395' href='#n1395'>1395</a>
<a id='n1396' href='#n1396'>1396</a>
<a id='n1397' href='#n1397'>1397</a>
<a id='n1398' href='#n1398'>1398</a>
<a id='n1399' href='#n1399'>1399</a>
<a id='n1400' href='#n1400'>1400</a>
<a id='n1401' href='#n1401'>1401</a>
<a id='n1402' href='#n1402'>1402</a>
<a id='n1403' href='#n1403'>1403</a>
<a id='n1404' href='#n1404'>1404</a>
<a id='n1405' href='#n1405'>1405</a>
<a id='n1406' href='#n1406'>1406</a>
<a id='n1407' href='#n1407'>1407</a>
<a id='n1408' href='#n1408'>1408</a>
<a id='n1409' href='#n1409'>1409</a>
<a id='n1410' href='#n1410'>1410</a>
<a id='n1411' href='#n1411'>1411</a>
<a id='n1412' href='#n1412'>1412</a>
<a id='n1413' href='#n1413'>1413</a>
<a id='n1414' href='#n1414'>1414</a>
<a id='n1415' href='#n1415'>1415</a>
<a id='n1416' href='#n1416'>1416</a>
<a id='n1417' href='#n1417'>1417</a>
<a id='n1418' href='#n1418'>1418</a>
<a id='n1419' href='#n1419'>1419</a>
<a id='n1420' href='#n1420'>1420</a>
<a id='n1421' href='#n1421'>1421</a>
<a id='n1422' href='#n1422'>1422</a>
<a id='n1423' href='#n1423'>1423</a>
<a id='n1424' href='#n1424'>1424</a>
<a id='n1425' href='#n1425'>1425</a>
<a id='n1426' href='#n1426'>1426</a>
<a id='n1427' href='#n1427'>1427</a>
<a id='n1428' href='#n1428'>1428</a>
<a id='n1429' href='#n1429'>1429</a>
<a id='n1430' href='#n1430'>1430</a>
<a id='n1431' href='#n1431'>1431</a>
<a id='n1432' href='#n1432'>1432</a>
<a id='n1433' href='#n1433'>1433</a>
<a id='n1434' href='#n1434'>1434</a>
<a id='n1435' href='#n1435'>1435</a>
<a id='n1436' href='#n1436'>1436</a>
<a id='n1437' href='#n1437'>1437</a>
<a id='n1438' href='#n1438'>1438</a>
<a id='n1439' href='#n1439'>1439</a>
<a id='n1440' href='#n1440'>1440</a>
<a id='n1441' href='#n1441'>1441</a>
<a id='n1442' href='#n1442'>1442</a>
<a id='n1443' href='#n1443'>1443</a>
<a id='n1444' href='#n1444'>1444</a>
<a id='n1445' href='#n1445'>1445</a>
<a id='n1446' href='#n1446'>1446</a>
<a id='n1447' href='#n1447'>1447</a>
<a id='n1448' href='#n1448'>1448</a>
<a id='n1449' href='#n1449'>1449</a>
<a id='n1450' href='#n1450'>1450</a>
<a id='n1451' href='#n1451'>1451</a>
<a id='n1452' href='#n1452'>1452</a>
<a id='n1453' href='#n1453'>1453</a>
<a id='n1454' href='#n1454'>1454</a>
<a id='n1455' href='#n1455'>1455</a>
<a id='n1456' href='#n1456'>1456</a>
<a id='n1457' href='#n1457'>1457</a>
<a id='n1458' href='#n1458'>1458</a>
<a id='n1459' href='#n1459'>1459</a>
<a id='n1460' href='#n1460'>1460</a>
<a id='n1461' href='#n1461'>1461</a>
<a id='n1462' href='#n1462'>1462</a>
<a id='n1463' href='#n1463'>1463</a>
<a id='n1464' href='#n1464'>1464</a>
<a id='n1465' href='#n1465'>1465</a>
<a id='n1466' href='#n1466'>1466</a>
<a id='n1467' href='#n1467'>1467</a>
<a id='n1468' href='#n1468'>1468</a>
<a id='n1469' href='#n1469'>1469</a>
<a id='n1470' href='#n1470'>1470</a>
<a id='n1471' href='#n1471'>1471</a>
<a id='n1472' href='#n1472'>1472</a>
<a id='n1473' href='#n1473'>1473</a>
<a id='n1474' href='#n1474'>1474</a>
<a id='n1475' href='#n1475'>1475</a>
<a id='n1476' href='#n1476'>1476</a>
<a id='n1477' href='#n1477'>1477</a>
<a id='n1478' href='#n1478'>1478</a>
<a id='n1479' href='#n1479'>1479</a>
<a id='n1480' href='#n1480'>1480</a>
<a id='n1481' href='#n1481'>1481</a>
<a id='n1482' href='#n1482'>1482</a>
<a id='n1483' href='#n1483'>1483</a>
<a id='n1484' href='#n1484'>1484</a>
<a id='n1485' href='#n1485'>1485</a>
<a id='n1486' href='#n1486'>1486</a>
<a id='n1487' href='#n1487'>1487</a>
<a id='n1488' href='#n1488'>1488</a>
<a id='n1489' href='#n1489'>1489</a>
<a id='n1490' href='#n1490'>1490</a>
<a id='n1491' href='#n1491'>1491</a>
<a id='n1492' href='#n1492'>1492</a>
<a id='n1493' href='#n1493'>1493</a>
<a id='n1494' href='#n1494'>1494</a>
<a id='n1495' href='#n1495'>1495</a>
<a id='n1496' href='#n1496'>1496</a>
<a id='n1497' href='#n1497'>1497</a>
<a id='n1498' href='#n1498'>1498</a>
<a id='n1499' href='#n1499'>1499</a>
<a id='n1500' href='#n1500'>1500</a>
<a id='n1501' href='#n1501'>1501</a>
<a id='n1502' href='#n1502'>1502</a>
<a id='n1503' href='#n1503'>1503</a>
<a id='n1504' href='#n1504'>1504</a>
<a id='n1505' href='#n1505'>1505</a>
<a id='n1506' href='#n1506'>1506</a>
<a id='n1507' href='#n1507'>1507</a>
<a id='n1508' href='#n1508'>1508</a>
<a id='n1509' href='#n1509'>1509</a>
<a id='n1510' href='#n1510'>1510</a>
<a id='n1511' href='#n1511'>1511</a>
<a id='n1512' href='#n1512'>1512</a>
<a id='n1513' href='#n1513'>1513</a>
<a id='n1514' href='#n1514'>1514</a>
<a id='n1515' href='#n1515'>1515</a>
<a id='n1516' href='#n1516'>1516</a>
<a id='n1517' href='#n1517'>1517</a>
<a id='n1518' href='#n1518'>1518</a>
<a id='n1519' href='#n1519'>1519</a>
<a id='n1520' href='#n1520'>1520</a>
<a id='n1521' href='#n1521'>1521</a>
<a id='n1522' href='#n1522'>1522</a>
<a id='n1523' href='#n1523'>1523</a>
<a id='n1524' href='#n1524'>1524</a>
<a id='n1525' href='#n1525'>1525</a>
<a id='n1526' href='#n1526'>1526</a>
<a id='n1527' href='#n1527'>1527</a>
<a id='n1528' href='#n1528'>1528</a>
<a id='n1529' href='#n1529'>1529</a>
<a id='n1530' href='#n1530'>1530</a>
<a id='n1531' href='#n1531'>1531</a>
<a id='n1532' href='#n1532'>1532</a>
<a id='n1533' href='#n1533'>1533</a>
<a id='n1534' href='#n1534'>1534</a>
<a id='n1535' href='#n1535'>1535</a>
<a id='n1536' href='#n1536'>1536</a>
<a id='n1537' href='#n1537'>1537</a>
<a id='n1538' href='#n1538'>1538</a>
<a id='n1539' href='#n1539'>1539</a>
<a id='n1540' href='#n1540'>1540</a>
<a id='n1541' href='#n1541'>1541</a>
<a id='n1542' href='#n1542'>1542</a>
<a id='n1543' href='#n1543'>1543</a>
<a id='n1544' href='#n1544'>1544</a>
<a id='n1545' href='#n1545'>1545</a>
<a id='n1546' href='#n1546'>1546</a>
<a id='n1547' href='#n1547'>1547</a>
<a id='n1548' href='#n1548'>1548</a>
<a id='n1549' href='#n1549'>1549</a>
<a id='n1550' href='#n1550'>1550</a>
<a id='n1551' href='#n1551'>1551</a>
<a id='n1552' href='#n1552'>1552</a>
<a id='n1553' href='#n1553'>1553</a>
<a id='n1554' href='#n1554'>1554</a>
<a id='n1555' href='#n1555'>1555</a>
<a id='n1556' href='#n1556'>1556</a>
<a id='n1557' href='#n1557'>1557</a>
<a id='n1558' href='#n1558'>1558</a>
<a id='n1559' href='#n1559'>1559</a>
<a id='n1560' href='#n1560'>1560</a>
<a id='n1561' href='#n1561'>1561</a>
<a id='n1562' href='#n1562'>1562</a>
<a id='n1563' href='#n1563'>1563</a>
<a id='n1564' href='#n1564'>1564</a>
<a id='n1565' href='#n1565'>1565</a>
<a id='n1566' href='#n1566'>1566</a>
<a id='n1567' href='#n1567'>1567</a>
<a id='n1568' href='#n1568'>1568</a>
<a id='n1569' href='#n1569'>1569</a>
<a id='n1570' href='#n1570'>1570</a>
<a id='n1571' href='#n1571'>1571</a>
<a id='n1572' href='#n1572'>1572</a>
<a id='n1573' href='#n1573'>1573</a>
<a id='n1574' href='#n1574'>1574</a>
<a id='n1575' href='#n1575'>1575</a>
<a id='n1576' href='#n1576'>1576</a>
<a id='n1577' href='#n1577'>1577</a>
<a id='n1578' href='#n1578'>1578</a>
<a id='n1579' href='#n1579'>1579</a>
<a id='n1580' href='#n1580'>1580</a>
<a id='n1581' href='#n1581'>1581</a>
<a id='n1582' href='#n1582'>1582</a>
<a id='n1583' href='#n1583'>1583</a>
<a id='n1584' href='#n1584'>1584</a>
<a id='n1585' href='#n1585'>1585</a>
<a id='n1586' href='#n1586'>1586</a>
<a id='n1587' href='#n1587'>1587</a>
<a id='n1588' href='#n1588'>1588</a>
<a id='n1589' href='#n1589'>1589</a>
<a id='n1590' href='#n1590'>1590</a>
<a id='n1591' href='#n1591'>1591</a>
<a id='n1592' href='#n1592'>1592</a>
<a id='n1593' href='#n1593'>1593</a>
<a id='n1594' href='#n1594'>1594</a>
<a id='n1595' href='#n1595'>1595</a>
<a id='n1596' href='#n1596'>1596</a>
<a id='n1597' href='#n1597'>1597</a>
<a id='n1598' href='#n1598'>1598</a>
<a id='n1599' href='#n1599'>1599</a>
<a id='n1600' href='#n1600'>1600</a>
<a id='n1601' href='#n1601'>1601</a>
<a id='n1602' href='#n1602'>1602</a>
<a id='n1603' href='#n1603'>1603</a>
<a id='n1604' href='#n1604'>1604</a>
<a id='n1605' href='#n1605'>1605</a>
<a id='n1606' href='#n1606'>1606</a>
<a id='n1607' href='#n1607'>1607</a>
<a id='n1608' href='#n1608'>1608</a>
<a id='n1609' href='#n1609'>1609</a>
<a id='n1610' href='#n1610'>1610</a>
<a id='n1611' href='#n1611'>1611</a>
<a id='n1612' href='#n1612'>1612</a>
<a id='n1613' href='#n1613'>1613</a>
<a id='n1614' href='#n1614'>1614</a>
<a id='n1615' href='#n1615'>1615</a>
<a id='n1616' href='#n1616'>1616</a>
<a id='n1617' href='#n1617'>1617</a>
<a id='n1618' href='#n1618'>1618</a>
<a id='n1619' href='#n1619'>1619</a>
<a id='n1620' href='#n1620'>1620</a>
<a id='n1621' href='#n1621'>1621</a>
<a id='n1622' href='#n1622'>1622</a>
<a id='n1623' href='#n1623'>1623</a>
<a id='n1624' href='#n1624'>1624</a>
<a id='n1625' href='#n1625'>1625</a>
<a id='n1626' href='#n1626'>1626</a>
<a id='n1627' href='#n1627'>1627</a>
<a id='n1628' href='#n1628'>1628</a>
<a id='n1629' href='#n1629'>1629</a>
<a id='n1630' href='#n1630'>1630</a>
<a id='n1631' href='#n1631'>1631</a>
<a id='n1632' href='#n1632'>1632</a>
<a id='n1633' href='#n1633'>1633</a>
<a id='n1634' href='#n1634'>1634</a>
<a id='n1635' href='#n1635'>1635</a>
<a id='n1636' href='#n1636'>1636</a>
<a id='n1637' href='#n1637'>1637</a>
<a id='n1638' href='#n1638'>1638</a>
<a id='n1639' href='#n1639'>1639</a>
<a id='n1640' href='#n1640'>1640</a>
<a id='n1641' href='#n1641'>1641</a>
<a id='n1642' href='#n1642'>1642</a>
<a id='n1643' href='#n1643'>1643</a>
<a id='n1644' href='#n1644'>1644</a>
<a id='n1645' href='#n1645'>1645</a>
<a id='n1646' href='#n1646'>1646</a>
<a id='n1647' href='#n1647'>1647</a>
<a id='n1648' href='#n1648'>1648</a>
<a id='n1649' href='#n1649'>1649</a>
<a id='n1650' href='#n1650'>1650</a>
<a id='n1651' href='#n1651'>1651</a>
<a id='n1652' href='#n1652'>1652</a>
<a id='n1653' href='#n1653'>1653</a>
<a id='n1654' href='#n1654'>1654</a>
<a id='n1655' href='#n1655'>1655</a>
<a id='n1656' href='#n1656'>1656</a>
<a id='n1657' href='#n1657'>1657</a>
<a id='n1658' href='#n1658'>1658</a>
<a id='n1659' href='#n1659'>1659</a>
<a id='n1660' href='#n1660'>1660</a>
<a id='n1661' href='#n1661'>1661</a>
<a id='n1662' href='#n1662'>1662</a>
<a id='n1663' href='#n1663'>1663</a>
<a id='n1664' href='#n1664'>1664</a>
<a id='n1665' href='#n1665'>1665</a>
<a id='n1666' href='#n1666'>1666</a>
<a id='n1667' href='#n1667'>1667</a>
<a id='n1668' href='#n1668'>1668</a>
<a id='n1669' href='#n1669'>1669</a>
<a id='n1670' href='#n1670'>1670</a>
<a id='n1671' href='#n1671'>1671</a>
<a id='n1672' href='#n1672'>1672</a>
<a id='n1673' href='#n1673'>1673</a>
<a id='n1674' href='#n1674'>1674</a>
<a id='n1675' href='#n1675'>1675</a>
<a id='n1676' href='#n1676'>1676</a>
<a id='n1677' href='#n1677'>1677</a>
<a id='n1678' href='#n1678'>1678</a>
<a id='n1679' href='#n1679'>1679</a>
<a id='n1680' href='#n1680'>1680</a>
<a id='n1681' href='#n1681'>1681</a>
<a id='n1682' href='#n1682'>1682</a>
<a id='n1683' href='#n1683'>1683</a>
<a id='n1684' href='#n1684'>1684</a>
<a id='n1685' href='#n1685'>1685</a>
<a id='n1686' href='#n1686'>1686</a>
<a id='n1687' href='#n1687'>1687</a>
<a id='n1688' href='#n1688'>1688</a>
<a id='n1689' href='#n1689'>1689</a>
<a id='n1690' href='#n1690'>1690</a>
<a id='n1691' href='#n1691'>1691</a>
<a id='n1692' href='#n1692'>1692</a>
<a id='n1693' href='#n1693'>1693</a>
<a id='n1694' href='#n1694'>1694</a>
<a id='n1695' href='#n1695'>1695</a>
<a id='n1696' href='#n1696'>1696</a>
<a id='n1697' href='#n1697'>1697</a>
<a id='n1698' href='#n1698'>1698</a>
<a id='n1699' href='#n1699'>1699</a>
<a id='n1700' href='#n1700'>1700</a>
<a id='n1701' href='#n1701'>1701</a>
<a id='n1702' href='#n1702'>1702</a>
<a id='n1703' href='#n1703'>1703</a>
<a id='n1704' href='#n1704'>1704</a>
<a id='n1705' href='#n1705'>1705</a>
<a id='n1706' href='#n1706'>1706</a>
<a id='n1707' href='#n1707'>1707</a>
<a id='n1708' href='#n1708'>1708</a>
<a id='n1709' href='#n1709'>1709</a>
<a id='n1710' href='#n1710'>1710</a>
<a id='n1711' href='#n1711'>1711</a>
<a id='n1712' href='#n1712'>1712</a>
<a id='n1713' href='#n1713'>1713</a>
<a id='n1714' href='#n1714'>1714</a>
<a id='n1715' href='#n1715'>1715</a>
<a id='n1716' href='#n1716'>1716</a>
<a id='n1717' href='#n1717'>1717</a>
<a id='n1718' href='#n1718'>1718</a>
<a id='n1719' href='#n1719'>1719</a>
<a id='n1720' href='#n1720'>1720</a>
<a id='n1721' href='#n1721'>1721</a>
<a id='n1722' href='#n1722'>1722</a>
<a id='n1723' href='#n1723'>1723</a>
<a id='n1724' href='#n1724'>1724</a>
<a id='n1725' href='#n1725'>1725</a>
<a id='n1726' href='#n1726'>1726</a>
<a id='n1727' href='#n1727'>1727</a>
<a id='n1728' href='#n1728'>1728</a>
<a id='n1729' href='#n1729'>1729</a>
<a id='n1730' href='#n1730'>1730</a>
<a id='n1731' href='#n1731'>1731</a>
<a id='n1732' href='#n1732'>1732</a>
<a id='n1733' href='#n1733'>1733</a>
<a id='n1734' href='#n1734'>1734</a>
<a id='n1735' href='#n1735'>1735</a>
<a id='n1736' href='#n1736'>1736</a>
<a id='n1737' href='#n1737'>1737</a>
<a id='n1738' href='#n1738'>1738</a>
<a id='n1739' href='#n1739'>1739</a>
<a id='n1740' href='#n1740'>1740</a>
<a id='n1741' href='#n1741'>1741</a>
<a id='n1742' href='#n1742'>1742</a>
<a id='n1743' href='#n1743'>1743</a>
<a id='n1744' href='#n1744'>1744</a>
<a id='n1745' href='#n1745'>1745</a>
<a id='n1746' href='#n1746'>1746</a>
<a id='n1747' href='#n1747'>1747</a>
<a id='n1748' href='#n1748'>1748</a>
<a id='n1749' href='#n1749'>1749</a>
<a id='n1750' href='#n1750'>1750</a>
<a id='n1751' href='#n1751'>1751</a>
<a id='n1752' href='#n1752'>1752</a>
<a id='n1753' href='#n1753'>1753</a>
<a id='n1754' href='#n1754'>1754</a>
<a id='n1755' href='#n1755'>1755</a>
<a id='n1756' href='#n1756'>1756</a>
<a id='n1757' href='#n1757'>1757</a>
<a id='n1758' href='#n1758'>1758</a>
<a id='n1759' href='#n1759'>1759</a>
<a id='n1760' href='#n1760'>1760</a>
<a id='n1761' href='#n1761'>1761</a>
<a id='n1762' href='#n1762'>1762</a>
<a id='n1763' href='#n1763'>1763</a>
<a id='n1764' href='#n1764'>1764</a>
<a id='n1765' href='#n1765'>1765</a>
<a id='n1766' href='#n1766'>1766</a>
<a id='n1767' href='#n1767'>1767</a>
<a id='n1768' href='#n1768'>1768</a>
<a id='n1769' href='#n1769'>1769</a>
<a id='n1770' href='#n1770'>1770</a>
<a id='n1771' href='#n1771'>1771</a>
<a id='n1772' href='#n1772'>1772</a>
<a id='n1773' href='#n1773'>1773</a>
<a id='n1774' href='#n1774'>1774</a>
<a id='n1775' href='#n1775'>1775</a>
<a id='n1776' href='#n1776'>1776</a>
<a id='n1777' href='#n1777'>1777</a>
<a id='n1778' href='#n1778'>1778</a>
<a id='n1779' href='#n1779'>1779</a>
<a id='n1780' href='#n1780'>1780</a>
<a id='n1781' href='#n1781'>1781</a>
<a id='n1782' href='#n1782'>1782</a>
<a id='n1783' href='#n1783'>1783</a>
<a id='n1784' href='#n1784'>1784</a>
<a id='n1785' href='#n1785'>1785</a>
<a id='n1786' href='#n1786'>1786</a>
<a id='n1787' href='#n1787'>1787</a>
<a id='n1788' href='#n1788'>1788</a>
<a id='n1789' href='#n1789'>1789</a>
<a id='n1790' href='#n1790'>1790</a>
<a id='n1791' href='#n1791'>1791</a>
<a id='n1792' href='#n1792'>1792</a>
<a id='n1793' href='#n1793'>1793</a>
<a id='n1794' href='#n1794'>1794</a>
<a id='n1795' href='#n1795'>1795</a>
<a id='n1796' href='#n1796'>1796</a>
<a id='n1797' href='#n1797'>1797</a>
<a id='n1798' href='#n1798'>1798</a>
<a id='n1799' href='#n1799'>1799</a>
<a id='n1800' href='#n1800'>1800</a>
<a id='n1801' href='#n1801'>1801</a>
<a id='n1802' href='#n1802'>1802</a>
<a id='n1803' href='#n1803'>1803</a>
<a id='n1804' href='#n1804'>1804</a>
<a id='n1805' href='#n1805'>1805</a>
<a id='n1806' href='#n1806'>1806</a>
<a id='n1807' href='#n1807'>1807</a>
<a id='n1808' href='#n1808'>1808</a>
<a id='n1809' href='#n1809'>1809</a>
<a id='n1810' href='#n1810'>1810</a>
<a id='n1811' href='#n1811'>1811</a>
<a id='n1812' href='#n1812'>1812</a>
<a id='n1813' href='#n1813'>1813</a>
<a id='n1814' href='#n1814'>1814</a>
<a id='n1815' href='#n1815'>1815</a>
<a id='n1816' href='#n1816'>1816</a>
<a id='n1817' href='#n1817'>1817</a>
<a id='n1818' href='#n1818'>1818</a>
<a id='n1819' href='#n1819'>1819</a>
<a id='n1820' href='#n1820'>1820</a>
<a id='n1821' href='#n1821'>1821</a>
<a id='n1822' href='#n1822'>1822</a>
<a id='n1823' href='#n1823'>1823</a>
<a id='n1824' href='#n1824'>1824</a>
<a id='n1825' href='#n1825'>1825</a>
<a id='n1826' href='#n1826'>1826</a>
<a id='n1827' href='#n1827'>1827</a>
<a id='n1828' href='#n1828'>1828</a>
<a id='n1829' href='#n1829'>1829</a>
<a id='n1830' href='#n1830'>1830</a>
<a id='n1831' href='#n1831'>1831</a>
<a id='n1832' href='#n1832'>1832</a>
<a id='n1833' href='#n1833'>1833</a>
<a id='n1834' href='#n1834'>1834</a>
<a id='n1835' href='#n1835'>1835</a>
<a id='n1836' href='#n1836'>1836</a>
<a id='n1837' href='#n1837'>1837</a>
<a id='n1838' href='#n1838'>1838</a>
<a id='n1839' href='#n1839'>1839</a>
<a id='n1840' href='#n1840'>1840</a>
<a id='n1841' href='#n1841'>1841</a>
<a id='n1842' href='#n1842'>1842</a>
<a id='n1843' href='#n1843'>1843</a>
<a id='n1844' href='#n1844'>1844</a>
<a id='n1845' href='#n1845'>1845</a>
<a id='n1846' href='#n1846'>1846</a>
<a id='n1847' href='#n1847'>1847</a>
<a id='n1848' href='#n1848'>1848</a>
<a id='n1849' href='#n1849'>1849</a>
<a id='n1850' href='#n1850'>1850</a>
<a id='n1851' href='#n1851'>1851</a>
<a id='n1852' href='#n1852'>1852</a>
<a id='n1853' href='#n1853'>1853</a>
<a id='n1854' href='#n1854'>1854</a>
<a id='n1855' href='#n1855'>1855</a>
<a id='n1856' href='#n1856'>1856</a>
<a id='n1857' href='#n1857'>1857</a>
<a id='n1858' href='#n1858'>1858</a>
<a id='n1859' href='#n1859'>1859</a>
<a id='n1860' href='#n1860'>1860</a>
<a id='n1861' href='#n1861'>1861</a>
<a id='n1862' href='#n1862'>1862</a>
<a id='n1863' href='#n1863'>1863</a>
<a id='n1864' href='#n1864'>1864</a>
<a id='n1865' href='#n1865'>1865</a>
<a id='n1866' href='#n1866'>1866</a>
<a id='n1867' href='#n1867'>1867</a>
<a id='n1868' href='#n1868'>1868</a>
<a id='n1869' href='#n1869'>1869</a>
<a id='n1870' href='#n1870'>1870</a>
<a id='n1871' href='#n1871'>1871</a>
<a id='n1872' href='#n1872'>1872</a>
<a id='n1873' href='#n1873'>1873</a>
<a id='n1874' href='#n1874'>1874</a>
<a id='n1875' href='#n1875'>1875</a>
<a id='n1876' href='#n1876'>1876</a>
<a id='n1877' href='#n1877'>1877</a>
<a id='n1878' href='#n1878'>1878</a>
<a id='n1879' href='#n1879'>1879</a>
<a id='n1880' href='#n1880'>1880</a>
<a id='n1881' href='#n1881'>1881</a>
<a id='n1882' href='#n1882'>1882</a>
<a id='n1883' href='#n1883'>1883</a>
<a id='n1884' href='#n1884'>1884</a>
<a id='n1885' href='#n1885'>1885</a>
<a id='n1886' href='#n1886'>1886</a>
<a id='n1887' href='#n1887'>1887</a>
<a id='n1888' href='#n1888'>1888</a>
<a id='n1889' href='#n1889'>1889</a>
<a id='n1890' href='#n1890'>1890</a>
<a id='n1891' href='#n1891'>1891</a>
<a id='n1892' href='#n1892'>1892</a>
<a id='n1893' href='#n1893'>1893</a>
<a id='n1894' href='#n1894'>1894</a>
<a id='n1895' href='#n1895'>1895</a>
<a id='n1896' href='#n1896'>1896</a>
<a id='n1897' href='#n1897'>1897</a>
<a id='n1898' href='#n1898'>1898</a>
<a id='n1899' href='#n1899'>1899</a>
<a id='n1900' href='#n1900'>1900</a>
<a id='n1901' href='#n1901'>1901</a>
<a id='n1902' href='#n1902'>1902</a>
<a id='n1903' href='#n1903'>1903</a>
<a id='n1904' href='#n1904'>1904</a>
<a id='n1905' href='#n1905'>1905</a>
<a id='n1906' href='#n1906'>1906</a>
<a id='n1907' href='#n1907'>1907</a>
<a id='n1908' href='#n1908'>1908</a>
<a id='n1909' href='#n1909'>1909</a>
<a id='n1910' href='#n1910'>1910</a>
<a id='n1911' href='#n1911'>1911</a>
<a id='n1912' href='#n1912'>1912</a>
<a id='n1913' href='#n1913'>1913</a>
<a id='n1914' href='#n1914'>1914</a>
<a id='n1915' href='#n1915'>1915</a>
<a id='n1916' href='#n1916'>1916</a>
<a id='n1917' href='#n1917'>1917</a>
<a id='n1918' href='#n1918'>1918</a>
<a id='n1919' href='#n1919'>1919</a>
<a id='n1920' href='#n1920'>1920</a>
<a id='n1921' href='#n1921'>1921</a>
<a id='n1922' href='#n1922'>1922</a>
<a id='n1923' href='#n1923'>1923</a>
<a id='n1924' href='#n1924'>1924</a>
<a id='n1925' href='#n1925'>1925</a>
<a id='n1926' href='#n1926'>1926</a>
<a id='n1927' href='#n1927'>1927</a>
<a id='n1928' href='#n1928'>1928</a>
<a id='n1929' href='#n1929'>1929</a>
<a id='n1930' href='#n1930'>1930</a>
<a id='n1931' href='#n1931'>1931</a>
<a id='n1932' href='#n1932'>1932</a>
<a id='n1933' href='#n1933'>1933</a>
<a id='n1934' href='#n1934'>1934</a>
<a id='n1935' href='#n1935'>1935</a>
<a id='n1936' href='#n1936'>1936</a>
<a id='n1937' href='#n1937'>1937</a>
<a id='n1938' href='#n1938'>1938</a>
<a id='n1939' href='#n1939'>1939</a>
<a id='n1940' href='#n1940'>1940</a>
<a id='n1941' href='#n1941'>1941</a>
<a id='n1942' href='#n1942'>1942</a>
<a id='n1943' href='#n1943'>1943</a>
<a id='n1944' href='#n1944'>1944</a>
<a id='n1945' href='#n1945'>1945</a>
<a id='n1946' href='#n1946'>1946</a>
<a id='n1947' href='#n1947'>1947</a>
<a id='n1948' href='#n1948'>1948</a>
<a id='n1949' href='#n1949'>1949</a>
<a id='n1950' href='#n1950'>1950</a>
<a id='n1951' href='#n1951'>1951</a>
<a id='n1952' href='#n1952'>1952</a>
<a id='n1953' href='#n1953'>1953</a>
<a id='n1954' href='#n1954'>1954</a>
<a id='n1955' href='#n1955'>1955</a>
<a id='n1956' href='#n1956'>1956</a>
<a id='n1957' href='#n1957'>1957</a>
<a id='n1958' href='#n1958'>1958</a>
<a id='n1959' href='#n1959'>1959</a>
<a id='n1960' href='#n1960'>1960</a>
<a id='n1961' href='#n1961'>1961</a>
<a id='n1962' href='#n1962'>1962</a>
<a id='n1963' href='#n1963'>1963</a>
<a id='n1964' href='#n1964'>1964</a>
<a id='n1965' href='#n1965'>1965</a>
<a id='n1966' href='#n1966'>1966</a>
<a id='n1967' href='#n1967'>1967</a>
<a id='n1968' href='#n1968'>1968</a>
<a id='n1969' href='#n1969'>1969</a>
<a id='n1970' href='#n1970'>1970</a>
<a id='n1971' href='#n1971'>1971</a>
<a id='n1972' href='#n1972'>1972</a>
<a id='n1973' href='#n1973'>1973</a>
<a id='n1974' href='#n1974'>1974</a>
<a id='n1975' href='#n1975'>1975</a>
<a id='n1976' href='#n1976'>1976</a>
<a id='n1977' href='#n1977'>1977</a>
<a id='n1978' href='#n1978'>1978</a>
<a id='n1979' href='#n1979'>1979</a>
<a id='n1980' href='#n1980'>1980</a>
<a id='n1981' href='#n1981'>1981</a>
<a id='n1982' href='#n1982'>1982</a>
<a id='n1983' href='#n1983'>1983</a>
<a id='n1984' href='#n1984'>1984</a>
<a id='n1985' href='#n1985'>1985</a>
<a id='n1986' href='#n1986'>1986</a>
<a id='n1987' href='#n1987'>1987</a>
<a id='n1988' href='#n1988'>1988</a>
<a id='n1989' href='#n1989'>1989</a>
<a id='n1990' href='#n1990'>1990</a>
<a id='n1991' href='#n1991'>1991</a>
<a id='n1992' href='#n1992'>1992</a>
<a id='n1993' href='#n1993'>1993</a>
<a id='n1994' href='#n1994'>1994</a>
<a id='n1995' href='#n1995'>1995</a>
<a id='n1996' href='#n1996'>1996</a>
<a id='n1997' href='#n1997'>1997</a>
<a id='n1998' href='#n1998'>1998</a>
<a id='n1999' href='#n1999'>1999</a>
<a id='n2000' href='#n2000'>2000</a>
<a id='n2001' href='#n2001'>2001</a>
<a id='n2002' href='#n2002'>2002</a>
<a id='n2003' href='#n2003'>2003</a>
<a id='n2004' href='#n2004'>2004</a>
<a id='n2005' href='#n2005'>2005</a>
<a id='n2006' href='#n2006'>2006</a>
<a id='n2007' href='#n2007'>2007</a>
<a id='n2008' href='#n2008'>2008</a>
<a id='n2009' href='#n2009'>2009</a>
<a id='n2010' href='#n2010'>2010</a>
<a id='n2011' href='#n2011'>2011</a>
<a id='n2012' href='#n2012'>2012</a>
<a id='n2013' href='#n2013'>2013</a>
<a id='n2014' href='#n2014'>2014</a>
<a id='n2015' href='#n2015'>2015</a>
<a id='n2016' href='#n2016'>2016</a>
<a id='n2017' href='#n2017'>2017</a>
<a id='n2018' href='#n2018'>2018</a>
<a id='n2019' href='#n2019'>2019</a>
<a id='n2020' href='#n2020'>2020</a>
<a id='n2021' href='#n2021'>2021</a>
<a id='n2022' href='#n2022'>2022</a>
<a id='n2023' href='#n2023'>2023</a>
<a id='n2024' href='#n2024'>2024</a>
<a id='n2025' href='#n2025'>2025</a>
<a id='n2026' href='#n2026'>2026</a>
<a id='n2027' href='#n2027'>2027</a>
<a id='n2028' href='#n2028'>2028</a>
<a id='n2029' href='#n2029'>2029</a>
<a id='n2030' href='#n2030'>2030</a>
<a id='n2031' href='#n2031'>2031</a>
<a id='n2032' href='#n2032'>2032</a>
<a id='n2033' href='#n2033'>2033</a>
<a id='n2034' href='#n2034'>2034</a>
<a id='n2035' href='#n2035'>2035</a>
<a id='n2036' href='#n2036'>2036</a>
<a id='n2037' href='#n2037'>2037</a>
<a id='n2038' href='#n2038'>2038</a>
<a id='n2039' href='#n2039'>2039</a>
<a id='n2040' href='#n2040'>2040</a>
<a id='n2041' href='#n2041'>2041</a>
<a id='n2042' href='#n2042'>2042</a>
<a id='n2043' href='#n2043'>2043</a>
<a id='n2044' href='#n2044'>2044</a>
<a id='n2045' href='#n2045'>2045</a>
<a id='n2046' href='#n2046'>2046</a>
<a id='n2047' href='#n2047'>2047</a>
<a id='n2048' href='#n2048'>2048</a>
<a id='n2049' href='#n2049'>2049</a>
<a id='n2050' href='#n2050'>2050</a>
<a id='n2051' href='#n2051'>2051</a>
<a id='n2052' href='#n2052'>2052</a>
<a id='n2053' href='#n2053'>2053</a>
<a id='n2054' href='#n2054'>2054</a>
<a id='n2055' href='#n2055'>2055</a>
<a id='n2056' href='#n2056'>2056</a>
<a id='n2057' href='#n2057'>2057</a>
<a id='n2058' href='#n2058'>2058</a>
<a id='n2059' href='#n2059'>2059</a>
<a id='n2060' href='#n2060'>2060</a>
<a id='n2061' href='#n2061'>2061</a>
<a id='n2062' href='#n2062'>2062</a>
<a id='n2063' href='#n2063'>2063</a>
<a id='n2064' href='#n2064'>2064</a>
<a id='n2065' href='#n2065'>2065</a>
<a id='n2066' href='#n2066'>2066</a>
<a id='n2067' href='#n2067'>2067</a>
<a id='n2068' href='#n2068'>2068</a>
<a id='n2069' href='#n2069'>2069</a>
<a id='n2070' href='#n2070'>2070</a>
<a id='n2071' href='#n2071'>2071</a>
<a id='n2072' href='#n2072'>2072</a>
<a id='n2073' href='#n2073'>2073</a>
<a id='n2074' href='#n2074'>2074</a>
<a id='n2075' href='#n2075'>2075</a>
<a id='n2076' href='#n2076'>2076</a>
<a id='n2077' href='#n2077'>2077</a>
<a id='n2078' href='#n2078'>2078</a>
<a id='n2079' href='#n2079'>2079</a>
<a id='n2080' href='#n2080'>2080</a>
<a id='n2081' href='#n2081'>2081</a>
<a id='n2082' href='#n2082'>2082</a>
<a id='n2083' href='#n2083'>2083</a>
<a id='n2084' href='#n2084'>2084</a>
<a id='n2085' href='#n2085'>2085</a>
<a id='n2086' href='#n2086'>2086</a>
<a id='n2087' href='#n2087'>2087</a>
<a id='n2088' href='#n2088'>2088</a>
<a id='n2089' href='#n2089'>2089</a>
<a id='n2090' href='#n2090'>2090</a>
<a id='n2091' href='#n2091'>2091</a>
<a id='n2092' href='#n2092'>2092</a>
<a id='n2093' href='#n2093'>2093</a>
<a id='n2094' href='#n2094'>2094</a>
<a id='n2095' href='#n2095'>2095</a>
<a id='n2096' href='#n2096'>2096</a>
<a id='n2097' href='#n2097'>2097</a>
<a id='n2098' href='#n2098'>2098</a>
<a id='n2099' href='#n2099'>2099</a>
<a id='n2100' href='#n2100'>2100</a>
<a id='n2101' href='#n2101'>2101</a>
<a id='n2102' href='#n2102'>2102</a>
<a id='n2103' href='#n2103'>2103</a>
<a id='n2104' href='#n2104'>2104</a>
<a id='n2105' href='#n2105'>2105</a>
<a id='n2106' href='#n2106'>2106</a>
<a id='n2107' href='#n2107'>2107</a>
<a id='n2108' href='#n2108'>2108</a>
<a id='n2109' href='#n2109'>2109</a>
<a id='n2110' href='#n2110'>2110</a>
<a id='n2111' href='#n2111'>2111</a>
<a id='n2112' href='#n2112'>2112</a>
<a id='n2113' href='#n2113'>2113</a>
<a id='n2114' href='#n2114'>2114</a>
<a id='n2115' href='#n2115'>2115</a>
<a id='n2116' href='#n2116'>2116</a>
<a id='n2117' href='#n2117'>2117</a>
<a id='n2118' href='#n2118'>2118</a>
<a id='n2119' href='#n2119'>2119</a>
<a id='n2120' href='#n2120'>2120</a>
<a id='n2121' href='#n2121'>2121</a>
<a id='n2122' href='#n2122'>2122</a>
<a id='n2123' href='#n2123'>2123</a>
<a id='n2124' href='#n2124'>2124</a>
<a id='n2125' href='#n2125'>2125</a>
<a id='n2126' href='#n2126'>2126</a>
<a id='n2127' href='#n2127'>2127</a>
<a id='n2128' href='#n2128'>2128</a>
<a id='n2129' href='#n2129'>2129</a>
<a id='n2130' href='#n2130'>2130</a>
<a id='n2131' href='#n2131'>2131</a>
<a id='n2132' href='#n2132'>2132</a>
<a id='n2133' href='#n2133'>2133</a>
<a id='n2134' href='#n2134'>2134</a>
<a id='n2135' href='#n2135'>2135</a>
<a id='n2136' href='#n2136'>2136</a>
<a id='n2137' href='#n2137'>2137</a>
<a id='n2138' href='#n2138'>2138</a>
<a id='n2139' href='#n2139'>2139</a>
<a id='n2140' href='#n2140'>2140</a>
<a id='n2141' href='#n2141'>2141</a>
<a id='n2142' href='#n2142'>2142</a>
<a id='n2143' href='#n2143'>2143</a>
<a id='n2144' href='#n2144'>2144</a>
<a id='n2145' href='#n2145'>2145</a>
<a id='n2146' href='#n2146'>2146</a>
<a id='n2147' href='#n2147'>2147</a>
<a id='n2148' href='#n2148'>2148</a>
<a id='n2149' href='#n2149'>2149</a>
<a id='n2150' href='#n2150'>2150</a>
<a id='n2151' href='#n2151'>2151</a>
<a id='n2152' href='#n2152'>2152</a>
<a id='n2153' href='#n2153'>2153</a>
<a id='n2154' href='#n2154'>2154</a>
<a id='n2155' href='#n2155'>2155</a>
<a id='n2156' href='#n2156'>2156</a>
<a id='n2157' href='#n2157'>2157</a>
<a id='n2158' href='#n2158'>2158</a>
<a id='n2159' href='#n2159'>2159</a>
<a id='n2160' href='#n2160'>2160</a>
<a id='n2161' href='#n2161'>2161</a>
<a id='n2162' href='#n2162'>2162</a>
<a id='n2163' href='#n2163'>2163</a>
<a id='n2164' href='#n2164'>2164</a>
<a id='n2165' href='#n2165'>2165</a>
<a id='n2166' href='#n2166'>2166</a>
<a id='n2167' href='#n2167'>2167</a>
<a id='n2168' href='#n2168'>2168</a>
<a id='n2169' href='#n2169'>2169</a>
<a id='n2170' href='#n2170'>2170</a>
<a id='n2171' href='#n2171'>2171</a>
<a id='n2172' href='#n2172'>2172</a>
<a id='n2173' href='#n2173'>2173</a>
<a id='n2174' href='#n2174'>2174</a>
<a id='n2175' href='#n2175'>2175</a>
<a id='n2176' href='#n2176'>2176</a>
<a id='n2177' href='#n2177'>2177</a>
<a id='n2178' href='#n2178'>2178</a>
<a id='n2179' href='#n2179'>2179</a>
<a id='n2180' href='#n2180'>2180</a>
<a id='n2181' href='#n2181'>2181</a>
<a id='n2182' href='#n2182'>2182</a>
<a id='n2183' href='#n2183'>2183</a>
<a id='n2184' href='#n2184'>2184</a>
<a id='n2185' href='#n2185'>2185</a>
<a id='n2186' href='#n2186'>2186</a>
<a id='n2187' href='#n2187'>2187</a>
<a id='n2188' href='#n2188'>2188</a>
<a id='n2189' href='#n2189'>2189</a>
<a id='n2190' href='#n2190'>2190</a>
<a id='n2191' href='#n2191'>2191</a>
<a id='n2192' href='#n2192'>2192</a>
<a id='n2193' href='#n2193'>2193</a>
<a id='n2194' href='#n2194'>2194</a>
<a id='n2195' href='#n2195'>2195</a>
<a id='n2196' href='#n2196'>2196</a>
<a id='n2197' href='#n2197'>2197</a>
<a id='n2198' href='#n2198'>2198</a>
<a id='n2199' href='#n2199'>2199</a>
<a id='n2200' href='#n2200'>2200</a>
<a id='n2201' href='#n2201'>2201</a>
<a id='n2202' href='#n2202'>2202</a>
<a id='n2203' href='#n2203'>2203</a>
<a id='n2204' href='#n2204'>2204</a>
<a id='n2205' href='#n2205'>2205</a>
<a id='n2206' href='#n2206'>2206</a>
<a id='n2207' href='#n2207'>2207</a>
<a id='n2208' href='#n2208'>2208</a>
<a id='n2209' href='#n2209'>2209</a>
<a id='n2210' href='#n2210'>2210</a>
<a id='n2211' href='#n2211'>2211</a>
<a id='n2212' href='#n2212'>2212</a>
<a id='n2213' href='#n2213'>2213</a>
<a id='n2214' href='#n2214'>2214</a>
<a id='n2215' href='#n2215'>2215</a>
<a id='n2216' href='#n2216'>2216</a>
<a id='n2217' href='#n2217'>2217</a>
<a id='n2218' href='#n2218'>2218</a>
<a id='n2219' href='#n2219'>2219</a>
<a id='n2220' href='#n2220'>2220</a>
<a id='n2221' href='#n2221'>2221</a>
<a id='n2222' href='#n2222'>2222</a>
<a id='n2223' href='#n2223'>2223</a>
<a id='n2224' href='#n2224'>2224</a>
<a id='n2225' href='#n2225'>2225</a>
<a id='n2226' href='#n2226'>2226</a>
<a id='n2227' href='#n2227'>2227</a>
<a id='n2228' href='#n2228'>2228</a>
<a id='n2229' href='#n2229'>2229</a>
<a id='n2230' href='#n2230'>2230</a>
<a id='n2231' href='#n2231'>2231</a>
<a id='n2232' href='#n2232'>2232</a>
<a id='n2233' href='#n2233'>2233</a>
<a id='n2234' href='#n2234'>2234</a>
<a id='n2235' href='#n2235'>2235</a>
<a id='n2236' href='#n2236'>2236</a>
<a id='n2237' href='#n2237'>2237</a>
<a id='n2238' href='#n2238'>2238</a>
<a id='n2239' href='#n2239'>2239</a>
<a id='n2240' href='#n2240'>2240</a>
<a id='n2241' href='#n2241'>2241</a>
<a id='n2242' href='#n2242'>2242</a>
<a id='n2243' href='#n2243'>2243</a>
<a id='n2244' href='#n2244'>2244</a>
<a id='n2245' href='#n2245'>2245</a>
<a id='n2246' href='#n2246'>2246</a>
<a id='n2247' href='#n2247'>2247</a>
<a id='n2248' href='#n2248'>2248</a>
<a id='n2249' href='#n2249'>2249</a>
<a id='n2250' href='#n2250'>2250</a>
<a id='n2251' href='#n2251'>2251</a>
<a id='n2252' href='#n2252'>2252</a>
<a id='n2253' href='#n2253'>2253</a>
<a id='n2254' href='#n2254'>2254</a>
<a id='n2255' href='#n2255'>2255</a>
<a id='n2256' href='#n2256'>2256</a>
<a id='n2257' href='#n2257'>2257</a>
<a id='n2258' href='#n2258'>2258</a>
<a id='n2259' href='#n2259'>2259</a>
<a id='n2260' href='#n2260'>2260</a>
<a id='n2261' href='#n2261'>2261</a>
<a id='n2262' href='#n2262'>2262</a>
<a id='n2263' href='#n2263'>2263</a>
<a id='n2264' href='#n2264'>2264</a>
<a id='n2265' href='#n2265'>2265</a>
<a id='n2266' href='#n2266'>2266</a>
<a id='n2267' href='#n2267'>2267</a>
<a id='n2268' href='#n2268'>2268</a>
<a id='n2269' href='#n2269'>2269</a>
<a id='n2270' href='#n2270'>2270</a>
<a id='n2271' href='#n2271'>2271</a>
<a id='n2272' href='#n2272'>2272</a>
<a id='n2273' href='#n2273'>2273</a>
<a id='n2274' href='#n2274'>2274</a>
<a id='n2275' href='#n2275'>2275</a>
<a id='n2276' href='#n2276'>2276</a>
<a id='n2277' href='#n2277'>2277</a>
<a id='n2278' href='#n2278'>2278</a>
<a id='n2279' href='#n2279'>2279</a>
<a id='n2280' href='#n2280'>2280</a>
<a id='n2281' href='#n2281'>2281</a>
<a id='n2282' href='#n2282'>2282</a>
<a id='n2283' href='#n2283'>2283</a>
<a id='n2284' href='#n2284'>2284</a>
<a id='n2285' href='#n2285'>2285</a>
<a id='n2286' href='#n2286'>2286</a>
<a id='n2287' href='#n2287'>2287</a>
<a id='n2288' href='#n2288'>2288</a>
<a id='n2289' href='#n2289'>2289</a>
<a id='n2290' href='#n2290'>2290</a>
<a id='n2291' href='#n2291'>2291</a>
<a id='n2292' href='#n2292'>2292</a>
<a id='n2293' href='#n2293'>2293</a>
<a id='n2294' href='#n2294'>2294</a>
<a id='n2295' href='#n2295'>2295</a>
<a id='n2296' href='#n2296'>2296</a>
<a id='n2297' href='#n2297'>2297</a>
<a id='n2298' href='#n2298'>2298</a>
<a id='n2299' href='#n2299'>2299</a>
<a id='n2300' href='#n2300'>2300</a>
<a id='n2301' href='#n2301'>2301</a>
<a id='n2302' href='#n2302'>2302</a>
<a id='n2303' href='#n2303'>2303</a>
<a id='n2304' href='#n2304'>2304</a>
<a id='n2305' href='#n2305'>2305</a>
<a id='n2306' href='#n2306'>2306</a>
<a id='n2307' href='#n2307'>2307</a>
<a id='n2308' href='#n2308'>2308</a>
<a id='n2309' href='#n2309'>2309</a>
<a id='n2310' href='#n2310'>2310</a>
<a id='n2311' href='#n2311'>2311</a>
<a id='n2312' href='#n2312'>2312</a>
<a id='n2313' href='#n2313'>2313</a>
<a id='n2314' href='#n2314'>2314</a>
<a id='n2315' href='#n2315'>2315</a>
<a id='n2316' href='#n2316'>2316</a>
<a id='n2317' href='#n2317'>2317</a>
<a id='n2318' href='#n2318'>2318</a>
<a id='n2319' href='#n2319'>2319</a>
<a id='n2320' href='#n2320'>2320</a>
<a id='n2321' href='#n2321'>2321</a>
<a id='n2322' href='#n2322'>2322</a>
<a id='n2323' href='#n2323'>2323</a>
<a id='n2324' href='#n2324'>2324</a>
<a id='n2325' href='#n2325'>2325</a>
<a id='n2326' href='#n2326'>2326</a>
<a id='n2327' href='#n2327'>2327</a>
<a id='n2328' href='#n2328'>2328</a>
<a id='n2329' href='#n2329'>2329</a>
<a id='n2330' href='#n2330'>2330</a>
<a id='n2331' href='#n2331'>2331</a>
<a id='n2332' href='#n2332'>2332</a>
<a id='n2333' href='#n2333'>2333</a>
<a id='n2334' href='#n2334'>2334</a>
<a id='n2335' href='#n2335'>2335</a>
<a id='n2336' href='#n2336'>2336</a>
<a id='n2337' href='#n2337'>2337</a>
<a id='n2338' href='#n2338'>2338</a>
<a id='n2339' href='#n2339'>2339</a>
<a id='n2340' href='#n2340'>2340</a>
<a id='n2341' href='#n2341'>2341</a>
<a id='n2342' href='#n2342'>2342</a>
<a id='n2343' href='#n2343'>2343</a>
<a id='n2344' href='#n2344'>2344</a>
<a id='n2345' href='#n2345'>2345</a>
<a id='n2346' href='#n2346'>2346</a>
<a id='n2347' href='#n2347'>2347</a>
<a id='n2348' href='#n2348'>2348</a>
<a id='n2349' href='#n2349'>2349</a>
<a id='n2350' href='#n2350'>2350</a>
<a id='n2351' href='#n2351'>2351</a>
<a id='n2352' href='#n2352'>2352</a>
<a id='n2353' href='#n2353'>2353</a>
<a id='n2354' href='#n2354'>2354</a>
<a id='n2355' href='#n2355'>2355</a>
<a id='n2356' href='#n2356'>2356</a>
<a id='n2357' href='#n2357'>2357</a>
<a id='n2358' href='#n2358'>2358</a>
<a id='n2359' href='#n2359'>2359</a>
<a id='n2360' href='#n2360'>2360</a>
<a id='n2361' href='#n2361'>2361</a>
<a id='n2362' href='#n2362'>2362</a>
<a id='n2363' href='#n2363'>2363</a>
<a id='n2364' href='#n2364'>2364</a>
<a id='n2365' href='#n2365'>2365</a>
<a id='n2366' href='#n2366'>2366</a>
<a id='n2367' href='#n2367'>2367</a>
<a id='n2368' href='#n2368'>2368</a>
<a id='n2369' href='#n2369'>2369</a>
<a id='n2370' href='#n2370'>2370</a>
<a id='n2371' href='#n2371'>2371</a>
<a id='n2372' href='#n2372'>2372</a>
<a id='n2373' href='#n2373'>2373</a>
<a id='n2374' href='#n2374'>2374</a>
<a id='n2375' href='#n2375'>2375</a>
<a id='n2376' href='#n2376'>2376</a>
<a id='n2377' href='#n2377'>2377</a>
<a id='n2378' href='#n2378'>2378</a>
<a id='n2379' href='#n2379'>2379</a>
<a id='n2380' href='#n2380'>2380</a>
<a id='n2381' href='#n2381'>2381</a>
<a id='n2382' href='#n2382'>2382</a>
<a id='n2383' href='#n2383'>2383</a>
<a id='n2384' href='#n2384'>2384</a>
<a id='n2385' href='#n2385'>2385</a>
<a id='n2386' href='#n2386'>2386</a>
<a id='n2387' href='#n2387'>2387</a>
<a id='n2388' href='#n2388'>2388</a>
<a id='n2389' href='#n2389'>2389</a>
<a id='n2390' href='#n2390'>2390</a>
<a id='n2391' href='#n2391'>2391</a>
<a id='n2392' href='#n2392'>2392</a>
<a id='n2393' href='#n2393'>2393</a>
<a id='n2394' href='#n2394'>2394</a>
<a id='n2395' href='#n2395'>2395</a>
<a id='n2396' href='#n2396'>2396</a>
<a id='n2397' href='#n2397'>2397</a>
<a id='n2398' href='#n2398'>2398</a>
<a id='n2399' href='#n2399'>2399</a>
<a id='n2400' href='#n2400'>2400</a>
<a id='n2401' href='#n2401'>2401</a>
<a id='n2402' href='#n2402'>2402</a>
<a id='n2403' href='#n2403'>2403</a>
<a id='n2404' href='#n2404'>2404</a>
<a id='n2405' href='#n2405'>2405</a>
<a id='n2406' href='#n2406'>2406</a>
<a id='n2407' href='#n2407'>2407</a>
<a id='n2408' href='#n2408'>2408</a>
<a id='n2409' href='#n2409'>2409</a>
<a id='n2410' href='#n2410'>2410</a>
<a id='n2411' href='#n2411'>2411</a>
<a id='n2412' href='#n2412'>2412</a>
<a id='n2413' href='#n2413'>2413</a>
<a id='n2414' href='#n2414'>2414</a>
<a id='n2415' href='#n2415'>2415</a>
<a id='n2416' href='#n2416'>2416</a>
<a id='n2417' href='#n2417'>2417</a>
<a id='n2418' href='#n2418'>2418</a>
<a id='n2419' href='#n2419'>2419</a>
<a id='n2420' href='#n2420'>2420</a>
<a id='n2421' href='#n2421'>2421</a>
<a id='n2422' href='#n2422'>2422</a>
<a id='n2423' href='#n2423'>2423</a>
<a id='n2424' href='#n2424'>2424</a>
<a id='n2425' href='#n2425'>2425</a>
<a id='n2426' href='#n2426'>2426</a>
<a id='n2427' href='#n2427'>2427</a>
<a id='n2428' href='#n2428'>2428</a>
<a id='n2429' href='#n2429'>2429</a>
<a id='n2430' href='#n2430'>2430</a>
<a id='n2431' href='#n2431'>2431</a>
<a id='n2432' href='#n2432'>2432</a>
<a id='n2433' href='#n2433'>2433</a>
<a id='n2434' href='#n2434'>2434</a>
<a id='n2435' href='#n2435'>2435</a>
<a id='n2436' href='#n2436'>2436</a>
<a id='n2437' href='#n2437'>2437</a>
<a id='n2438' href='#n2438'>2438</a>
<a id='n2439' href='#n2439'>2439</a>
<a id='n2440' href='#n2440'>2440</a>
<a id='n2441' href='#n2441'>2441</a>
<a id='n2442' href='#n2442'>2442</a>
<a id='n2443' href='#n2443'>2443</a>
<a id='n2444' href='#n2444'>2444</a>
<a id='n2445' href='#n2445'>2445</a>
<a id='n2446' href='#n2446'>2446</a>
<a id='n2447' href='#n2447'>2447</a>
<a id='n2448' href='#n2448'>2448</a>
<a id='n2449' href='#n2449'>2449</a>
<a id='n2450' href='#n2450'>2450</a>
<a id='n2451' href='#n2451'>2451</a>
<a id='n2452' href='#n2452'>2452</a>
<a id='n2453' href='#n2453'>2453</a>
<a id='n2454' href='#n2454'>2454</a>
<a id='n2455' href='#n2455'>2455</a>
<a id='n2456' href='#n2456'>2456</a>
<a id='n2457' href='#n2457'>2457</a>
<a id='n2458' href='#n2458'>2458</a>
<a id='n2459' href='#n2459'>2459</a>
<a id='n2460' href='#n2460'>2460</a>
<a id='n2461' href='#n2461'>2461</a>
<a id='n2462' href='#n2462'>2462</a>
<a id='n2463' href='#n2463'>2463</a>
<a id='n2464' href='#n2464'>2464</a>
<a id='n2465' href='#n2465'>2465</a>
<a id='n2466' href='#n2466'>2466</a>
<a id='n2467' href='#n2467'>2467</a>
<a id='n2468' href='#n2468'>2468</a>
<a id='n2469' href='#n2469'>2469</a>
<a id='n2470' href='#n2470'>2470</a>
<a id='n2471' href='#n2471'>2471</a>
<a id='n2472' href='#n2472'>2472</a>
<a id='n2473' href='#n2473'>2473</a>
<a id='n2474' href='#n2474'>2474</a>
<a id='n2475' href='#n2475'>2475</a>
<a id='n2476' href='#n2476'>2476</a>
<a id='n2477' href='#n2477'>2477</a>
<a id='n2478' href='#n2478'>2478</a>
<a id='n2479' href='#n2479'>2479</a>
<a id='n2480' href='#n2480'>2480</a>
<a id='n2481' href='#n2481'>2481</a>
<a id='n2482' href='#n2482'>2482</a>
<a id='n2483' href='#n2483'>2483</a>
<a id='n2484' href='#n2484'>2484</a>
<a id='n2485' href='#n2485'>2485</a>
<a id='n2486' href='#n2486'>2486</a>
<a id='n2487' href='#n2487'>2487</a>
<a id='n2488' href='#n2488'>2488</a>
<a id='n2489' href='#n2489'>2489</a>
<a id='n2490' href='#n2490'>2490</a>
<a id='n2491' href='#n2491'>2491</a>
<a id='n2492' href='#n2492'>2492</a>
<a id='n2493' href='#n2493'>2493</a>
<a id='n2494' href='#n2494'>2494</a>
<a id='n2495' href='#n2495'>2495</a>
<a id='n2496' href='#n2496'>2496</a>
<a id='n2497' href='#n2497'>2497</a>
<a id='n2498' href='#n2498'>2498</a>
<a id='n2499' href='#n2499'>2499</a>
<a id='n2500' href='#n2500'>2500</a>
<a id='n2501' href='#n2501'>2501</a>
<a id='n2502' href='#n2502'>2502</a>
<a id='n2503' href='#n2503'>2503</a>
<a id='n2504' href='#n2504'>2504</a>
<a id='n2505' href='#n2505'>2505</a>
<a id='n2506' href='#n2506'>2506</a>
<a id='n2507' href='#n2507'>2507</a>
<a id='n2508' href='#n2508'>2508</a>
<a id='n2509' href='#n2509'>2509</a>
<a id='n2510' href='#n2510'>2510</a>
<a id='n2511' href='#n2511'>2511</a>
<a id='n2512' href='#n2512'>2512</a>
<a id='n2513' href='#n2513'>2513</a>
<a id='n2514' href='#n2514'>2514</a>
<a id='n2515' href='#n2515'>2515</a>
<a id='n2516' href='#n2516'>2516</a>
<a id='n2517' href='#n2517'>2517</a>
<a id='n2518' href='#n2518'>2518</a>
<a id='n2519' href='#n2519'>2519</a>
<a id='n2520' href='#n2520'>2520</a>
<a id='n2521' href='#n2521'>2521</a>
<a id='n2522' href='#n2522'>2522</a>
<a id='n2523' href='#n2523'>2523</a>
<a id='n2524' href='#n2524'>2524</a>
<a id='n2525' href='#n2525'>2525</a>
<a id='n2526' href='#n2526'>2526</a>
<a id='n2527' href='#n2527'>2527</a>
<a id='n2528' href='#n2528'>2528</a>
<a id='n2529' href='#n2529'>2529</a>
<a id='n2530' href='#n2530'>2530</a>
<a id='n2531' href='#n2531'>2531</a>
<a id='n2532' href='#n2532'>2532</a>
<a id='n2533' href='#n2533'>2533</a>
<a id='n2534' href='#n2534'>2534</a>
<a id='n2535' href='#n2535'>2535</a>
<a id='n2536' href='#n2536'>2536</a>
<a id='n2537' href='#n2537'>2537</a>
<a id='n2538' href='#n2538'>2538</a>
<a id='n2539' href='#n2539'>2539</a>
<a id='n2540' href='#n2540'>2540</a>
<a id='n2541' href='#n2541'>2541</a>
<a id='n2542' href='#n2542'>2542</a>
<a id='n2543' href='#n2543'>2543</a>
<a id='n2544' href='#n2544'>2544</a>
<a id='n2545' href='#n2545'>2545</a>
<a id='n2546' href='#n2546'>2546</a>
<a id='n2547' href='#n2547'>2547</a>
<a id='n2548' href='#n2548'>2548</a>
<a id='n2549' href='#n2549'>2549</a>
<a id='n2550' href='#n2550'>2550</a>
<a id='n2551' href='#n2551'>2551</a>
<a id='n2552' href='#n2552'>2552</a>
<a id='n2553' href='#n2553'>2553</a>
<a id='n2554' href='#n2554'>2554</a>
<a id='n2555' href='#n2555'>2555</a>
<a id='n2556' href='#n2556'>2556</a>
<a id='n2557' href='#n2557'>2557</a>
<a id='n2558' href='#n2558'>2558</a>
<a id='n2559' href='#n2559'>2559</a>
<a id='n2560' href='#n2560'>2560</a>
<a id='n2561' href='#n2561'>2561</a>
<a id='n2562' href='#n2562'>2562</a>
<a id='n2563' href='#n2563'>2563</a>
<a id='n2564' href='#n2564'>2564</a>
<a id='n2565' href='#n2565'>2565</a>
<a id='n2566' href='#n2566'>2566</a>
<a id='n2567' href='#n2567'>2567</a>
<a id='n2568' href='#n2568'>2568</a>
<a id='n2569' href='#n2569'>2569</a>
<a id='n2570' href='#n2570'>2570</a>
<a id='n2571' href='#n2571'>2571</a>
<a id='n2572' href='#n2572'>2572</a>
<a id='n2573' href='#n2573'>2573</a>
<a id='n2574' href='#n2574'>2574</a>
<a id='n2575' href='#n2575'>2575</a>
<a id='n2576' href='#n2576'>2576</a>
<a id='n2577' href='#n2577'>2577</a>
<a id='n2578' href='#n2578'>2578</a>
<a id='n2579' href='#n2579'>2579</a>
<a id='n2580' href='#n2580'>2580</a>
<a id='n2581' href='#n2581'>2581</a>
<a id='n2582' href='#n2582'>2582</a>
<a id='n2583' href='#n2583'>2583</a>
<a id='n2584' href='#n2584'>2584</a>
<a id='n2585' href='#n2585'>2585</a>
<a id='n2586' href='#n2586'>2586</a>
<a id='n2587' href='#n2587'>2587</a>
<a id='n2588' href='#n2588'>2588</a>
<a id='n2589' href='#n2589'>2589</a>
<a id='n2590' href='#n2590'>2590</a>
<a id='n2591' href='#n2591'>2591</a>
<a id='n2592' href='#n2592'>2592</a>
<a id='n2593' href='#n2593'>2593</a>
<a id='n2594' href='#n2594'>2594</a>
<a id='n2595' href='#n2595'>2595</a>
<a id='n2596' href='#n2596'>2596</a>
<a id='n2597' href='#n2597'>2597</a>
<a id='n2598' href='#n2598'>2598</a>
<a id='n2599' href='#n2599'>2599</a>
<a id='n2600' href='#n2600'>2600</a>
<a id='n2601' href='#n2601'>2601</a>
<a id='n2602' href='#n2602'>2602</a>
<a id='n2603' href='#n2603'>2603</a>
<a id='n2604' href='#n2604'>2604</a>
<a id='n2605' href='#n2605'>2605</a>
<a id='n2606' href='#n2606'>2606</a>
<a id='n2607' href='#n2607'>2607</a>
<a id='n2608' href='#n2608'>2608</a>
<a id='n2609' href='#n2609'>2609</a>
<a id='n2610' href='#n2610'>2610</a>
<a id='n2611' href='#n2611'>2611</a>
<a id='n2612' href='#n2612'>2612</a>
<a id='n2613' href='#n2613'>2613</a>
<a id='n2614' href='#n2614'>2614</a>
<a id='n2615' href='#n2615'>2615</a>
<a id='n2616' href='#n2616'>2616</a>
<a id='n2617' href='#n2617'>2617</a>
<a id='n2618' href='#n2618'>2618</a>
<a id='n2619' href='#n2619'>2619</a>
<a id='n2620' href='#n2620'>2620</a>
<a id='n2621' href='#n2621'>2621</a>
<a id='n2622' href='#n2622'>2622</a>
<a id='n2623' href='#n2623'>2623</a>
<a id='n2624' href='#n2624'>2624</a>
<a id='n2625' href='#n2625'>2625</a>
<a id='n2626' href='#n2626'>2626</a>
<a id='n2627' href='#n2627'>2627</a>
<a id='n2628' href='#n2628'>2628</a>
<a id='n2629' href='#n2629'>2629</a>
<a id='n2630' href='#n2630'>2630</a>
<a id='n2631' href='#n2631'>2631</a>
<a id='n2632' href='#n2632'>2632</a>
<a id='n2633' href='#n2633'>2633</a>
<a id='n2634' href='#n2634'>2634</a>
<a id='n2635' href='#n2635'>2635</a>
<a id='n2636' href='#n2636'>2636</a>
<a id='n2637' href='#n2637'>2637</a>
<a id='n2638' href='#n2638'>2638</a>
<a id='n2639' href='#n2639'>2639</a>
<a id='n2640' href='#n2640'>2640</a>
<a id='n2641' href='#n2641'>2641</a>
<a id='n2642' href='#n2642'>2642</a>
<a id='n2643' href='#n2643'>2643</a>
<a id='n2644' href='#n2644'>2644</a>
<a id='n2645' href='#n2645'>2645</a>
<a id='n2646' href='#n2646'>2646</a>
<a id='n2647' href='#n2647'>2647</a>
<a id='n2648' href='#n2648'>2648</a>
<a id='n2649' href='#n2649'>2649</a>
<a id='n2650' href='#n2650'>2650</a>
<a id='n2651' href='#n2651'>2651</a>
<a id='n2652' href='#n2652'>2652</a>
<a id='n2653' href='#n2653'>2653</a>
<a id='n2654' href='#n2654'>2654</a>
<a id='n2655' href='#n2655'>2655</a>
<a id='n2656' href='#n2656'>2656</a>
<a id='n2657' href='#n2657'>2657</a>
<a id='n2658' href='#n2658'>2658</a>
<a id='n2659' href='#n2659'>2659</a>
<a id='n2660' href='#n2660'>2660</a>
<a id='n2661' href='#n2661'>2661</a>
<a id='n2662' href='#n2662'>2662</a>
<a id='n2663' href='#n2663'>2663</a>
<a id='n2664' href='#n2664'>2664</a>
<a id='n2665' href='#n2665'>2665</a>
<a id='n2666' href='#n2666'>2666</a>
<a id='n2667' href='#n2667'>2667</a>
<a id='n2668' href='#n2668'>2668</a>
<a id='n2669' href='#n2669'>2669</a>
<a id='n2670' href='#n2670'>2670</a>
<a id='n2671' href='#n2671'>2671</a>
<a id='n2672' href='#n2672'>2672</a>
<a id='n2673' href='#n2673'>2673</a>
<a id='n2674' href='#n2674'>2674</a>
<a id='n2675' href='#n2675'>2675</a>
<a id='n2676' href='#n2676'>2676</a>
<a id='n2677' href='#n2677'>2677</a>
<a id='n2678' href='#n2678'>2678</a>
<a id='n2679' href='#n2679'>2679</a>
<a id='n2680' href='#n2680'>2680</a>
<a id='n2681' href='#n2681'>2681</a>
<a id='n2682' href='#n2682'>2682</a>
<a id='n2683' href='#n2683'>2683</a>
<a id='n2684' href='#n2684'>2684</a>
<a id='n2685' href='#n2685'>2685</a>
<a id='n2686' href='#n2686'>2686</a>
<a id='n2687' href='#n2687'>2687</a>
<a id='n2688' href='#n2688'>2688</a>
<a id='n2689' href='#n2689'>2689</a>
<a id='n2690' href='#n2690'>2690</a>
<a id='n2691' href='#n2691'>2691</a>
<a id='n2692' href='#n2692'>2692</a>
<a id='n2693' href='#n2693'>2693</a>
<a id='n2694' href='#n2694'>2694</a>
<a id='n2695' href='#n2695'>2695</a>
<a id='n2696' href='#n2696'>2696</a>
<a id='n2697' href='#n2697'>2697</a>
<a id='n2698' href='#n2698'>2698</a>
<a id='n2699' href='#n2699'>2699</a>
<a id='n2700' href='#n2700'>2700</a>
<a id='n2701' href='#n2701'>2701</a>
<a id='n2702' href='#n2702'>2702</a>
<a id='n2703' href='#n2703'>2703</a>
<a id='n2704' href='#n2704'>2704</a>
<a id='n2705' href='#n2705'>2705</a>
<a id='n2706' href='#n2706'>2706</a>
<a id='n2707' href='#n2707'>2707</a>
<a id='n2708' href='#n2708'>2708</a>
<a id='n2709' href='#n2709'>2709</a>
<a id='n2710' href='#n2710'>2710</a>
<a id='n2711' href='#n2711'>2711</a>
<a id='n2712' href='#n2712'>2712</a>
<a id='n2713' href='#n2713'>2713</a>
<a id='n2714' href='#n2714'>2714</a>
<a id='n2715' href='#n2715'>2715</a>
<a id='n2716' href='#n2716'>2716</a>
<a id='n2717' href='#n2717'>2717</a>
<a id='n2718' href='#n2718'>2718</a>
<a id='n2719' href='#n2719'>2719</a>
<a id='n2720' href='#n2720'>2720</a>
<a id='n2721' href='#n2721'>2721</a>
<a id='n2722' href='#n2722'>2722</a>
<a id='n2723' href='#n2723'>2723</a>
<a id='n2724' href='#n2724'>2724</a>
<a id='n2725' href='#n2725'>2725</a>
<a id='n2726' href='#n2726'>2726</a>
<a id='n2727' href='#n2727'>2727</a>
<a id='n2728' href='#n2728'>2728</a>
<a id='n2729' href='#n2729'>2729</a>
<a id='n2730' href='#n2730'>2730</a>
<a id='n2731' href='#n2731'>2731</a>
<a id='n2732' href='#n2732'>2732</a>
<a id='n2733' href='#n2733'>2733</a>
<a id='n2734' href='#n2734'>2734</a>
<a id='n2735' href='#n2735'>2735</a>
<a id='n2736' href='#n2736'>2736</a>
<a id='n2737' href='#n2737'>2737</a>
<a id='n2738' href='#n2738'>2738</a>
<a id='n2739' href='#n2739'>2739</a>
<a id='n2740' href='#n2740'>2740</a>
<a id='n2741' href='#n2741'>2741</a>
<a id='n2742' href='#n2742'>2742</a>
<a id='n2743' href='#n2743'>2743</a>
<a id='n2744' href='#n2744'>2744</a>
<a id='n2745' href='#n2745'>2745</a>
<a id='n2746' href='#n2746'>2746</a>
<a id='n2747' href='#n2747'>2747</a>
<a id='n2748' href='#n2748'>2748</a>
<a id='n2749' href='#n2749'>2749</a>
<a id='n2750' href='#n2750'>2750</a>
<a id='n2751' href='#n2751'>2751</a>
<a id='n2752' href='#n2752'>2752</a>
<a id='n2753' href='#n2753'>2753</a>
<a id='n2754' href='#n2754'>2754</a>
<a id='n2755' href='#n2755'>2755</a>
<a id='n2756' href='#n2756'>2756</a>
<a id='n2757' href='#n2757'>2757</a>
<a id='n2758' href='#n2758'>2758</a>
<a id='n2759' href='#n2759'>2759</a>
<a id='n2760' href='#n2760'>2760</a>
<a id='n2761' href='#n2761'>2761</a>
<a id='n2762' href='#n2762'>2762</a>
<a id='n2763' href='#n2763'>2763</a>
<a id='n2764' href='#n2764'>2764</a>
<a id='n2765' href='#n2765'>2765</a>
<a id='n2766' href='#n2766'>2766</a>
<a id='n2767' href='#n2767'>2767</a>
<a id='n2768' href='#n2768'>2768</a>
<a id='n2769' href='#n2769'>2769</a>
<a id='n2770' href='#n2770'>2770</a>
<a id='n2771' href='#n2771'>2771</a>
<a id='n2772' href='#n2772'>2772</a>
<a id='n2773' href='#n2773'>2773</a>
<a id='n2774' href='#n2774'>2774</a>
<a id='n2775' href='#n2775'>2775</a>
<a id='n2776' href='#n2776'>2776</a>
<a id='n2777' href='#n2777'>2777</a>
<a id='n2778' href='#n2778'>2778</a>
<a id='n2779' href='#n2779'>2779</a>
<a id='n2780' href='#n2780'>2780</a>
<a id='n2781' href='#n2781'>2781</a>
<a id='n2782' href='#n2782'>2782</a>
<a id='n2783' href='#n2783'>2783</a>
<a id='n2784' href='#n2784'>2784</a>
<a id='n2785' href='#n2785'>2785</a>
<a id='n2786' href='#n2786'>2786</a>
<a id='n2787' href='#n2787'>2787</a>
<a id='n2788' href='#n2788'>2788</a>
<a id='n2789' href='#n2789'>2789</a>
<a id='n2790' href='#n2790'>2790</a>
<a id='n2791' href='#n2791'>2791</a>
<a id='n2792' href='#n2792'>2792</a>
<a id='n2793' href='#n2793'>2793</a>
<a id='n2794' href='#n2794'>2794</a>
<a id='n2795' href='#n2795'>2795</a>
<a id='n2796' href='#n2796'>2796</a>
<a id='n2797' href='#n2797'>2797</a>
<a id='n2798' href='#n2798'>2798</a>
<a id='n2799' href='#n2799'>2799</a>
<a id='n2800' href='#n2800'>2800</a>
<a id='n2801' href='#n2801'>2801</a>
<a id='n2802' href='#n2802'>2802</a>
<a id='n2803' href='#n2803'>2803</a>
<a id='n2804' href='#n2804'>2804</a>
<a id='n2805' href='#n2805'>2805</a>
<a id='n2806' href='#n2806'>2806</a>
<a id='n2807' href='#n2807'>2807</a>
<a id='n2808' href='#n2808'>2808</a>
<a id='n2809' href='#n2809'>2809</a>
<a id='n2810' href='#n2810'>2810</a>
<a id='n2811' href='#n2811'>2811</a>
<a id='n2812' href='#n2812'>2812</a>
<a id='n2813' href='#n2813'>2813</a>
<a id='n2814' href='#n2814'>2814</a>
<a id='n2815' href='#n2815'>2815</a>
<a id='n2816' href='#n2816'>2816</a>
<a id='n2817' href='#n2817'>2817</a>
<a id='n2818' href='#n2818'>2818</a>
<a id='n2819' href='#n2819'>2819</a>
<a id='n2820' href='#n2820'>2820</a>
<a id='n2821' href='#n2821'>2821</a>
<a id='n2822' href='#n2822'>2822</a>
<a id='n2823' href='#n2823'>2823</a>
<a id='n2824' href='#n2824'>2824</a>
<a id='n2825' href='#n2825'>2825</a>
<a id='n2826' href='#n2826'>2826</a>
<a id='n2827' href='#n2827'>2827</a>
<a id='n2828' href='#n2828'>2828</a>
<a id='n2829' href='#n2829'>2829</a>
<a id='n2830' href='#n2830'>2830</a>
<a id='n2831' href='#n2831'>2831</a>
<a id='n2832' href='#n2832'>2832</a>
<a id='n2833' href='#n2833'>2833</a>
<a id='n2834' href='#n2834'>2834</a>
<a id='n2835' href='#n2835'>2835</a>
<a id='n2836' href='#n2836'>2836</a>
<a id='n2837' href='#n2837'>2837</a>
<a id='n2838' href='#n2838'>2838</a>
<a id='n2839' href='#n2839'>2839</a>
<a id='n2840' href='#n2840'>2840</a>
<a id='n2841' href='#n2841'>2841</a>
<a id='n2842' href='#n2842'>2842</a>
<a id='n2843' href='#n2843'>2843</a>
<a id='n2844' href='#n2844'>2844</a>
<a id='n2845' href='#n2845'>2845</a>
<a id='n2846' href='#n2846'>2846</a>
<a id='n2847' href='#n2847'>2847</a>
<a id='n2848' href='#n2848'>2848</a>
<a id='n2849' href='#n2849'>2849</a>
<a id='n2850' href='#n2850'>2850</a>
<a id='n2851' href='#n2851'>2851</a>
<a id='n2852' href='#n2852'>2852</a>
<a id='n2853' href='#n2853'>2853</a>
<a id='n2854' href='#n2854'>2854</a>
<a id='n2855' href='#n2855'>2855</a>
<a id='n2856' href='#n2856'>2856</a>
<a id='n2857' href='#n2857'>2857</a>
<a id='n2858' href='#n2858'>2858</a>
<a id='n2859' href='#n2859'>2859</a>
<a id='n2860' href='#n2860'>2860</a>
<a id='n2861' href='#n2861'>2861</a>
<a id='n2862' href='#n2862'>2862</a>
<a id='n2863' href='#n2863'>2863</a>
<a id='n2864' href='#n2864'>2864</a>
<a id='n2865' href='#n2865'>2865</a>
<a id='n2866' href='#n2866'>2866</a>
<a id='n2867' href='#n2867'>2867</a>
<a id='n2868' href='#n2868'>2868</a>
<a id='n2869' href='#n2869'>2869</a>
<a id='n2870' href='#n2870'>2870</a>
<a id='n2871' href='#n2871'>2871</a>
<a id='n2872' href='#n2872'>2872</a>
<a id='n2873' href='#n2873'>2873</a>
<a id='n2874' href='#n2874'>2874</a>
<a id='n2875' href='#n2875'>2875</a>
<a id='n2876' href='#n2876'>2876</a>
<a id='n2877' href='#n2877'>2877</a>
<a id='n2878' href='#n2878'>2878</a>
<a id='n2879' href='#n2879'>2879</a>
<a id='n2880' href='#n2880'>2880</a>
<a id='n2881' href='#n2881'>2881</a>
<a id='n2882' href='#n2882'>2882</a>
<a id='n2883' href='#n2883'>2883</a>
<a id='n2884' href='#n2884'>2884</a>
<a id='n2885' href='#n2885'>2885</a>
<a id='n2886' href='#n2886'>2886</a>
<a id='n2887' href='#n2887'>2887</a>
<a id='n2888' href='#n2888'>2888</a>
<a id='n2889' href='#n2889'>2889</a>
<a id='n2890' href='#n2890'>2890</a>
<a id='n2891' href='#n2891'>2891</a>
<a id='n2892' href='#n2892'>2892</a>
<a id='n2893' href='#n2893'>2893</a>
<a id='n2894' href='#n2894'>2894</a>
<a id='n2895' href='#n2895'>2895</a>
<a id='n2896' href='#n2896'>2896</a>
<a id='n2897' href='#n2897'>2897</a>
<a id='n2898' href='#n2898'>2898</a>
<a id='n2899' href='#n2899'>2899</a>
<a id='n2900' href='#n2900'>2900</a>
<a id='n2901' href='#n2901'>2901</a>
<a id='n2902' href='#n2902'>2902</a>
<a id='n2903' href='#n2903'>2903</a>
<a id='n2904' href='#n2904'>2904</a>
<a id='n2905' href='#n2905'>2905</a>
<a id='n2906' href='#n2906'>2906</a>
<a id='n2907' href='#n2907'>2907</a>
<a id='n2908' href='#n2908'>2908</a>
<a id='n2909' href='#n2909'>2909</a>
<a id='n2910' href='#n2910'>2910</a>
<a id='n2911' href='#n2911'>2911</a>
<a id='n2912' href='#n2912'>2912</a>
<a id='n2913' href='#n2913'>2913</a>
<a id='n2914' href='#n2914'>2914</a>
<a id='n2915' href='#n2915'>2915</a>
<a id='n2916' href='#n2916'>2916</a>
<a id='n2917' href='#n2917'>2917</a>
<a id='n2918' href='#n2918'>2918</a>
<a id='n2919' href='#n2919'>2919</a>
<a id='n2920' href='#n2920'>2920</a>
<a id='n2921' href='#n2921'>2921</a>
<a id='n2922' href='#n2922'>2922</a>
<a id='n2923' href='#n2923'>2923</a>
<a id='n2924' href='#n2924'>2924</a>
<a id='n2925' href='#n2925'>2925</a>
<a id='n2926' href='#n2926'>2926</a>
<a id='n2927' href='#n2927'>2927</a>
<a id='n2928' href='#n2928'>2928</a>
<a id='n2929' href='#n2929'>2929</a>
<a id='n2930' href='#n2930'>2930</a>
<a id='n2931' href='#n2931'>2931</a>
<a id='n2932' href='#n2932'>2932</a>
<a id='n2933' href='#n2933'>2933</a>
<a id='n2934' href='#n2934'>2934</a>
<a id='n2935' href='#n2935'>2935</a>
<a id='n2936' href='#n2936'>2936</a>
<a id='n2937' href='#n2937'>2937</a>
<a id='n2938' href='#n2938'>2938</a>
<a id='n2939' href='#n2939'>2939</a>
<a id='n2940' href='#n2940'>2940</a>
<a id='n2941' href='#n2941'>2941</a>
<a id='n2942' href='#n2942'>2942</a>
<a id='n2943' href='#n2943'>2943</a>
<a id='n2944' href='#n2944'>2944</a>
<a id='n2945' href='#n2945'>2945</a>
<a id='n2946' href='#n2946'>2946</a>
<a id='n2947' href='#n2947'>2947</a>
<a id='n2948' href='#n2948'>2948</a>
<a id='n2949' href='#n2949'>2949</a>
<a id='n2950' href='#n2950'>2950</a>
<a id='n2951' href='#n2951'>2951</a>
<a id='n2952' href='#n2952'>2952</a>
<a id='n2953' href='#n2953'>2953</a>
<a id='n2954' href='#n2954'>2954</a>
<a id='n2955' href='#n2955'>2955</a>
<a id='n2956' href='#n2956'>2956</a>
<a id='n2957' href='#n2957'>2957</a>
<a id='n2958' href='#n2958'>2958</a>
<a id='n2959' href='#n2959'>2959</a>
<a id='n2960' href='#n2960'>2960</a>
<a id='n2961' href='#n2961'>2961</a>
<a id='n2962' href='#n2962'>2962</a>
<a id='n2963' href='#n2963'>2963</a>
<a id='n2964' href='#n2964'>2964</a>
<a id='n2965' href='#n2965'>2965</a>
<a id='n2966' href='#n2966'>2966</a>
<a id='n2967' href='#n2967'>2967</a>
<a id='n2968' href='#n2968'>2968</a>
<a id='n2969' href='#n2969'>2969</a>
<a id='n2970' href='#n2970'>2970</a>
<a id='n2971' href='#n2971'>2971</a>
<a id='n2972' href='#n2972'>2972</a>
<a id='n2973' href='#n2973'>2973</a>
<a id='n2974' href='#n2974'>2974</a>
<a id='n2975' href='#n2975'>2975</a>
<a id='n2976' href='#n2976'>2976</a>
<a id='n2977' href='#n2977'>2977</a>
<a id='n2978' href='#n2978'>2978</a>
<a id='n2979' href='#n2979'>2979</a>
<a id='n2980' href='#n2980'>2980</a>
<a id='n2981' href='#n2981'>2981</a>
<a id='n2982' href='#n2982'>2982</a>
<a id='n2983' href='#n2983'>2983</a>
<a id='n2984' href='#n2984'>2984</a>
<a id='n2985' href='#n2985'>2985</a>
<a id='n2986' href='#n2986'>2986</a>
<a id='n2987' href='#n2987'>2987</a>
<a id='n2988' href='#n2988'>2988</a>
<a id='n2989' href='#n2989'>2989</a>
<a id='n2990' href='#n2990'>2990</a>
<a id='n2991' href='#n2991'>2991</a>
<a id='n2992' href='#n2992'>2992</a>
<a id='n2993' href='#n2993'>2993</a>
<a id='n2994' href='#n2994'>2994</a>
<a id='n2995' href='#n2995'>2995</a>
<a id='n2996' href='#n2996'>2996</a>
<a id='n2997' href='#n2997'>2997</a>
<a id='n2998' href='#n2998'>2998</a>
<a id='n2999' href='#n2999'>2999</a>
<a id='n3000' href='#n3000'>3000</a>
<a id='n3001' href='#n3001'>3001</a>
<a id='n3002' href='#n3002'>3002</a>
<a id='n3003' href='#n3003'>3003</a>
<a id='n3004' href='#n3004'>3004</a>
<a id='n3005' href='#n3005'>3005</a>
<a id='n3006' href='#n3006'>3006</a>
<a id='n3007' href='#n3007'>3007</a>
<a id='n3008' href='#n3008'>3008</a>
<a id='n3009' href='#n3009'>3009</a>
<a id='n3010' href='#n3010'>3010</a>
<a id='n3011' href='#n3011'>3011</a>
<a id='n3012' href='#n3012'>3012</a>
<a id='n3013' href='#n3013'>3013</a>
<a id='n3014' href='#n3014'>3014</a>
<a id='n3015' href='#n3015'>3015</a>
<a id='n3016' href='#n3016'>3016</a>
<a id='n3017' href='#n3017'>3017</a>
<a id='n3018' href='#n3018'>3018</a>
<a id='n3019' href='#n3019'>3019</a>
<a id='n3020' href='#n3020'>3020</a>
<a id='n3021' href='#n3021'>3021</a>
<a id='n3022' href='#n3022'>3022</a>
<a id='n3023' href='#n3023'>3023</a>
<a id='n3024' href='#n3024'>3024</a>
<a id='n3025' href='#n3025'>3025</a>
<a id='n3026' href='#n3026'>3026</a>
<a id='n3027' href='#n3027'>3027</a>
<a id='n3028' href='#n3028'>3028</a>
<a id='n3029' href='#n3029'>3029</a>
<a id='n3030' href='#n3030'>3030</a>
<a id='n3031' href='#n3031'>3031</a>
<a id='n3032' href='#n3032'>3032</a>
<a id='n3033' href='#n3033'>3033</a>
<a id='n3034' href='#n3034'>3034</a>
<a id='n3035' href='#n3035'>3035</a>
<a id='n3036' href='#n3036'>3036</a>
<a id='n3037' href='#n3037'>3037</a>
<a id='n3038' href='#n3038'>3038</a>
<a id='n3039' href='#n3039'>3039</a>
<a id='n3040' href='#n3040'>3040</a>
<a id='n3041' href='#n3041'>3041</a>
<a id='n3042' href='#n3042'>3042</a>
<a id='n3043' href='#n3043'>3043</a>
<a id='n3044' href='#n3044'>3044</a>
<a id='n3045' href='#n3045'>3045</a>
<a id='n3046' href='#n3046'>3046</a>
<a id='n3047' href='#n3047'>3047</a>
<a id='n3048' href='#n3048'>3048</a>
<a id='n3049' href='#n3049'>3049</a>
<a id='n3050' href='#n3050'>3050</a>
<a id='n3051' href='#n3051'>3051</a>
<a id='n3052' href='#n3052'>3052</a>
<a id='n3053' href='#n3053'>3053</a>
<a id='n3054' href='#n3054'>3054</a>
<a id='n3055' href='#n3055'>3055</a>
<a id='n3056' href='#n3056'>3056</a>
<a id='n3057' href='#n3057'>3057</a>
<a id='n3058' href='#n3058'>3058</a>
<a id='n3059' href='#n3059'>3059</a>
<a id='n3060' href='#n3060'>3060</a>
<a id='n3061' href='#n3061'>3061</a>
<a id='n3062' href='#n3062'>3062</a>
<a id='n3063' href='#n3063'>3063</a>
<a id='n3064' href='#n3064'>3064</a>
<a id='n3065' href='#n3065'>3065</a>
<a id='n3066' href='#n3066'>3066</a>
<a id='n3067' href='#n3067'>3067</a>
<a id='n3068' href='#n3068'>3068</a>
<a id='n3069' href='#n3069'>3069</a>
<a id='n3070' href='#n3070'>3070</a>
<a id='n3071' href='#n3071'>3071</a>
<a id='n3072' href='#n3072'>3072</a>
<a id='n3073' href='#n3073'>3073</a>
<a id='n3074' href='#n3074'>3074</a>
<a id='n3075' href='#n3075'>3075</a>
<a id='n3076' href='#n3076'>3076</a>
<a id='n3077' href='#n3077'>3077</a>
<a id='n3078' href='#n3078'>3078</a>
<a id='n3079' href='#n3079'>3079</a>
<a id='n3080' href='#n3080'>3080</a>
<a id='n3081' href='#n3081'>3081</a>
<a id='n3082' href='#n3082'>3082</a>
<a id='n3083' href='#n3083'>3083</a>
<a id='n3084' href='#n3084'>3084</a>
<a id='n3085' href='#n3085'>3085</a>
<a id='n3086' href='#n3086'>3086</a>
<a id='n3087' href='#n3087'>3087</a>
<a id='n3088' href='#n3088'>3088</a>
<a id='n3089' href='#n3089'>3089</a>
<a id='n3090' href='#n3090'>3090</a>
<a id='n3091' href='#n3091'>3091</a>
<a id='n3092' href='#n3092'>3092</a>
<a id='n3093' href='#n3093'>3093</a>
<a id='n3094' href='#n3094'>3094</a>
<a id='n3095' href='#n3095'>3095</a>
<a id='n3096' href='#n3096'>3096</a>
<a id='n3097' href='#n3097'>3097</a>
<a id='n3098' href='#n3098'>3098</a>
<a id='n3099' href='#n3099'>3099</a>
<a id='n3100' href='#n3100'>3100</a>
<a id='n3101' href='#n3101'>3101</a>
<a id='n3102' href='#n3102'>3102</a>
<a id='n3103' href='#n3103'>3103</a>
<a id='n3104' href='#n3104'>3104</a>
<a id='n3105' href='#n3105'>3105</a>
<a id='n3106' href='#n3106'>3106</a>
<a id='n3107' href='#n3107'>3107</a>
<a id='n3108' href='#n3108'>3108</a>
<a id='n3109' href='#n3109'>3109</a>
<a id='n3110' href='#n3110'>3110</a>
<a id='n3111' href='#n3111'>3111</a>
<a id='n3112' href='#n3112'>3112</a>
<a id='n3113' href='#n3113'>3113</a>
<a id='n3114' href='#n3114'>3114</a>
<a id='n3115' href='#n3115'>3115</a>
<a id='n3116' href='#n3116'>3116</a>
<a id='n3117' href='#n3117'>3117</a>
<a id='n3118' href='#n3118'>3118</a>
<a id='n3119' href='#n3119'>3119</a>
<a id='n3120' href='#n3120'>3120</a>
<a id='n3121' href='#n3121'>3121</a>
<a id='n3122' href='#n3122'>3122</a>
<a id='n3123' href='#n3123'>3123</a>
<a id='n3124' href='#n3124'>3124</a>
<a id='n3125' href='#n3125'>3125</a>
<a id='n3126' href='#n3126'>3126</a>
<a id='n3127' href='#n3127'>3127</a>
<a id='n3128' href='#n3128'>3128</a>
<a id='n3129' href='#n3129'>3129</a>
<a id='n3130' href='#n3130'>3130</a>
<a id='n3131' href='#n3131'>3131</a>
<a id='n3132' href='#n3132'>3132</a>
<a id='n3133' href='#n3133'>3133</a>
<a id='n3134' href='#n3134'>3134</a>
<a id='n3135' href='#n3135'>3135</a>
<a id='n3136' href='#n3136'>3136</a>
<a id='n3137' href='#n3137'>3137</a>
<a id='n3138' href='#n3138'>3138</a>
<a id='n3139' href='#n3139'>3139</a>
<a id='n3140' href='#n3140'>3140</a>
<a id='n3141' href='#n3141'>3141</a>
<a id='n3142' href='#n3142'>3142</a>
<a id='n3143' href='#n3143'>3143</a>
<a id='n3144' href='#n3144'>3144</a>
<a id='n3145' href='#n3145'>3145</a>
<a id='n3146' href='#n3146'>3146</a>
<a id='n3147' href='#n3147'>3147</a>
<a id='n3148' href='#n3148'>3148</a>
<a id='n3149' href='#n3149'>3149</a>
<a id='n3150' href='#n3150'>3150</a>
<a id='n3151' href='#n3151'>3151</a>
<a id='n3152' href='#n3152'>3152</a>
<a id='n3153' href='#n3153'>3153</a>
<a id='n3154' href='#n3154'>3154</a>
<a id='n3155' href='#n3155'>3155</a>
<a id='n3156' href='#n3156'>3156</a>
<a id='n3157' href='#n3157'>3157</a>
<a id='n3158' href='#n3158'>3158</a>
<a id='n3159' href='#n3159'>3159</a>
<a id='n3160' href='#n3160'>3160</a>
<a id='n3161' href='#n3161'>3161</a>
<a id='n3162' href='#n3162'>3162</a>
<a id='n3163' href='#n3163'>3163</a>
<a id='n3164' href='#n3164'>3164</a>
<a id='n3165' href='#n3165'>3165</a>
<a id='n3166' href='#n3166'>3166</a>
<a id='n3167' href='#n3167'>3167</a>
<a id='n3168' href='#n3168'>3168</a>
<a id='n3169' href='#n3169'>3169</a>
<a id='n3170' href='#n3170'>3170</a>
<a id='n3171' href='#n3171'>3171</a>
<a id='n3172' href='#n3172'>3172</a>
<a id='n3173' href='#n3173'>3173</a>
<a id='n3174' href='#n3174'>3174</a>
<a id='n3175' href='#n3175'>3175</a>
<a id='n3176' href='#n3176'>3176</a>
<a id='n3177' href='#n3177'>3177</a>
<a id='n3178' href='#n3178'>3178</a>
<a id='n3179' href='#n3179'>3179</a>
<a id='n3180' href='#n3180'>3180</a>
<a id='n3181' href='#n3181'>3181</a>
<a id='n3182' href='#n3182'>3182</a>
<a id='n3183' href='#n3183'>3183</a>
<a id='n3184' href='#n3184'>3184</a>
<a id='n3185' href='#n3185'>3185</a>
<a id='n3186' href='#n3186'>3186</a>
<a id='n3187' href='#n3187'>3187</a>
<a id='n3188' href='#n3188'>3188</a>
<a id='n3189' href='#n3189'>3189</a>
<a id='n3190' href='#n3190'>3190</a>
<a id='n3191' href='#n3191'>3191</a>
<a id='n3192' href='#n3192'>3192</a>
<a id='n3193' href='#n3193'>3193</a>
<a id='n3194' href='#n3194'>3194</a>
<a id='n3195' href='#n3195'>3195</a>
<a id='n3196' href='#n3196'>3196</a>
<a id='n3197' href='#n3197'>3197</a>
<a id='n3198' href='#n3198'>3198</a>
<a id='n3199' href='#n3199'>3199</a>
<a id='n3200' href='#n3200'>3200</a>
<a id='n3201' href='#n3201'>3201</a>
<a id='n3202' href='#n3202'>3202</a>
<a id='n3203' href='#n3203'>3203</a>
<a id='n3204' href='#n3204'>3204</a>
<a id='n3205' href='#n3205'>3205</a>
<a id='n3206' href='#n3206'>3206</a>
<a id='n3207' href='#n3207'>3207</a>
<a id='n3208' href='#n3208'>3208</a>
<a id='n3209' href='#n3209'>3209</a>
<a id='n3210' href='#n3210'>3210</a>
<a id='n3211' href='#n3211'>3211</a>
<a id='n3212' href='#n3212'>3212</a>
<a id='n3213' href='#n3213'>3213</a>
<a id='n3214' href='#n3214'>3214</a>
<a id='n3215' href='#n3215'>3215</a>
<a id='n3216' href='#n3216'>3216</a>
<a id='n3217' href='#n3217'>3217</a>
<a id='n3218' href='#n3218'>3218</a>
<a id='n3219' href='#n3219'>3219</a>
<a id='n3220' href='#n3220'>3220</a>
<a id='n3221' href='#n3221'>3221</a>
<a id='n3222' href='#n3222'>3222</a>
<a id='n3223' href='#n3223'>3223</a>
<a id='n3224' href='#n3224'>3224</a>
<a id='n3225' href='#n3225'>3225</a>
<a id='n3226' href='#n3226'>3226</a>
<a id='n3227' href='#n3227'>3227</a>
<a id='n3228' href='#n3228'>3228</a>
<a id='n3229' href='#n3229'>3229</a>
<a id='n3230' href='#n3230'>3230</a>
<a id='n3231' href='#n3231'>3231</a>
<a id='n3232' href='#n3232'>3232</a>
<a id='n3233' href='#n3233'>3233</a>
<a id='n3234' href='#n3234'>3234</a>
<a id='n3235' href='#n3235'>3235</a>
<a id='n3236' href='#n3236'>3236</a>
<a id='n3237' href='#n3237'>3237</a>
<a id='n3238' href='#n3238'>3238</a>
<a id='n3239' href='#n3239'>3239</a>
<a id='n3240' href='#n3240'>3240</a>
<a id='n3241' href='#n3241'>3241</a>
<a id='n3242' href='#n3242'>3242</a>
<a id='n3243' href='#n3243'>3243</a>
<a id='n3244' href='#n3244'>3244</a>
<a id='n3245' href='#n3245'>3245</a>
<a id='n3246' href='#n3246'>3246</a>
<a id='n3247' href='#n3247'>3247</a>
<a id='n3248' href='#n3248'>3248</a>
<a id='n3249' href='#n3249'>3249</a>
<a id='n3250' href='#n3250'>3250</a>
<a id='n3251' href='#n3251'>3251</a>
<a id='n3252' href='#n3252'>3252</a>
<a id='n3253' href='#n3253'>3253</a>
<a id='n3254' href='#n3254'>3254</a>
<a id='n3255' href='#n3255'>3255</a>
<a id='n3256' href='#n3256'>3256</a>
<a id='n3257' href='#n3257'>3257</a>
<a id='n3258' href='#n3258'>3258</a>
<a id='n3259' href='#n3259'>3259</a>
<a id='n3260' href='#n3260'>3260</a>
<a id='n3261' href='#n3261'>3261</a>
<a id='n3262' href='#n3262'>3262</a>
<a id='n3263' href='#n3263'>3263</a>
<a id='n3264' href='#n3264'>3264</a>
<a id='n3265' href='#n3265'>3265</a>
<a id='n3266' href='#n3266'>3266</a>
<a id='n3267' href='#n3267'>3267</a>
<a id='n3268' href='#n3268'>3268</a>
<a id='n3269' href='#n3269'>3269</a>
<a id='n3270' href='#n3270'>3270</a>
<a id='n3271' href='#n3271'>3271</a>
<a id='n3272' href='#n3272'>3272</a>
<a id='n3273' href='#n3273'>3273</a>
<a id='n3274' href='#n3274'>3274</a>
<a id='n3275' href='#n3275'>3275</a>
<a id='n3276' href='#n3276'>3276</a>
<a id='n3277' href='#n3277'>3277</a>
<a id='n3278' href='#n3278'>3278</a>
<a id='n3279' href='#n3279'>3279</a>
<a id='n3280' href='#n3280'>3280</a>
<a id='n3281' href='#n3281'>3281</a>
<a id='n3282' href='#n3282'>3282</a>
<a id='n3283' href='#n3283'>3283</a>
<a id='n3284' href='#n3284'>3284</a>
<a id='n3285' href='#n3285'>3285</a>
<a id='n3286' href='#n3286'>3286</a>
<a id='n3287' href='#n3287'>3287</a>
<a id='n3288' href='#n3288'>3288</a>
<a id='n3289' href='#n3289'>3289</a>
<a id='n3290' href='#n3290'>3290</a>
<a id='n3291' href='#n3291'>3291</a>
<a id='n3292' href='#n3292'>3292</a>
<a id='n3293' href='#n3293'>3293</a>
<a id='n3294' href='#n3294'>3294</a>
<a id='n3295' href='#n3295'>3295</a>
<a id='n3296' href='#n3296'>3296</a>
<a id='n3297' href='#n3297'>3297</a>
<a id='n3298' href='#n3298'>3298</a>
<a id='n3299' href='#n3299'>3299</a>
<a id='n3300' href='#n3300'>3300</a>
<a id='n3301' href='#n3301'>3301</a>
<a id='n3302' href='#n3302'>3302</a>
<a id='n3303' href='#n3303'>3303</a>
<a id='n3304' href='#n3304'>3304</a>
<a id='n3305' href='#n3305'>3305</a>
<a id='n3306' href='#n3306'>3306</a>
<a id='n3307' href='#n3307'>3307</a>
<a id='n3308' href='#n3308'>3308</a>
<a id='n3309' href='#n3309'>3309</a>
<a id='n3310' href='#n3310'>3310</a>
<a id='n3311' href='#n3311'>3311</a>
<a id='n3312' href='#n3312'>3312</a>
<a id='n3313' href='#n3313'>3313</a>
<a id='n3314' href='#n3314'>3314</a>
<a id='n3315' href='#n3315'>3315</a>
<a id='n3316' href='#n3316'>3316</a>
<a id='n3317' href='#n3317'>3317</a>
<a id='n3318' href='#n3318'>3318</a>
<a id='n3319' href='#n3319'>3319</a>
<a id='n3320' href='#n3320'>3320</a>
<a id='n3321' href='#n3321'>3321</a>
<a id='n3322' href='#n3322'>3322</a>
<a id='n3323' href='#n3323'>3323</a>
<a id='n3324' href='#n3324'>3324</a>
<a id='n3325' href='#n3325'>3325</a>
<a id='n3326' href='#n3326'>3326</a>
<a id='n3327' href='#n3327'>3327</a>
<a id='n3328' href='#n3328'>3328</a>
<a id='n3329' href='#n3329'>3329</a>
<a id='n3330' href='#n3330'>3330</a>
<a id='n3331' href='#n3331'>3331</a>
<a id='n3332' href='#n3332'>3332</a>
<a id='n3333' href='#n3333'>3333</a>
<a id='n3334' href='#n3334'>3334</a>
<a id='n3335' href='#n3335'>3335</a>
<a id='n3336' href='#n3336'>3336</a>
<a id='n3337' href='#n3337'>3337</a>
<a id='n3338' href='#n3338'>3338</a>
<a id='n3339' href='#n3339'>3339</a>
<a id='n3340' href='#n3340'>3340</a>
<a id='n3341' href='#n3341'>3341</a>
<a id='n3342' href='#n3342'>3342</a>
<a id='n3343' href='#n3343'>3343</a>
<a id='n3344' href='#n3344'>3344</a>
<a id='n3345' href='#n3345'>3345</a>
<a id='n3346' href='#n3346'>3346</a>
<a id='n3347' href='#n3347'>3347</a>
<a id='n3348' href='#n3348'>3348</a>
<a id='n3349' href='#n3349'>3349</a>
<a id='n3350' href='#n3350'>3350</a>
<a id='n3351' href='#n3351'>3351</a>
<a id='n3352' href='#n3352'>3352</a>
<a id='n3353' href='#n3353'>3353</a>
<a id='n3354' href='#n3354'>3354</a>
<a id='n3355' href='#n3355'>3355</a>
<a id='n3356' href='#n3356'>3356</a>
<a id='n3357' href='#n3357'>3357</a>
<a id='n3358' href='#n3358'>3358</a>
<a id='n3359' href='#n3359'>3359</a>
<a id='n3360' href='#n3360'>3360</a>
<a id='n3361' href='#n3361'>3361</a>
<a id='n3362' href='#n3362'>3362</a>
<a id='n3363' href='#n3363'>3363</a>
<a id='n3364' href='#n3364'>3364</a>
<a id='n3365' href='#n3365'>3365</a>
<a id='n3366' href='#n3366'>3366</a>
<a id='n3367' href='#n3367'>3367</a>
<a id='n3368' href='#n3368'>3368</a>
<a id='n3369' href='#n3369'>3369</a>
<a id='n3370' href='#n3370'>3370</a>
<a id='n3371' href='#n3371'>3371</a>
<a id='n3372' href='#n3372'>3372</a>
<a id='n3373' href='#n3373'>3373</a>
<a id='n3374' href='#n3374'>3374</a>
<a id='n3375' href='#n3375'>3375</a>
<a id='n3376' href='#n3376'>3376</a>
<a id='n3377' href='#n3377'>3377</a>
<a id='n3378' href='#n3378'>3378</a>
<a id='n3379' href='#n3379'>3379</a>
<a id='n3380' href='#n3380'>3380</a>
<a id='n3381' href='#n3381'>3381</a>
<a id='n3382' href='#n3382'>3382</a>
<a id='n3383' href='#n3383'>3383</a>
<a id='n3384' href='#n3384'>3384</a>
<a id='n3385' href='#n3385'>3385</a>
<a id='n3386' href='#n3386'>3386</a>
<a id='n3387' href='#n3387'>3387</a>
<a id='n3388' href='#n3388'>3388</a>
<a id='n3389' href='#n3389'>3389</a>
<a id='n3390' href='#n3390'>3390</a>
<a id='n3391' href='#n3391'>3391</a>
<a id='n3392' href='#n3392'>3392</a>
<a id='n3393' href='#n3393'>3393</a>
<a id='n3394' href='#n3394'>3394</a>
<a id='n3395' href='#n3395'>3395</a>
<a id='n3396' href='#n3396'>3396</a>
<a id='n3397' href='#n3397'>3397</a>
<a id='n3398' href='#n3398'>3398</a>
<a id='n3399' href='#n3399'>3399</a>
<a id='n3400' href='#n3400'>3400</a>
<a id='n3401' href='#n3401'>3401</a>
<a id='n3402' href='#n3402'>3402</a>
<a id='n3403' href='#n3403'>3403</a>
<a id='n3404' href='#n3404'>3404</a>
<a id='n3405' href='#n3405'>3405</a>
<a id='n3406' href='#n3406'>3406</a>
<a id='n3407' href='#n3407'>3407</a>
<a id='n3408' href='#n3408'>3408</a>
<a id='n3409' href='#n3409'>3409</a>
<a id='n3410' href='#n3410'>3410</a>
<a id='n3411' href='#n3411'>3411</a>
<a id='n3412' href='#n3412'>3412</a>
<a id='n3413' href='#n3413'>3413</a>
<a id='n3414' href='#n3414'>3414</a>
<a id='n3415' href='#n3415'>3415</a>
<a id='n3416' href='#n3416'>3416</a>
<a id='n3417' href='#n3417'>3417</a>
<a id='n3418' href='#n3418'>3418</a>
<a id='n3419' href='#n3419'>3419</a>
<a id='n3420' href='#n3420'>3420</a>
<a id='n3421' href='#n3421'>3421</a>
<a id='n3422' href='#n3422'>3422</a>
<a id='n3423' href='#n3423'>3423</a>
<a id='n3424' href='#n3424'>3424</a>
<a id='n3425' href='#n3425'>3425</a>
<a id='n3426' href='#n3426'>3426</a>
<a id='n3427' href='#n3427'>3427</a>
<a id='n3428' href='#n3428'>3428</a>
<a id='n3429' href='#n3429'>3429</a>
<a id='n3430' href='#n3430'>3430</a>
<a id='n3431' href='#n3431'>3431</a>
<a id='n3432' href='#n3432'>3432</a>
<a id='n3433' href='#n3433'>3433</a>
<a id='n3434' href='#n3434'>3434</a>
<a id='n3435' href='#n3435'>3435</a>
<a id='n3436' href='#n3436'>3436</a>
<a id='n3437' href='#n3437'>3437</a>
<a id='n3438' href='#n3438'>3438</a>
<a id='n3439' href='#n3439'>3439</a>
<a id='n3440' href='#n3440'>3440</a>
<a id='n3441' href='#n3441'>3441</a>
<a id='n3442' href='#n3442'>3442</a>
<a id='n3443' href='#n3443'>3443</a>
<a id='n3444' href='#n3444'>3444</a>
<a id='n3445' href='#n3445'>3445</a>
<a id='n3446' href='#n3446'>3446</a>
<a id='n3447' href='#n3447'>3447</a>
<a id='n3448' href='#n3448'>3448</a>
<a id='n3449' href='#n3449'>3449</a>
<a id='n3450' href='#n3450'>3450</a>
<a id='n3451' href='#n3451'>3451</a>
<a id='n3452' href='#n3452'>3452</a>
<a id='n3453' href='#n3453'>3453</a>
<a id='n3454' href='#n3454'>3454</a>
<a id='n3455' href='#n3455'>3455</a>
<a id='n3456' href='#n3456'>3456</a>
<a id='n3457' href='#n3457'>3457</a>
<a id='n3458' href='#n3458'>3458</a>
<a id='n3459' href='#n3459'>3459</a>
<a id='n3460' href='#n3460'>3460</a>
<a id='n3461' href='#n3461'>3461</a>
<a id='n3462' href='#n3462'>3462</a>
<a id='n3463' href='#n3463'>3463</a>
<a id='n3464' href='#n3464'>3464</a>
<a id='n3465' href='#n3465'>3465</a>
<a id='n3466' href='#n3466'>3466</a>
<a id='n3467' href='#n3467'>3467</a>
<a id='n3468' href='#n3468'>3468</a>
<a id='n3469' href='#n3469'>3469</a>
<a id='n3470' href='#n3470'>3470</a>
<a id='n3471' href='#n3471'>3471</a>
<a id='n3472' href='#n3472'>3472</a>
<a id='n3473' href='#n3473'>3473</a>
<a id='n3474' href='#n3474'>3474</a>
<a id='n3475' href='#n3475'>3475</a>
<a id='n3476' href='#n3476'>3476</a>
<a id='n3477' href='#n3477'>3477</a>
<a id='n3478' href='#n3478'>3478</a>
<a id='n3479' href='#n3479'>3479</a>
<a id='n3480' href='#n3480'>3480</a>
<a id='n3481' href='#n3481'>3481</a>
<a id='n3482' href='#n3482'>3482</a>
<a id='n3483' href='#n3483'>3483</a>
<a id='n3484' href='#n3484'>3484</a>
<a id='n3485' href='#n3485'>3485</a>
<a id='n3486' href='#n3486'>3486</a>
<a id='n3487' href='#n3487'>3487</a>
<a id='n3488' href='#n3488'>3488</a>
<a id='n3489' href='#n3489'>3489</a>
<a id='n3490' href='#n3490'>3490</a>
<a id='n3491' href='#n3491'>3491</a>
<a id='n3492' href='#n3492'>3492</a>
<a id='n3493' href='#n3493'>3493</a>
<a id='n3494' href='#n3494'>3494</a>
<a id='n3495' href='#n3495'>3495</a>
<a id='n3496' href='#n3496'>3496</a>
<a id='n3497' href='#n3497'>3497</a>
<a id='n3498' href='#n3498'>3498</a>
<a id='n3499' href='#n3499'>3499</a>
<a id='n3500' href='#n3500'>3500</a>
<a id='n3501' href='#n3501'>3501</a>
<a id='n3502' href='#n3502'>3502</a>
<a id='n3503' href='#n3503'>3503</a>
<a id='n3504' href='#n3504'>3504</a>
<a id='n3505' href='#n3505'>3505</a>
<a id='n3506' href='#n3506'>3506</a>
<a id='n3507' href='#n3507'>3507</a>
<a id='n3508' href='#n3508'>3508</a>
<a id='n3509' href='#n3509'>3509</a>
<a id='n3510' href='#n3510'>3510</a>
<a id='n3511' href='#n3511'>3511</a>
<a id='n3512' href='#n3512'>3512</a>
<a id='n3513' href='#n3513'>3513</a>
<a id='n3514' href='#n3514'>3514</a>
<a id='n3515' href='#n3515'>3515</a>
<a id='n3516' href='#n3516'>3516</a>
<a id='n3517' href='#n3517'>3517</a>
<a id='n3518' href='#n3518'>3518</a>
<a id='n3519' href='#n3519'>3519</a>
<a id='n3520' href='#n3520'>3520</a>
<a id='n3521' href='#n3521'>3521</a>
<a id='n3522' href='#n3522'>3522</a>
<a id='n3523' href='#n3523'>3523</a>
<a id='n3524' href='#n3524'>3524</a>
<a id='n3525' href='#n3525'>3525</a>
<a id='n3526' href='#n3526'>3526</a>
<a id='n3527' href='#n3527'>3527</a>
<a id='n3528' href='#n3528'>3528</a>
<a id='n3529' href='#n3529'>3529</a>
<a id='n3530' href='#n3530'>3530</a>
<a id='n3531' href='#n3531'>3531</a>
<a id='n3532' href='#n3532'>3532</a>
<a id='n3533' href='#n3533'>3533</a>
<a id='n3534' href='#n3534'>3534</a>
<a id='n3535' href='#n3535'>3535</a>
<a id='n3536' href='#n3536'>3536</a>
<a id='n3537' href='#n3537'>3537</a>
<a id='n3538' href='#n3538'>3538</a>
<a id='n3539' href='#n3539'>3539</a>
<a id='n3540' href='#n3540'>3540</a>
<a id='n3541' href='#n3541'>3541</a>
<a id='n3542' href='#n3542'>3542</a>
<a id='n3543' href='#n3543'>3543</a>
<a id='n3544' href='#n3544'>3544</a>
<a id='n3545' href='#n3545'>3545</a>
<a id='n3546' href='#n3546'>3546</a>
<a id='n3547' href='#n3547'>3547</a>
<a id='n3548' href='#n3548'>3548</a>
<a id='n3549' href='#n3549'>3549</a>
<a id='n3550' href='#n3550'>3550</a>
<a id='n3551' href='#n3551'>3551</a>
<a id='n3552' href='#n3552'>3552</a>
<a id='n3553' href='#n3553'>3553</a>
<a id='n3554' href='#n3554'>3554</a>
<a id='n3555' href='#n3555'>3555</a>
<a id='n3556' href='#n3556'>3556</a>
<a id='n3557' href='#n3557'>3557</a>
<a id='n3558' href='#n3558'>3558</a>
<a id='n3559' href='#n3559'>3559</a>
<a id='n3560' href='#n3560'>3560</a>
<a id='n3561' href='#n3561'>3561</a>
<a id='n3562' href='#n3562'>3562</a>
<a id='n3563' href='#n3563'>3563</a>
<a id='n3564' href='#n3564'>3564</a>
<a id='n3565' href='#n3565'>3565</a>
<a id='n3566' href='#n3566'>3566</a>
<a id='n3567' href='#n3567'>3567</a>
<a id='n3568' href='#n3568'>3568</a>
<a id='n3569' href='#n3569'>3569</a>
<a id='n3570' href='#n3570'>3570</a>
<a id='n3571' href='#n3571'>3571</a>
<a id='n3572' href='#n3572'>3572</a>
<a id='n3573' href='#n3573'>3573</a>
<a id='n3574' href='#n3574'>3574</a>
<a id='n3575' href='#n3575'>3575</a>
<a id='n3576' href='#n3576'>3576</a>
<a id='n3577' href='#n3577'>3577</a>
<a id='n3578' href='#n3578'>3578</a>
<a id='n3579' href='#n3579'>3579</a>
<a id='n3580' href='#n3580'>3580</a>
<a id='n3581' href='#n3581'>3581</a>
<a id='n3582' href='#n3582'>3582</a>
<a id='n3583' href='#n3583'>3583</a>
<a id='n3584' href='#n3584'>3584</a>
<a id='n3585' href='#n3585'>3585</a>
<a id='n3586' href='#n3586'>3586</a>
<a id='n3587' href='#n3587'>3587</a>
<a id='n3588' href='#n3588'>3588</a>
<a id='n3589' href='#n3589'>3589</a>
<a id='n3590' href='#n3590'>3590</a>
<a id='n3591' href='#n3591'>3591</a>
<a id='n3592' href='#n3592'>3592</a>
<a id='n3593' href='#n3593'>3593</a>
<a id='n3594' href='#n3594'>3594</a>
<a id='n3595' href='#n3595'>3595</a>
<a id='n3596' href='#n3596'>3596</a>
<a id='n3597' href='#n3597'>3597</a>
<a id='n3598' href='#n3598'>3598</a>
<a id='n3599' href='#n3599'>3599</a>
<a id='n3600' href='#n3600'>3600</a>
<a id='n3601' href='#n3601'>3601</a>
<a id='n3602' href='#n3602'>3602</a>
<a id='n3603' href='#n3603'>3603</a>
<a id='n3604' href='#n3604'>3604</a>
<a id='n3605' href='#n3605'>3605</a>
<a id='n3606' href='#n3606'>3606</a>
<a id='n3607' href='#n3607'>3607</a>
<a id='n3608' href='#n3608'>3608</a>
<a id='n3609' href='#n3609'>3609</a>
<a id='n3610' href='#n3610'>3610</a>
<a id='n3611' href='#n3611'>3611</a>
<a id='n3612' href='#n3612'>3612</a>
<a id='n3613' href='#n3613'>3613</a>
<a id='n3614' href='#n3614'>3614</a>
<a id='n3615' href='#n3615'>3615</a>
<a id='n3616' href='#n3616'>3616</a>
<a id='n3617' href='#n3617'>3617</a>
<a id='n3618' href='#n3618'>3618</a>
<a id='n3619' href='#n3619'>3619</a>
<a id='n3620' href='#n3620'>3620</a>
<a id='n3621' href='#n3621'>3621</a>
<a id='n3622' href='#n3622'>3622</a>
<a id='n3623' href='#n3623'>3623</a>
<a id='n3624' href='#n3624'>3624</a>
<a id='n3625' href='#n3625'>3625</a>
<a id='n3626' href='#n3626'>3626</a>
<a id='n3627' href='#n3627'>3627</a>
<a id='n3628' href='#n3628'>3628</a>
<a id='n3629' href='#n3629'>3629</a>
<a id='n3630' href='#n3630'>3630</a>
<a id='n3631' href='#n3631'>3631</a>
<a id='n3632' href='#n3632'>3632</a>
<a id='n3633' href='#n3633'>3633</a>
<a id='n3634' href='#n3634'>3634</a>
<a id='n3635' href='#n3635'>3635</a>
<a id='n3636' href='#n3636'>3636</a>
<a id='n3637' href='#n3637'>3637</a>
<a id='n3638' href='#n3638'>3638</a>
<a id='n3639' href='#n3639'>3639</a>
<a id='n3640' href='#n3640'>3640</a>
<a id='n3641' href='#n3641'>3641</a>
<a id='n3642' href='#n3642'>3642</a>
<a id='n3643' href='#n3643'>3643</a>
<a id='n3644' href='#n3644'>3644</a>
<a id='n3645' href='#n3645'>3645</a>
<a id='n3646' href='#n3646'>3646</a>
<a id='n3647' href='#n3647'>3647</a>
<a id='n3648' href='#n3648'>3648</a>
<a id='n3649' href='#n3649'>3649</a>
<a id='n3650' href='#n3650'>3650</a>
<a id='n3651' href='#n3651'>3651</a>
<a id='n3652' href='#n3652'>3652</a>
<a id='n3653' href='#n3653'>3653</a>
<a id='n3654' href='#n3654'>3654</a>
<a id='n3655' href='#n3655'>3655</a>
<a id='n3656' href='#n3656'>3656</a>
<a id='n3657' href='#n3657'>3657</a>
<a id='n3658' href='#n3658'>3658</a>
<a id='n3659' href='#n3659'>3659</a>
<a id='n3660' href='#n3660'>3660</a>
<a id='n3661' href='#n3661'>3661</a>
<a id='n3662' href='#n3662'>3662</a>
<a id='n3663' href='#n3663'>3663</a>
<a id='n3664' href='#n3664'>3664</a>
<a id='n3665' href='#n3665'>3665</a>
<a id='n3666' href='#n3666'>3666</a>
<a id='n3667' href='#n3667'>3667</a>
<a id='n3668' href='#n3668'>3668</a>
<a id='n3669' href='#n3669'>3669</a>
<a id='n3670' href='#n3670'>3670</a>
<a id='n3671' href='#n3671'>3671</a>
<a id='n3672' href='#n3672'>3672</a>
<a id='n3673' href='#n3673'>3673</a>
<a id='n3674' href='#n3674'>3674</a>
<a id='n3675' href='#n3675'>3675</a>
<a id='n3676' href='#n3676'>3676</a>
<a id='n3677' href='#n3677'>3677</a>
<a id='n3678' href='#n3678'>3678</a>
<a id='n3679' href='#n3679'>3679</a>
<a id='n3680' href='#n3680'>3680</a>
<a id='n3681' href='#n3681'>3681</a>
<a id='n3682' href='#n3682'>3682</a>
<a id='n3683' href='#n3683'>3683</a>
<a id='n3684' href='#n3684'>3684</a>
<a id='n3685' href='#n3685'>3685</a>
<a id='n3686' href='#n3686'>3686</a>
<a id='n3687' href='#n3687'>3687</a>
<a id='n3688' href='#n3688'>3688</a>
<a id='n3689' href='#n3689'>3689</a>
<a id='n3690' href='#n3690'>3690</a>
<a id='n3691' href='#n3691'>3691</a>
<a id='n3692' href='#n3692'>3692</a>
<a id='n3693' href='#n3693'>3693</a>
<a id='n3694' href='#n3694'>3694</a>
<a id='n3695' href='#n3695'>3695</a>
<a id='n3696' href='#n3696'>3696</a>
<a id='n3697' href='#n3697'>3697</a>
<a id='n3698' href='#n3698'>3698</a>
<a id='n3699' href='#n3699'>3699</a>
<a id='n3700' href='#n3700'>3700</a>
<a id='n3701' href='#n3701'>3701</a>
<a id='n3702' href='#n3702'>3702</a>
<a id='n3703' href='#n3703'>3703</a>
<a id='n3704' href='#n3704'>3704</a>
<a id='n3705' href='#n3705'>3705</a>
<a id='n3706' href='#n3706'>3706</a>
<a id='n3707' href='#n3707'>3707</a>
<a id='n3708' href='#n3708'>3708</a>
<a id='n3709' href='#n3709'>3709</a>
<a id='n3710' href='#n3710'>3710</a>
<a id='n3711' href='#n3711'>3711</a>
<a id='n3712' href='#n3712'>3712</a>
<a id='n3713' href='#n3713'>3713</a>
<a id='n3714' href='#n3714'>3714</a>
<a id='n3715' href='#n3715'>3715</a>
<a id='n3716' href='#n3716'>3716</a>
<a id='n3717' href='#n3717'>3717</a>
<a id='n3718' href='#n3718'>3718</a>
<a id='n3719' href='#n3719'>3719</a>
<a id='n3720' href='#n3720'>3720</a>
<a id='n3721' href='#n3721'>3721</a>
<a id='n3722' href='#n3722'>3722</a>
<a id='n3723' href='#n3723'>3723</a>
<a id='n3724' href='#n3724'>3724</a>
<a id='n3725' href='#n3725'>3725</a>
<a id='n3726' href='#n3726'>3726</a>
<a id='n3727' href='#n3727'>3727</a>
<a id='n3728' href='#n3728'>3728</a>
<a id='n3729' href='#n3729'>3729</a>
<a id='n3730' href='#n3730'>3730</a>
<a id='n3731' href='#n3731'>3731</a>
<a id='n3732' href='#n3732'>3732</a>
<a id='n3733' href='#n3733'>3733</a>
<a id='n3734' href='#n3734'>3734</a>
<a id='n3735' href='#n3735'>3735</a>
<a id='n3736' href='#n3736'>3736</a>
<a id='n3737' href='#n3737'>3737</a>
<a id='n3738' href='#n3738'>3738</a>
<a id='n3739' href='#n3739'>3739</a>
<a id='n3740' href='#n3740'>3740</a>
<a id='n3741' href='#n3741'>3741</a>
<a id='n3742' href='#n3742'>3742</a>
<a id='n3743' href='#n3743'>3743</a>
<a id='n3744' href='#n3744'>3744</a>
<a id='n3745' href='#n3745'>3745</a>
<a id='n3746' href='#n3746'>3746</a>
<a id='n3747' href='#n3747'>3747</a>
<a id='n3748' href='#n3748'>3748</a>
<a id='n3749' href='#n3749'>3749</a>
<a id='n3750' href='#n3750'>3750</a>
<a id='n3751' href='#n3751'>3751</a>
<a id='n3752' href='#n3752'>3752</a>
<a id='n3753' href='#n3753'>3753</a>
<a id='n3754' href='#n3754'>3754</a>
<a id='n3755' href='#n3755'>3755</a>
<a id='n3756' href='#n3756'>3756</a>
<a id='n3757' href='#n3757'>3757</a>
<a id='n3758' href='#n3758'>3758</a>
<a id='n3759' href='#n3759'>3759</a>
<a id='n3760' href='#n3760'>3760</a>
<a id='n3761' href='#n3761'>3761</a>
<a id='n3762' href='#n3762'>3762</a>
<a id='n3763' href='#n3763'>3763</a>
<a id='n3764' href='#n3764'>3764</a>
<a id='n3765' href='#n3765'>3765</a>
<a id='n3766' href='#n3766'>3766</a>
<a id='n3767' href='#n3767'>3767</a>
<a id='n3768' href='#n3768'>3768</a>
<a id='n3769' href='#n3769'>3769</a>
<a id='n3770' href='#n3770'>3770</a>
<a id='n3771' href='#n3771'>3771</a>
<a id='n3772' href='#n3772'>3772</a>
<a id='n3773' href='#n3773'>3773</a>
<a id='n3774' href='#n3774'>3774</a>
<a id='n3775' href='#n3775'>3775</a>
<a id='n3776' href='#n3776'>3776</a>
<a id='n3777' href='#n3777'>3777</a>
<a id='n3778' href='#n3778'>3778</a>
<a id='n3779' href='#n3779'>3779</a>
<a id='n3780' href='#n3780'>3780</a>
<a id='n3781' href='#n3781'>3781</a>
<a id='n3782' href='#n3782'>3782</a>
<a id='n3783' href='#n3783'>3783</a>
<a id='n3784' href='#n3784'>3784</a>
<a id='n3785' href='#n3785'>3785</a>
<a id='n3786' href='#n3786'>3786</a>
<a id='n3787' href='#n3787'>3787</a>
<a id='n3788' href='#n3788'>3788</a>
<a id='n3789' href='#n3789'>3789</a>
<a id='n3790' href='#n3790'>3790</a>
<a id='n3791' href='#n3791'>3791</a>
<a id='n3792' href='#n3792'>3792</a>
<a id='n3793' href='#n3793'>3793</a>
<a id='n3794' href='#n3794'>3794</a>
<a id='n3795' href='#n3795'>3795</a>
<a id='n3796' href='#n3796'>3796</a>
<a id='n3797' href='#n3797'>3797</a>
<a id='n3798' href='#n3798'>3798</a>
<a id='n3799' href='#n3799'>3799</a>
<a id='n3800' href='#n3800'>3800</a>
<a id='n3801' href='#n3801'>3801</a>
<a id='n3802' href='#n3802'>3802</a>
<a id='n3803' href='#n3803'>3803</a>
<a id='n3804' href='#n3804'>3804</a>
<a id='n3805' href='#n3805'>3805</a>
<a id='n3806' href='#n3806'>3806</a>
<a id='n3807' href='#n3807'>3807</a>
<a id='n3808' href='#n3808'>3808</a>
<a id='n3809' href='#n3809'>3809</a>
<a id='n3810' href='#n3810'>3810</a>
<a id='n3811' href='#n3811'>3811</a>
<a id='n3812' href='#n3812'>3812</a>
<a id='n3813' href='#n3813'>3813</a>
<a id='n3814' href='#n3814'>3814</a>
<a id='n3815' href='#n3815'>3815</a>
<a id='n3816' href='#n3816'>3816</a>
<a id='n3817' href='#n3817'>3817</a>
<a id='n3818' href='#n3818'>3818</a>
<a id='n3819' href='#n3819'>3819</a>
<a id='n3820' href='#n3820'>3820</a>
<a id='n3821' href='#n3821'>3821</a>
<a id='n3822' href='#n3822'>3822</a>
<a id='n3823' href='#n3823'>3823</a>
<a id='n3824' href='#n3824'>3824</a>
<a id='n3825' href='#n3825'>3825</a>
<a id='n3826' href='#n3826'>3826</a>
<a id='n3827' href='#n3827'>3827</a>
<a id='n3828' href='#n3828'>3828</a>
<a id='n3829' href='#n3829'>3829</a>
<a id='n3830' href='#n3830'>3830</a>
<a id='n3831' href='#n3831'>3831</a>
<a id='n3832' href='#n3832'>3832</a>
<a id='n3833' href='#n3833'>3833</a>
<a id='n3834' href='#n3834'>3834</a>
<a id='n3835' href='#n3835'>3835</a>
<a id='n3836' href='#n3836'>3836</a>
<a id='n3837' href='#n3837'>3837</a>
<a id='n3838' href='#n3838'>3838</a>
<a id='n3839' href='#n3839'>3839</a>
<a id='n3840' href='#n3840'>3840</a>
<a id='n3841' href='#n3841'>3841</a>
<a id='n3842' href='#n3842'>3842</a>
<a id='n3843' href='#n3843'>3843</a>
<a id='n3844' href='#n3844'>3844</a>
<a id='n3845' href='#n3845'>3845</a>
<a id='n3846' href='#n3846'>3846</a>
<a id='n3847' href='#n3847'>3847</a>
<a id='n3848' href='#n3848'>3848</a>
<a id='n3849' href='#n3849'>3849</a>
<a id='n3850' href='#n3850'>3850</a>
<a id='n3851' href='#n3851'>3851</a>
<a id='n3852' href='#n3852'>3852</a>
<a id='n3853' href='#n3853'>3853</a>
<a id='n3854' href='#n3854'>3854</a>
<a id='n3855' href='#n3855'>3855</a>
<a id='n3856' href='#n3856'>3856</a>
<a id='n3857' href='#n3857'>3857</a>
<a id='n3858' href='#n3858'>3858</a>
<a id='n3859' href='#n3859'>3859</a>
<a id='n3860' href='#n3860'>3860</a>
<a id='n3861' href='#n3861'>3861</a>
<a id='n3862' href='#n3862'>3862</a>
<a id='n3863' href='#n3863'>3863</a>
<a id='n3864' href='#n3864'>3864</a>
<a id='n3865' href='#n3865'>3865</a>
<a id='n3866' href='#n3866'>3866</a>
<a id='n3867' href='#n3867'>3867</a>
<a id='n3868' href='#n3868'>3868</a>
<a id='n3869' href='#n3869'>3869</a>
<a id='n3870' href='#n3870'>3870</a>
<a id='n3871' href='#n3871'>3871</a>
<a id='n3872' href='#n3872'>3872</a>
<a id='n3873' href='#n3873'>3873</a>
<a id='n3874' href='#n3874'>3874</a>
<a id='n3875' href='#n3875'>3875</a>
<a id='n3876' href='#n3876'>3876</a>
<a id='n3877' href='#n3877'>3877</a>
<a id='n3878' href='#n3878'>3878</a>
<a id='n3879' href='#n3879'>3879</a>
<a id='n3880' href='#n3880'>3880</a>
<a id='n3881' href='#n3881'>3881</a>
<a id='n3882' href='#n3882'>3882</a>
<a id='n3883' href='#n3883'>3883</a>
<a id='n3884' href='#n3884'>3884</a>
<a id='n3885' href='#n3885'>3885</a>
<a id='n3886' href='#n3886'>3886</a>
<a id='n3887' href='#n3887'>3887</a>
<a id='n3888' href='#n3888'>3888</a>
<a id='n3889' href='#n3889'>3889</a>
<a id='n3890' href='#n3890'>3890</a>
<a id='n3891' href='#n3891'>3891</a>
<a id='n3892' href='#n3892'>3892</a>
<a id='n3893' href='#n3893'>3893</a>
<a id='n3894' href='#n3894'>3894</a>
<a id='n3895' href='#n3895'>3895</a>
<a id='n3896' href='#n3896'>3896</a>
<a id='n3897' href='#n3897'>3897</a>
<a id='n3898' href='#n3898'>3898</a>
<a id='n3899' href='#n3899'>3899</a>
<a id='n3900' href='#n3900'>3900</a>
<a id='n3901' href='#n3901'>3901</a>
<a id='n3902' href='#n3902'>3902</a>
<a id='n3903' href='#n3903'>3903</a>
<a id='n3904' href='#n3904'>3904</a>
<a id='n3905' href='#n3905'>3905</a>
<a id='n3906' href='#n3906'>3906</a>
<a id='n3907' href='#n3907'>3907</a>
<a id='n3908' href='#n3908'>3908</a>
<a id='n3909' href='#n3909'>3909</a>
<a id='n3910' href='#n3910'>3910</a>
<a id='n3911' href='#n3911'>3911</a>
<a id='n3912' href='#n3912'>3912</a>
<a id='n3913' href='#n3913'>3913</a>
<a id='n3914' href='#n3914'>3914</a>
<a id='n3915' href='#n3915'>3915</a>
<a id='n3916' href='#n3916'>3916</a>
<a id='n3917' href='#n3917'>3917</a>
<a id='n3918' href='#n3918'>3918</a>
<a id='n3919' href='#n3919'>3919</a>
<a id='n3920' href='#n3920'>3920</a>
<a id='n3921' href='#n3921'>3921</a>
<a id='n3922' href='#n3922'>3922</a>
<a id='n3923' href='#n3923'>3923</a>
<a id='n3924' href='#n3924'>3924</a>
<a id='n3925' href='#n3925'>3925</a>
<a id='n3926' href='#n3926'>3926</a>
<a id='n3927' href='#n3927'>3927</a>
<a id='n3928' href='#n3928'>3928</a>
<a id='n3929' href='#n3929'>3929</a>
<a id='n3930' href='#n3930'>3930</a>
<a id='n3931' href='#n3931'>3931</a>
<a id='n3932' href='#n3932'>3932</a>
<a id='n3933' href='#n3933'>3933</a>
<a id='n3934' href='#n3934'>3934</a>
<a id='n3935' href='#n3935'>3935</a>
<a id='n3936' href='#n3936'>3936</a>
<a id='n3937' href='#n3937'>3937</a>
<a id='n3938' href='#n3938'>3938</a>
<a id='n3939' href='#n3939'>3939</a>
<a id='n3940' href='#n3940'>3940</a>
<a id='n3941' href='#n3941'>3941</a>
<a id='n3942' href='#n3942'>3942</a>
<a id='n3943' href='#n3943'>3943</a>
<a id='n3944' href='#n3944'>3944</a>
<a id='n3945' href='#n3945'>3945</a>
<a id='n3946' href='#n3946'>3946</a>
<a id='n3947' href='#n3947'>3947</a>
<a id='n3948' href='#n3948'>3948</a>
<a id='n3949' href='#n3949'>3949</a>
<a id='n3950' href='#n3950'>3950</a>
<a id='n3951' href='#n3951'>3951</a>
<a id='n3952' href='#n3952'>3952</a>
<a id='n3953' href='#n3953'>3953</a>
<a id='n3954' href='#n3954'>3954</a>
<a id='n3955' href='#n3955'>3955</a>
<a id='n3956' href='#n3956'>3956</a>
<a id='n3957' href='#n3957'>3957</a>
<a id='n3958' href='#n3958'>3958</a>
<a id='n3959' href='#n3959'>3959</a>
<a id='n3960' href='#n3960'>3960</a>
<a id='n3961' href='#n3961'>3961</a>
<a id='n3962' href='#n3962'>3962</a>
<a id='n3963' href='#n3963'>3963</a>
<a id='n3964' href='#n3964'>3964</a>
<a id='n3965' href='#n3965'>3965</a>
<a id='n3966' href='#n3966'>3966</a>
<a id='n3967' href='#n3967'>3967</a>
<a id='n3968' href='#n3968'>3968</a>
<a id='n3969' href='#n3969'>3969</a>
<a id='n3970' href='#n3970'>3970</a>
<a id='n3971' href='#n3971'>3971</a>
<a id='n3972' href='#n3972'>3972</a>
<a id='n3973' href='#n3973'>3973</a>
<a id='n3974' href='#n3974'>3974</a>
<a id='n3975' href='#n3975'>3975</a>
<a id='n3976' href='#n3976'>3976</a>
<a id='n3977' href='#n3977'>3977</a>
<a id='n3978' href='#n3978'>3978</a>
<a id='n3979' href='#n3979'>3979</a>
<a id='n3980' href='#n3980'>3980</a>
<a id='n3981' href='#n3981'>3981</a>
<a id='n3982' href='#n3982'>3982</a>
<a id='n3983' href='#n3983'>3983</a>
<a id='n3984' href='#n3984'>3984</a>
<a id='n3985' href='#n3985'>3985</a>
<a id='n3986' href='#n3986'>3986</a>
<a id='n3987' href='#n3987'>3987</a>
<a id='n3988' href='#n3988'>3988</a>
<a id='n3989' href='#n3989'>3989</a>
<a id='n3990' href='#n3990'>3990</a>
<a id='n3991' href='#n3991'>3991</a>
<a id='n3992' href='#n3992'>3992</a>
<a id='n3993' href='#n3993'>3993</a>
<a id='n3994' href='#n3994'>3994</a>
<a id='n3995' href='#n3995'>3995</a>
<a id='n3996' href='#n3996'>3996</a>
<a id='n3997' href='#n3997'>3997</a>
<a id='n3998' href='#n3998'>3998</a>
<a id='n3999' href='#n3999'>3999</a>
<a id='n4000' href='#n4000'>4000</a>
<a id='n4001' href='#n4001'>4001</a>
<a id='n4002' href='#n4002'>4002</a>
<a id='n4003' href='#n4003'>4003</a>
<a id='n4004' href='#n4004'>4004</a>
<a id='n4005' href='#n4005'>4005</a>
<a id='n4006' href='#n4006'>4006</a>
<a id='n4007' href='#n4007'>4007</a>
<a id='n4008' href='#n4008'>4008</a>
<a id='n4009' href='#n4009'>4009</a>
<a id='n4010' href='#n4010'>4010</a>
<a id='n4011' href='#n4011'>4011</a>
<a id='n4012' href='#n4012'>4012</a>
<a id='n4013' href='#n4013'>4013</a>
<a id='n4014' href='#n4014'>4014</a>
<a id='n4015' href='#n4015'>4015</a>
<a id='n4016' href='#n4016'>4016</a>
<a id='n4017' href='#n4017'>4017</a>
<a id='n4018' href='#n4018'>4018</a>
<a id='n4019' href='#n4019'>4019</a>
<a id='n4020' href='#n4020'>4020</a>
<a id='n4021' href='#n4021'>4021</a>
<a id='n4022' href='#n4022'>4022</a>
<a id='n4023' href='#n4023'>4023</a>
<a id='n4024' href='#n4024'>4024</a>
<a id='n4025' href='#n4025'>4025</a>
<a id='n4026' href='#n4026'>4026</a>
<a id='n4027' href='#n4027'>4027</a>
<a id='n4028' href='#n4028'>4028</a>
<a id='n4029' href='#n4029'>4029</a>
<a id='n4030' href='#n4030'>4030</a>
<a id='n4031' href='#n4031'>4031</a>
<a id='n4032' href='#n4032'>4032</a>
<a id='n4033' href='#n4033'>4033</a>
<a id='n4034' href='#n4034'>4034</a>
<a id='n4035' href='#n4035'>4035</a>
<a id='n4036' href='#n4036'>4036</a>
<a id='n4037' href='#n4037'>4037</a>
<a id='n4038' href='#n4038'>4038</a>
<a id='n4039' href='#n4039'>4039</a>
<a id='n4040' href='#n4040'>4040</a>
<a id='n4041' href='#n4041'>4041</a>
<a id='n4042' href='#n4042'>4042</a>
<a id='n4043' href='#n4043'>4043</a>
<a id='n4044' href='#n4044'>4044</a>
<a id='n4045' href='#n4045'>4045</a>
<a id='n4046' href='#n4046'>4046</a>
<a id='n4047' href='#n4047'>4047</a>
<a id='n4048' href='#n4048'>4048</a>
<a id='n4049' href='#n4049'>4049</a>
<a id='n4050' href='#n4050'>4050</a>
<a id='n4051' href='#n4051'>4051</a>
<a id='n4052' href='#n4052'>4052</a>
<a id='n4053' href='#n4053'>4053</a>
<a id='n4054' href='#n4054'>4054</a>
<a id='n4055' href='#n4055'>4055</a>
<a id='n4056' href='#n4056'>4056</a>
<a id='n4057' href='#n4057'>4057</a>
<a id='n4058' href='#n4058'>4058</a>
<a id='n4059' href='#n4059'>4059</a>
<a id='n4060' href='#n4060'>4060</a>
<a id='n4061' href='#n4061'>4061</a>
<a id='n4062' href='#n4062'>4062</a>
<a id='n4063' href='#n4063'>4063</a>
<a id='n4064' href='#n4064'>4064</a>
<a id='n4065' href='#n4065'>4065</a>
<a id='n4066' href='#n4066'>4066</a>
<a id='n4067' href='#n4067'>4067</a>
<a id='n4068' href='#n4068'>4068</a>
<a id='n4069' href='#n4069'>4069</a>
<a id='n4070' href='#n4070'>4070</a>
<a id='n4071' href='#n4071'>4071</a>
<a id='n4072' href='#n4072'>4072</a>
<a id='n4073' href='#n4073'>4073</a>
<a id='n4074' href='#n4074'>4074</a>
<a id='n4075' href='#n4075'>4075</a>
<a id='n4076' href='#n4076'>4076</a>
<a id='n4077' href='#n4077'>4077</a>
<a id='n4078' href='#n4078'>4078</a>
<a id='n4079' href='#n4079'>4079</a>
<a id='n4080' href='#n4080'>4080</a>
<a id='n4081' href='#n4081'>4081</a>
<a id='n4082' href='#n4082'>4082</a>
<a id='n4083' href='#n4083'>4083</a>
<a id='n4084' href='#n4084'>4084</a>
<a id='n4085' href='#n4085'>4085</a>
<a id='n4086' href='#n4086'>4086</a>
<a id='n4087' href='#n4087'>4087</a>
<a id='n4088' href='#n4088'>4088</a>
<a id='n4089' href='#n4089'>4089</a>
<a id='n4090' href='#n4090'>4090</a>
<a id='n4091' href='#n4091'>4091</a>
<a id='n4092' href='#n4092'>4092</a>
<a id='n4093' href='#n4093'>4093</a>
<a id='n4094' href='#n4094'>4094</a>
<a id='n4095' href='#n4095'>4095</a>
<a id='n4096' href='#n4096'>4096</a>
<a id='n4097' href='#n4097'>4097</a>
<a id='n4098' href='#n4098'>4098</a>
<a id='n4099' href='#n4099'>4099</a>
<a id='n4100' href='#n4100'>4100</a>
<a id='n4101' href='#n4101'>4101</a>
<a id='n4102' href='#n4102'>4102</a>
<a id='n4103' href='#n4103'>4103</a>
<a id='n4104' href='#n4104'>4104</a>
<a id='n4105' href='#n4105'>4105</a>
<a id='n4106' href='#n4106'>4106</a>
<a id='n4107' href='#n4107'>4107</a>
<a id='n4108' href='#n4108'>4108</a>
<a id='n4109' href='#n4109'>4109</a>
<a id='n4110' href='#n4110'>4110</a>
<a id='n4111' href='#n4111'>4111</a>
<a id='n4112' href='#n4112'>4112</a>
<a id='n4113' href='#n4113'>4113</a>
<a id='n4114' href='#n4114'>4114</a>
<a id='n4115' href='#n4115'>4115</a>
<a id='n4116' href='#n4116'>4116</a>
<a id='n4117' href='#n4117'>4117</a>
<a id='n4118' href='#n4118'>4118</a>
<a id='n4119' href='#n4119'>4119</a>
<a id='n4120' href='#n4120'>4120</a>
<a id='n4121' href='#n4121'>4121</a>
<a id='n4122' href='#n4122'>4122</a>
<a id='n4123' href='#n4123'>4123</a>
<a id='n4124' href='#n4124'>4124</a>
<a id='n4125' href='#n4125'>4125</a>
<a id='n4126' href='#n4126'>4126</a>
<a id='n4127' href='#n4127'>4127</a>
<a id='n4128' href='#n4128'>4128</a>
<a id='n4129' href='#n4129'>4129</a>
<a id='n4130' href='#n4130'>4130</a>
<a id='n4131' href='#n4131'>4131</a>
<a id='n4132' href='#n4132'>4132</a>
<a id='n4133' href='#n4133'>4133</a>
<a id='n4134' href='#n4134'>4134</a>
<a id='n4135' href='#n4135'>4135</a>
<a id='n4136' href='#n4136'>4136</a>
<a id='n4137' href='#n4137'>4137</a>
<a id='n4138' href='#n4138'>4138</a>
<a id='n4139' href='#n4139'>4139</a>
<a id='n4140' href='#n4140'>4140</a>
<a id='n4141' href='#n4141'>4141</a>
<a id='n4142' href='#n4142'>4142</a>
<a id='n4143' href='#n4143'>4143</a>
<a id='n4144' href='#n4144'>4144</a>
<a id='n4145' href='#n4145'>4145</a>
<a id='n4146' href='#n4146'>4146</a>
<a id='n4147' href='#n4147'>4147</a>
<a id='n4148' href='#n4148'>4148</a>
<a id='n4149' href='#n4149'>4149</a>
<a id='n4150' href='#n4150'>4150</a>
<a id='n4151' href='#n4151'>4151</a>
<a id='n4152' href='#n4152'>4152</a>
<a id='n4153' href='#n4153'>4153</a>
<a id='n4154' href='#n4154'>4154</a>
<a id='n4155' href='#n4155'>4155</a>
<a id='n4156' href='#n4156'>4156</a>
<a id='n4157' href='#n4157'>4157</a>
<a id='n4158' href='#n4158'>4158</a>
<a id='n4159' href='#n4159'>4159</a>
<a id='n4160' href='#n4160'>4160</a>
<a id='n4161' href='#n4161'>4161</a>
<a id='n4162' href='#n4162'>4162</a>
<a id='n4163' href='#n4163'>4163</a>
<a id='n4164' href='#n4164'>4164</a>
<a id='n4165' href='#n4165'>4165</a>
<a id='n4166' href='#n4166'>4166</a>
<a id='n4167' href='#n4167'>4167</a>
<a id='n4168' href='#n4168'>4168</a>
<a id='n4169' href='#n4169'>4169</a>
<a id='n4170' href='#n4170'>4170</a>
<a id='n4171' href='#n4171'>4171</a>
<a id='n4172' href='#n4172'>4172</a>
<a id='n4173' href='#n4173'>4173</a>
<a id='n4174' href='#n4174'>4174</a>
<a id='n4175' href='#n4175'>4175</a>
<a id='n4176' href='#n4176'>4176</a>
<a id='n4177' href='#n4177'>4177</a>
<a id='n4178' href='#n4178'>4178</a>
<a id='n4179' href='#n4179'>4179</a>
<a id='n4180' href='#n4180'>4180</a>
<a id='n4181' href='#n4181'>4181</a>
<a id='n4182' href='#n4182'>4182</a>
<a id='n4183' href='#n4183'>4183</a>
<a id='n4184' href='#n4184'>4184</a>
<a id='n4185' href='#n4185'>4185</a>
<a id='n4186' href='#n4186'>4186</a>
<a id='n4187' href='#n4187'>4187</a>
<a id='n4188' href='#n4188'>4188</a>
<a id='n4189' href='#n4189'>4189</a>
<a id='n4190' href='#n4190'>4190</a>
<a id='n4191' href='#n4191'>4191</a>
<a id='n4192' href='#n4192'>4192</a>
<a id='n4193' href='#n4193'>4193</a>
<a id='n4194' href='#n4194'>4194</a>
<a id='n4195' href='#n4195'>4195</a>
<a id='n4196' href='#n4196'>4196</a>
<a id='n4197' href='#n4197'>4197</a>
<a id='n4198' href='#n4198'>4198</a>
<a id='n4199' href='#n4199'>4199</a>
<a id='n4200' href='#n4200'>4200</a>
<a id='n4201' href='#n4201'>4201</a>
<a id='n4202' href='#n4202'>4202</a>
<a id='n4203' href='#n4203'>4203</a>
<a id='n4204' href='#n4204'>4204</a>
<a id='n4205' href='#n4205'>4205</a>
<a id='n4206' href='#n4206'>4206</a>
<a id='n4207' href='#n4207'>4207</a>
<a id='n4208' href='#n4208'>4208</a>
<a id='n4209' href='#n4209'>4209</a>
<a id='n4210' href='#n4210'>4210</a>
<a id='n4211' href='#n4211'>4211</a>
<a id='n4212' href='#n4212'>4212</a>
<a id='n4213' href='#n4213'>4213</a>
<a id='n4214' href='#n4214'>4214</a>
<a id='n4215' href='#n4215'>4215</a>
<a id='n4216' href='#n4216'>4216</a>
<a id='n4217' href='#n4217'>4217</a>
<a id='n4218' href='#n4218'>4218</a>
<a id='n4219' href='#n4219'>4219</a>
<a id='n4220' href='#n4220'>4220</a>
<a id='n4221' href='#n4221'>4221</a>
<a id='n4222' href='#n4222'>4222</a>
<a id='n4223' href='#n4223'>4223</a>
<a id='n4224' href='#n4224'>4224</a>
<a id='n4225' href='#n4225'>4225</a>
<a id='n4226' href='#n4226'>4226</a>
<a id='n4227' href='#n4227'>4227</a>
<a id='n4228' href='#n4228'>4228</a>
<a id='n4229' href='#n4229'>4229</a>
<a id='n4230' href='#n4230'>4230</a>
<a id='n4231' href='#n4231'>4231</a>
<a id='n4232' href='#n4232'>4232</a>
<a id='n4233' href='#n4233'>4233</a>
<a id='n4234' href='#n4234'>4234</a>
<a id='n4235' href='#n4235'>4235</a>
<a id='n4236' href='#n4236'>4236</a>
<a id='n4237' href='#n4237'>4237</a>
<a id='n4238' href='#n4238'>4238</a>
<a id='n4239' href='#n4239'>4239</a>
<a id='n4240' href='#n4240'>4240</a>
<a id='n4241' href='#n4241'>4241</a>
<a id='n4242' href='#n4242'>4242</a>
<a id='n4243' href='#n4243'>4243</a>
<a id='n4244' href='#n4244'>4244</a>
<a id='n4245' href='#n4245'>4245</a>
<a id='n4246' href='#n4246'>4246</a>
<a id='n4247' href='#n4247'>4247</a>
<a id='n4248' href='#n4248'>4248</a>
<a id='n4249' href='#n4249'>4249</a>
<a id='n4250' href='#n4250'>4250</a>
<a id='n4251' href='#n4251'>4251</a>
<a id='n4252' href='#n4252'>4252</a>
<a id='n4253' href='#n4253'>4253</a>
<a id='n4254' href='#n4254'>4254</a>
<a id='n4255' href='#n4255'>4255</a>
<a id='n4256' href='#n4256'>4256</a>
<a id='n4257' href='#n4257'>4257</a>
<a id='n4258' href='#n4258'>4258</a>
<a id='n4259' href='#n4259'>4259</a>
<a id='n4260' href='#n4260'>4260</a>
<a id='n4261' href='#n4261'>4261</a>
<a id='n4262' href='#n4262'>4262</a>
<a id='n4263' href='#n4263'>4263</a>
<a id='n4264' href='#n4264'>4264</a>
<a id='n4265' href='#n4265'>4265</a>
<a id='n4266' href='#n4266'>4266</a>
<a id='n4267' href='#n4267'>4267</a>
<a id='n4268' href='#n4268'>4268</a>
<a id='n4269' href='#n4269'>4269</a>
<a id='n4270' href='#n4270'>4270</a>
<a id='n4271' href='#n4271'>4271</a>
<a id='n4272' href='#n4272'>4272</a>
<a id='n4273' href='#n4273'>4273</a>
<a id='n4274' href='#n4274'>4274</a>
<a id='n4275' href='#n4275'>4275</a>
<a id='n4276' href='#n4276'>4276</a>
<a id='n4277' href='#n4277'>4277</a>
<a id='n4278' href='#n4278'>4278</a>
<a id='n4279' href='#n4279'>4279</a>
<a id='n4280' href='#n4280'>4280</a>
<a id='n4281' href='#n4281'>4281</a>
<a id='n4282' href='#n4282'>4282</a>
<a id='n4283' href='#n4283'>4283</a>
<a id='n4284' href='#n4284'>4284</a>
<a id='n4285' href='#n4285'>4285</a>
<a id='n4286' href='#n4286'>4286</a>
<a id='n4287' href='#n4287'>4287</a>
<a id='n4288' href='#n4288'>4288</a>
<a id='n4289' href='#n4289'>4289</a>
<a id='n4290' href='#n4290'>4290</a>
<a id='n4291' href='#n4291'>4291</a>
<a id='n4292' href='#n4292'>4292</a>
<a id='n4293' href='#n4293'>4293</a>
<a id='n4294' href='#n4294'>4294</a>
<a id='n4295' href='#n4295'>4295</a>
<a id='n4296' href='#n4296'>4296</a>
<a id='n4297' href='#n4297'>4297</a>
<a id='n4298' href='#n4298'>4298</a>
<a id='n4299' href='#n4299'>4299</a>
<a id='n4300' href='#n4300'>4300</a>
<a id='n4301' href='#n4301'>4301</a>
<a id='n4302' href='#n4302'>4302</a>
<a id='n4303' href='#n4303'>4303</a>
<a id='n4304' href='#n4304'>4304</a>
<a id='n4305' href='#n4305'>4305</a>
<a id='n4306' href='#n4306'>4306</a>
<a id='n4307' href='#n4307'>4307</a>
<a id='n4308' href='#n4308'>4308</a>
<a id='n4309' href='#n4309'>4309</a>
<a id='n4310' href='#n4310'>4310</a>
<a id='n4311' href='#n4311'>4311</a>
<a id='n4312' href='#n4312'>4312</a>
<a id='n4313' href='#n4313'>4313</a>
<a id='n4314' href='#n4314'>4314</a>
<a id='n4315' href='#n4315'>4315</a>
<a id='n4316' href='#n4316'>4316</a>
<a id='n4317' href='#n4317'>4317</a>
<a id='n4318' href='#n4318'>4318</a>
<a id='n4319' href='#n4319'>4319</a>
<a id='n4320' href='#n4320'>4320</a>
<a id='n4321' href='#n4321'>4321</a>
<a id='n4322' href='#n4322'>4322</a>
<a id='n4323' href='#n4323'>4323</a>
<a id='n4324' href='#n4324'>4324</a>
<a id='n4325' href='#n4325'>4325</a>
<a id='n4326' href='#n4326'>4326</a>
<a id='n4327' href='#n4327'>4327</a>
<a id='n4328' href='#n4328'>4328</a>
<a id='n4329' href='#n4329'>4329</a>
<a id='n4330' href='#n4330'>4330</a>
<a id='n4331' href='#n4331'>4331</a>
<a id='n4332' href='#n4332'>4332</a>
<a id='n4333' href='#n4333'>4333</a>
<a id='n4334' href='#n4334'>4334</a>
<a id='n4335' href='#n4335'>4335</a>
<a id='n4336' href='#n4336'>4336</a>
<a id='n4337' href='#n4337'>4337</a>
<a id='n4338' href='#n4338'>4338</a>
<a id='n4339' href='#n4339'>4339</a>
<a id='n4340' href='#n4340'>4340</a>
<a id='n4341' href='#n4341'>4341</a>
<a id='n4342' href='#n4342'>4342</a>
<a id='n4343' href='#n4343'>4343</a>
<a id='n4344' href='#n4344'>4344</a>
<a id='n4345' href='#n4345'>4345</a>
<a id='n4346' href='#n4346'>4346</a>
<a id='n4347' href='#n4347'>4347</a>
<a id='n4348' href='#n4348'>4348</a>
<a id='n4349' href='#n4349'>4349</a>
<a id='n4350' href='#n4350'>4350</a>
<a id='n4351' href='#n4351'>4351</a>
<a id='n4352' href='#n4352'>4352</a>
<a id='n4353' href='#n4353'>4353</a>
<a id='n4354' href='#n4354'>4354</a>
<a id='n4355' href='#n4355'>4355</a>
<a id='n4356' href='#n4356'>4356</a>
<a id='n4357' href='#n4357'>4357</a>
<a id='n4358' href='#n4358'>4358</a>
<a id='n4359' href='#n4359'>4359</a>
<a id='n4360' href='#n4360'>4360</a>
<a id='n4361' href='#n4361'>4361</a>
<a id='n4362' href='#n4362'>4362</a>
<a id='n4363' href='#n4363'>4363</a>
<a id='n4364' href='#n4364'>4364</a>
<a id='n4365' href='#n4365'>4365</a>
<a id='n4366' href='#n4366'>4366</a>
<a id='n4367' href='#n4367'>4367</a>
<a id='n4368' href='#n4368'>4368</a>
<a id='n4369' href='#n4369'>4369</a>
<a id='n4370' href='#n4370'>4370</a>
<a id='n4371' href='#n4371'>4371</a>
<a id='n4372' href='#n4372'>4372</a>
<a id='n4373' href='#n4373'>4373</a>
<a id='n4374' href='#n4374'>4374</a>
<a id='n4375' href='#n4375'>4375</a>
<a id='n4376' href='#n4376'>4376</a>
<a id='n4377' href='#n4377'>4377</a>
<a id='n4378' href='#n4378'>4378</a>
<a id='n4379' href='#n4379'>4379</a>
<a id='n4380' href='#n4380'>4380</a>
<a id='n4381' href='#n4381'>4381</a>
<a id='n4382' href='#n4382'>4382</a>
<a id='n4383' href='#n4383'>4383</a>
<a id='n4384' href='#n4384'>4384</a>
<a id='n4385' href='#n4385'>4385</a>
<a id='n4386' href='#n4386'>4386</a>
<a id='n4387' href='#n4387'>4387</a>
<a id='n4388' href='#n4388'>4388</a>
<a id='n4389' href='#n4389'>4389</a>
<a id='n4390' href='#n4390'>4390</a>
<a id='n4391' href='#n4391'>4391</a>
<a id='n4392' href='#n4392'>4392</a>
<a id='n4393' href='#n4393'>4393</a>
<a id='n4394' href='#n4394'>4394</a>
<a id='n4395' href='#n4395'>4395</a>
<a id='n4396' href='#n4396'>4396</a>
<a id='n4397' href='#n4397'>4397</a>
<a id='n4398' href='#n4398'>4398</a>
<a id='n4399' href='#n4399'>4399</a>
<a id='n4400' href='#n4400'>4400</a>
<a id='n4401' href='#n4401'>4401</a>
<a id='n4402' href='#n4402'>4402</a>
<a id='n4403' href='#n4403'>4403</a>
<a id='n4404' href='#n4404'>4404</a>
<a id='n4405' href='#n4405'>4405</a>
<a id='n4406' href='#n4406'>4406</a>
<a id='n4407' href='#n4407'>4407</a>
<a id='n4408' href='#n4408'>4408</a>
<a id='n4409' href='#n4409'>4409</a>
<a id='n4410' href='#n4410'>4410</a>
<a id='n4411' href='#n4411'>4411</a>
<a id='n4412' href='#n4412'>4412</a>
<a id='n4413' href='#n4413'>4413</a>
<a id='n4414' href='#n4414'>4414</a>
<a id='n4415' href='#n4415'>4415</a>
<a id='n4416' href='#n4416'>4416</a>
<a id='n4417' href='#n4417'>4417</a>
<a id='n4418' href='#n4418'>4418</a>
<a id='n4419' href='#n4419'>4419</a>
<a id='n4420' href='#n4420'>4420</a>
<a id='n4421' href='#n4421'>4421</a>
<a id='n4422' href='#n4422'>4422</a>
<a id='n4423' href='#n4423'>4423</a>
<a id='n4424' href='#n4424'>4424</a>
<a id='n4425' href='#n4425'>4425</a>
<a id='n4426' href='#n4426'>4426</a>
<a id='n4427' href='#n4427'>4427</a>
<a id='n4428' href='#n4428'>4428</a>
<a id='n4429' href='#n4429'>4429</a>
<a id='n4430' href='#n4430'>4430</a>
<a id='n4431' href='#n4431'>4431</a>
<a id='n4432' href='#n4432'>4432</a>
<a id='n4433' href='#n4433'>4433</a>
<a id='n4434' href='#n4434'>4434</a>
<a id='n4435' href='#n4435'>4435</a>
<a id='n4436' href='#n4436'>4436</a>
<a id='n4437' href='#n4437'>4437</a>
<a id='n4438' href='#n4438'>4438</a>
<a id='n4439' href='#n4439'>4439</a>
<a id='n4440' href='#n4440'>4440</a>
<a id='n4441' href='#n4441'>4441</a>
<a id='n4442' href='#n4442'>4442</a>
<a id='n4443' href='#n4443'>4443</a>
<a id='n4444' href='#n4444'>4444</a>
<a id='n4445' href='#n4445'>4445</a>
<a id='n4446' href='#n4446'>4446</a>
<a id='n4447' href='#n4447'>4447</a>
<a id='n4448' href='#n4448'>4448</a>
<a id='n4449' href='#n4449'>4449</a>
<a id='n4450' href='#n4450'>4450</a>
<a id='n4451' href='#n4451'>4451</a>
<a id='n4452' href='#n4452'>4452</a>
<a id='n4453' href='#n4453'>4453</a>
<a id='n4454' href='#n4454'>4454</a>
<a id='n4455' href='#n4455'>4455</a>
<a id='n4456' href='#n4456'>4456</a>
<a id='n4457' href='#n4457'>4457</a>
<a id='n4458' href='#n4458'>4458</a>
<a id='n4459' href='#n4459'>4459</a>
<a id='n4460' href='#n4460'>4460</a>
<a id='n4461' href='#n4461'>4461</a>
<a id='n4462' href='#n4462'>4462</a>
<a id='n4463' href='#n4463'>4463</a>
<a id='n4464' href='#n4464'>4464</a>
<a id='n4465' href='#n4465'>4465</a>
<a id='n4466' href='#n4466'>4466</a>
<a id='n4467' href='#n4467'>4467</a>
<a id='n4468' href='#n4468'>4468</a>
<a id='n4469' href='#n4469'>4469</a>
<a id='n4470' href='#n4470'>4470</a>
<a id='n4471' href='#n4471'>4471</a>
<a id='n4472' href='#n4472'>4472</a>
<a id='n4473' href='#n4473'>4473</a>
<a id='n4474' href='#n4474'>4474</a>
<a id='n4475' href='#n4475'>4475</a>
<a id='n4476' href='#n4476'>4476</a>
<a id='n4477' href='#n4477'>4477</a>
<a id='n4478' href='#n4478'>4478</a>
<a id='n4479' href='#n4479'>4479</a>
<a id='n4480' href='#n4480'>4480</a>
<a id='n4481' href='#n4481'>4481</a>
<a id='n4482' href='#n4482'>4482</a>
<a id='n4483' href='#n4483'>4483</a>
<a id='n4484' href='#n4484'>4484</a>
<a id='n4485' href='#n4485'>4485</a>
<a id='n4486' href='#n4486'>4486</a>
<a id='n4487' href='#n4487'>4487</a>
<a id='n4488' href='#n4488'>4488</a>
<a id='n4489' href='#n4489'>4489</a>
<a id='n4490' href='#n4490'>4490</a>
<a id='n4491' href='#n4491'>4491</a>
<a id='n4492' href='#n4492'>4492</a>
<a id='n4493' href='#n4493'>4493</a>
<a id='n4494' href='#n4494'>4494</a>
<a id='n4495' href='#n4495'>4495</a>
<a id='n4496' href='#n4496'>4496</a>
<a id='n4497' href='#n4497'>4497</a>
<a id='n4498' href='#n4498'>4498</a>
<a id='n4499' href='#n4499'>4499</a>
<a id='n4500' href='#n4500'>4500</a>
<a id='n4501' href='#n4501'>4501</a>
<a id='n4502' href='#n4502'>4502</a>
<a id='n4503' href='#n4503'>4503</a>
<a id='n4504' href='#n4504'>4504</a>
<a id='n4505' href='#n4505'>4505</a>
<a id='n4506' href='#n4506'>4506</a>
<a id='n4507' href='#n4507'>4507</a>
<a id='n4508' href='#n4508'>4508</a>
<a id='n4509' href='#n4509'>4509</a>
<a id='n4510' href='#n4510'>4510</a>
<a id='n4511' href='#n4511'>4511</a>
<a id='n4512' href='#n4512'>4512</a>
<a id='n4513' href='#n4513'>4513</a>
<a id='n4514' href='#n4514'>4514</a>
<a id='n4515' href='#n4515'>4515</a>
<a id='n4516' href='#n4516'>4516</a>
<a id='n4517' href='#n4517'>4517</a>
<a id='n4518' href='#n4518'>4518</a>
<a id='n4519' href='#n4519'>4519</a>
<a id='n4520' href='#n4520'>4520</a>
<a id='n4521' href='#n4521'>4521</a>
<a id='n4522' href='#n4522'>4522</a>
<a id='n4523' href='#n4523'>4523</a>
<a id='n4524' href='#n4524'>4524</a>
<a id='n4525' href='#n4525'>4525</a>
<a id='n4526' href='#n4526'>4526</a>
<a id='n4527' href='#n4527'>4527</a>
<a id='n4528' href='#n4528'>4528</a>
<a id='n4529' href='#n4529'>4529</a>
<a id='n4530' href='#n4530'>4530</a>
<a id='n4531' href='#n4531'>4531</a>
<a id='n4532' href='#n4532'>4532</a>
<a id='n4533' href='#n4533'>4533</a>
<a id='n4534' href='#n4534'>4534</a>
<a id='n4535' href='#n4535'>4535</a>
<a id='n4536' href='#n4536'>4536</a>
<a id='n4537' href='#n4537'>4537</a>
<a id='n4538' href='#n4538'>4538</a>
<a id='n4539' href='#n4539'>4539</a>
<a id='n4540' href='#n4540'>4540</a>
<a id='n4541' href='#n4541'>4541</a>
<a id='n4542' href='#n4542'>4542</a>
<a id='n4543' href='#n4543'>4543</a>
<a id='n4544' href='#n4544'>4544</a>
<a id='n4545' href='#n4545'>4545</a>
<a id='n4546' href='#n4546'>4546</a>
<a id='n4547' href='#n4547'>4547</a>
<a id='n4548' href='#n4548'>4548</a>
<a id='n4549' href='#n4549'>4549</a>
<a id='n4550' href='#n4550'>4550</a>
<a id='n4551' href='#n4551'>4551</a>
<a id='n4552' href='#n4552'>4552</a>
<a id='n4553' href='#n4553'>4553</a>
<a id='n4554' href='#n4554'>4554</a>
<a id='n4555' href='#n4555'>4555</a>
<a id='n4556' href='#n4556'>4556</a>
<a id='n4557' href='#n4557'>4557</a>
<a id='n4558' href='#n4558'>4558</a>
<a id='n4559' href='#n4559'>4559</a>
<a id='n4560' href='#n4560'>4560</a>
<a id='n4561' href='#n4561'>4561</a>
<a id='n4562' href='#n4562'>4562</a>
<a id='n4563' href='#n4563'>4563</a>
<a id='n4564' href='#n4564'>4564</a>
<a id='n4565' href='#n4565'>4565</a>
<a id='n4566' href='#n4566'>4566</a>
<a id='n4567' href='#n4567'>4567</a>
<a id='n4568' href='#n4568'>4568</a>
<a id='n4569' href='#n4569'>4569</a>
<a id='n4570' href='#n4570'>4570</a>
<a id='n4571' href='#n4571'>4571</a>
<a id='n4572' href='#n4572'>4572</a>
<a id='n4573' href='#n4573'>4573</a>
<a id='n4574' href='#n4574'>4574</a>
<a id='n4575' href='#n4575'>4575</a>
<a id='n4576' href='#n4576'>4576</a>
<a id='n4577' href='#n4577'>4577</a>
<a id='n4578' href='#n4578'>4578</a>
<a id='n4579' href='#n4579'>4579</a>
<a id='n4580' href='#n4580'>4580</a>
<a id='n4581' href='#n4581'>4581</a>
<a id='n4582' href='#n4582'>4582</a>
<a id='n4583' href='#n4583'>4583</a>
<a id='n4584' href='#n4584'>4584</a>
<a id='n4585' href='#n4585'>4585</a>
<a id='n4586' href='#n4586'>4586</a>
<a id='n4587' href='#n4587'>4587</a>
<a id='n4588' href='#n4588'>4588</a>
<a id='n4589' href='#n4589'>4589</a>
<a id='n4590' href='#n4590'>4590</a>
<a id='n4591' href='#n4591'>4591</a>
<a id='n4592' href='#n4592'>4592</a>
<a id='n4593' href='#n4593'>4593</a>
<a id='n4594' href='#n4594'>4594</a>
<a id='n4595' href='#n4595'>4595</a>
<a id='n4596' href='#n4596'>4596</a>
<a id='n4597' href='#n4597'>4597</a>
<a id='n4598' href='#n4598'>4598</a>
<a id='n4599' href='#n4599'>4599</a>
<a id='n4600' href='#n4600'>4600</a>
<a id='n4601' href='#n4601'>4601</a>
<a id='n4602' href='#n4602'>4602</a>
<a id='n4603' href='#n4603'>4603</a>
<a id='n4604' href='#n4604'>4604</a>
<a id='n4605' href='#n4605'>4605</a>
<a id='n4606' href='#n4606'>4606</a>
<a id='n4607' href='#n4607'>4607</a>
<a id='n4608' href='#n4608'>4608</a>
<a id='n4609' href='#n4609'>4609</a>
<a id='n4610' href='#n4610'>4610</a>
<a id='n4611' href='#n4611'>4611</a>
<a id='n4612' href='#n4612'>4612</a>
<a id='n4613' href='#n4613'>4613</a>
<a id='n4614' href='#n4614'>4614</a>
<a id='n4615' href='#n4615'>4615</a>
<a id='n4616' href='#n4616'>4616</a>
<a id='n4617' href='#n4617'>4617</a>
<a id='n4618' href='#n4618'>4618</a>
<a id='n4619' href='#n4619'>4619</a>
<a id='n4620' href='#n4620'>4620</a>
<a id='n4621' href='#n4621'>4621</a>
<a id='n4622' href='#n4622'>4622</a>
<a id='n4623' href='#n4623'>4623</a>
<a id='n4624' href='#n4624'>4624</a>
<a id='n4625' href='#n4625'>4625</a>
<a id='n4626' href='#n4626'>4626</a>
<a id='n4627' href='#n4627'>4627</a>
<a id='n4628' href='#n4628'>4628</a>
<a id='n4629' href='#n4629'>4629</a>
<a id='n4630' href='#n4630'>4630</a>
<a id='n4631' href='#n4631'>4631</a>
<a id='n4632' href='#n4632'>4632</a>
<a id='n4633' href='#n4633'>4633</a>
<a id='n4634' href='#n4634'>4634</a>
<a id='n4635' href='#n4635'>4635</a>
<a id='n4636' href='#n4636'>4636</a>
<a id='n4637' href='#n4637'>4637</a>
<a id='n4638' href='#n4638'>4638</a>
<a id='n4639' href='#n4639'>4639</a>
<a id='n4640' href='#n4640'>4640</a>
<a id='n4641' href='#n4641'>4641</a>
<a id='n4642' href='#n4642'>4642</a>
<a id='n4643' href='#n4643'>4643</a>
<a id='n4644' href='#n4644'>4644</a>
<a id='n4645' href='#n4645'>4645</a>
<a id='n4646' href='#n4646'>4646</a>
<a id='n4647' href='#n4647'>4647</a>
<a id='n4648' href='#n4648'>4648</a>
<a id='n4649' href='#n4649'>4649</a>
<a id='n4650' href='#n4650'>4650</a>
<a id='n4651' href='#n4651'>4651</a>
<a id='n4652' href='#n4652'>4652</a>
<a id='n4653' href='#n4653'>4653</a>
<a id='n4654' href='#n4654'>4654</a>
<a id='n4655' href='#n4655'>4655</a>
<a id='n4656' href='#n4656'>4656</a>
<a id='n4657' href='#n4657'>4657</a>
<a id='n4658' href='#n4658'>4658</a>
<a id='n4659' href='#n4659'>4659</a>
<a id='n4660' href='#n4660'>4660</a>
<a id='n4661' href='#n4661'>4661</a>
<a id='n4662' href='#n4662'>4662</a>
<a id='n4663' href='#n4663'>4663</a>
<a id='n4664' href='#n4664'>4664</a>
<a id='n4665' href='#n4665'>4665</a>
<a id='n4666' href='#n4666'>4666</a>
<a id='n4667' href='#n4667'>4667</a>
<a id='n4668' href='#n4668'>4668</a>
<a id='n4669' href='#n4669'>4669</a>
<a id='n4670' href='#n4670'>4670</a>
<a id='n4671' href='#n4671'>4671</a>
<a id='n4672' href='#n4672'>4672</a>
<a id='n4673' href='#n4673'>4673</a>
<a id='n4674' href='#n4674'>4674</a>
<a id='n4675' href='#n4675'>4675</a>
<a id='n4676' href='#n4676'>4676</a>
<a id='n4677' href='#n4677'>4677</a>
<a id='n4678' href='#n4678'>4678</a>
<a id='n4679' href='#n4679'>4679</a>
<a id='n4680' href='#n4680'>4680</a>
<a id='n4681' href='#n4681'>4681</a>
<a id='n4682' href='#n4682'>4682</a>
<a id='n4683' href='#n4683'>4683</a>
<a id='n4684' href='#n4684'>4684</a>
<a id='n4685' href='#n4685'>4685</a>
<a id='n4686' href='#n4686'>4686</a>
<a id='n4687' href='#n4687'>4687</a>
<a id='n4688' href='#n4688'>4688</a>
<a id='n4689' href='#n4689'>4689</a>
<a id='n4690' href='#n4690'>4690</a>
<a id='n4691' href='#n4691'>4691</a>
<a id='n4692' href='#n4692'>4692</a>
<a id='n4693' href='#n4693'>4693</a>
<a id='n4694' href='#n4694'>4694</a>
<a id='n4695' href='#n4695'>4695</a>
<a id='n4696' href='#n4696'>4696</a>
<a id='n4697' href='#n4697'>4697</a>
<a id='n4698' href='#n4698'>4698</a>
<a id='n4699' href='#n4699'>4699</a>
<a id='n4700' href='#n4700'>4700</a>
<a id='n4701' href='#n4701'>4701</a>
<a id='n4702' href='#n4702'>4702</a>
<a id='n4703' href='#n4703'>4703</a>
<a id='n4704' href='#n4704'>4704</a>
<a id='n4705' href='#n4705'>4705</a>
<a id='n4706' href='#n4706'>4706</a>
<a id='n4707' href='#n4707'>4707</a>
<a id='n4708' href='#n4708'>4708</a>
<a id='n4709' href='#n4709'>4709</a>
<a id='n4710' href='#n4710'>4710</a>
<a id='n4711' href='#n4711'>4711</a>
<a id='n4712' href='#n4712'>4712</a>
<a id='n4713' href='#n4713'>4713</a>
<a id='n4714' href='#n4714'>4714</a>
<a id='n4715' href='#n4715'>4715</a>
<a id='n4716' href='#n4716'>4716</a>
<a id='n4717' href='#n4717'>4717</a>
<a id='n4718' href='#n4718'>4718</a>
<a id='n4719' href='#n4719'>4719</a>
<a id='n4720' href='#n4720'>4720</a>
<a id='n4721' href='#n4721'>4721</a>
<a id='n4722' href='#n4722'>4722</a>
<a id='n4723' href='#n4723'>4723</a>
<a id='n4724' href='#n4724'>4724</a>
<a id='n4725' href='#n4725'>4725</a>
<a id='n4726' href='#n4726'>4726</a>
<a id='n4727' href='#n4727'>4727</a>
<a id='n4728' href='#n4728'>4728</a>
<a id='n4729' href='#n4729'>4729</a>
<a id='n4730' href='#n4730'>4730</a>
<a id='n4731' href='#n4731'>4731</a>
<a id='n4732' href='#n4732'>4732</a>
<a id='n4733' href='#n4733'>4733</a>
<a id='n4734' href='#n4734'>4734</a>
<a id='n4735' href='#n4735'>4735</a>
<a id='n4736' href='#n4736'>4736</a>
<a id='n4737' href='#n4737'>4737</a>
<a id='n4738' href='#n4738'>4738</a>
<a id='n4739' href='#n4739'>4739</a>
<a id='n4740' href='#n4740'>4740</a>
<a id='n4741' href='#n4741'>4741</a>
<a id='n4742' href='#n4742'>4742</a>
<a id='n4743' href='#n4743'>4743</a>
<a id='n4744' href='#n4744'>4744</a>
<a id='n4745' href='#n4745'>4745</a>
<a id='n4746' href='#n4746'>4746</a>
<a id='n4747' href='#n4747'>4747</a>
<a id='n4748' href='#n4748'>4748</a>
<a id='n4749' href='#n4749'>4749</a>
<a id='n4750' href='#n4750'>4750</a>
<a id='n4751' href='#n4751'>4751</a>
<a id='n4752' href='#n4752'>4752</a>
<a id='n4753' href='#n4753'>4753</a>
<a id='n4754' href='#n4754'>4754</a>
<a id='n4755' href='#n4755'>4755</a>
<a id='n4756' href='#n4756'>4756</a>
<a id='n4757' href='#n4757'>4757</a>
<a id='n4758' href='#n4758'>4758</a>
<a id='n4759' href='#n4759'>4759</a>
<a id='n4760' href='#n4760'>4760</a>
<a id='n4761' href='#n4761'>4761</a>
<a id='n4762' href='#n4762'>4762</a>
<a id='n4763' href='#n4763'>4763</a>
<a id='n4764' href='#n4764'>4764</a>
<a id='n4765' href='#n4765'>4765</a>
<a id='n4766' href='#n4766'>4766</a>
<a id='n4767' href='#n4767'>4767</a>
<a id='n4768' href='#n4768'>4768</a>
<a id='n4769' href='#n4769'>4769</a>
<a id='n4770' href='#n4770'>4770</a>
<a id='n4771' href='#n4771'>4771</a>
<a id='n4772' href='#n4772'>4772</a>
<a id='n4773' href='#n4773'>4773</a>
<a id='n4774' href='#n4774'>4774</a>
<a id='n4775' href='#n4775'>4775</a>
<a id='n4776' href='#n4776'>4776</a>
<a id='n4777' href='#n4777'>4777</a>
<a id='n4778' href='#n4778'>4778</a>
<a id='n4779' href='#n4779'>4779</a>
<a id='n4780' href='#n4780'>4780</a>
<a id='n4781' href='#n4781'>4781</a>
<a id='n4782' href='#n4782'>4782</a>
<a id='n4783' href='#n4783'>4783</a>
<a id='n4784' href='#n4784'>4784</a>
<a id='n4785' href='#n4785'>4785</a>
<a id='n4786' href='#n4786'>4786</a>
<a id='n4787' href='#n4787'>4787</a>
<a id='n4788' href='#n4788'>4788</a>
<a id='n4789' href='#n4789'>4789</a>
<a id='n4790' href='#n4790'>4790</a>
<a id='n4791' href='#n4791'>4791</a>
<a id='n4792' href='#n4792'>4792</a>
<a id='n4793' href='#n4793'>4793</a>
<a id='n4794' href='#n4794'>4794</a>
<a id='n4795' href='#n4795'>4795</a>
<a id='n4796' href='#n4796'>4796</a>
<a id='n4797' href='#n4797'>4797</a>
<a id='n4798' href='#n4798'>4798</a>
<a id='n4799' href='#n4799'>4799</a>
<a id='n4800' href='#n4800'>4800</a>
<a id='n4801' href='#n4801'>4801</a>
<a id='n4802' href='#n4802'>4802</a>
<a id='n4803' href='#n4803'>4803</a>
<a id='n4804' href='#n4804'>4804</a>
<a id='n4805' href='#n4805'>4805</a>
<a id='n4806' href='#n4806'>4806</a>
<a id='n4807' href='#n4807'>4807</a>
<a id='n4808' href='#n4808'>4808</a>
<a id='n4809' href='#n4809'>4809</a>
<a id='n4810' href='#n4810'>4810</a>
<a id='n4811' href='#n4811'>4811</a>
<a id='n4812' href='#n4812'>4812</a>
<a id='n4813' href='#n4813'>4813</a>
<a id='n4814' href='#n4814'>4814</a>
<a id='n4815' href='#n4815'>4815</a>
<a id='n4816' href='#n4816'>4816</a>
<a id='n4817' href='#n4817'>4817</a>
<a id='n4818' href='#n4818'>4818</a>
<a id='n4819' href='#n4819'>4819</a>
<a id='n4820' href='#n4820'>4820</a>
<a id='n4821' href='#n4821'>4821</a>
<a id='n4822' href='#n4822'>4822</a>
<a id='n4823' href='#n4823'>4823</a>
<a id='n4824' href='#n4824'>4824</a>
<a id='n4825' href='#n4825'>4825</a>
<a id='n4826' href='#n4826'>4826</a>
<a id='n4827' href='#n4827'>4827</a>
<a id='n4828' href='#n4828'>4828</a>
<a id='n4829' href='#n4829'>4829</a>
<a id='n4830' href='#n4830'>4830</a>
<a id='n4831' href='#n4831'>4831</a>
<a id='n4832' href='#n4832'>4832</a>
<a id='n4833' href='#n4833'>4833</a>
<a id='n4834' href='#n4834'>4834</a>
<a id='n4835' href='#n4835'>4835</a>
<a id='n4836' href='#n4836'>4836</a>
<a id='n4837' href='#n4837'>4837</a>
<a id='n4838' href='#n4838'>4838</a>
<a id='n4839' href='#n4839'>4839</a>
<a id='n4840' href='#n4840'>4840</a>
<a id='n4841' href='#n4841'>4841</a>
<a id='n4842' href='#n4842'>4842</a>
<a id='n4843' href='#n4843'>4843</a>
<a id='n4844' href='#n4844'>4844</a>
<a id='n4845' href='#n4845'>4845</a>
<a id='n4846' href='#n4846'>4846</a>
<a id='n4847' href='#n4847'>4847</a>
<a id='n4848' href='#n4848'>4848</a>
<a id='n4849' href='#n4849'>4849</a>
<a id='n4850' href='#n4850'>4850</a>
<a id='n4851' href='#n4851'>4851</a>
<a id='n4852' href='#n4852'>4852</a>
<a id='n4853' href='#n4853'>4853</a>
<a id='n4854' href='#n4854'>4854</a>
<a id='n4855' href='#n4855'>4855</a>
<a id='n4856' href='#n4856'>4856</a>
<a id='n4857' href='#n4857'>4857</a>
<a id='n4858' href='#n4858'>4858</a>
<a id='n4859' href='#n4859'>4859</a>
<a id='n4860' href='#n4860'>4860</a>
<a id='n4861' href='#n4861'>4861</a>
<a id='n4862' href='#n4862'>4862</a>
<a id='n4863' href='#n4863'>4863</a>
<a id='n4864' href='#n4864'>4864</a>
<a id='n4865' href='#n4865'>4865</a>
<a id='n4866' href='#n4866'>4866</a>
<a id='n4867' href='#n4867'>4867</a>
<a id='n4868' href='#n4868'>4868</a>
<a id='n4869' href='#n4869'>4869</a>
<a id='n4870' href='#n4870'>4870</a>
<a id='n4871' href='#n4871'>4871</a>
<a id='n4872' href='#n4872'>4872</a>
<a id='n4873' href='#n4873'>4873</a>
<a id='n4874' href='#n4874'>4874</a>
<a id='n4875' href='#n4875'>4875</a>
<a id='n4876' href='#n4876'>4876</a>
<a id='n4877' href='#n4877'>4877</a>
<a id='n4878' href='#n4878'>4878</a>
<a id='n4879' href='#n4879'>4879</a>
<a id='n4880' href='#n4880'>4880</a>
</pre></td>
<td class='lines'><pre><code><span class="hl kwa">package</span> printer<span class="hl opt">::</span>printerdrake<span class="hl opt">;</span>
<span class="hl slc"># $Id$</span>

<span class="hl kwa">use</span> strict<span class="hl opt">;</span>

<span class="hl kwa">use</span> common<span class="hl opt">;</span>
<span class="hl kwa">use</span> modules<span class="hl opt">;</span>
<span class="hl kwa">use</span> network<span class="hl opt">::</span>network<span class="hl opt">;</span>
<span class="hl kwa">use</span> <span class="hl kwc">log</span><span class="hl opt">;</span>
<span class="hl kwa">use</span> interactive<span class="hl opt">;</span>
<span class="hl kwa">use</span> printer<span class="hl opt">::</span>main<span class="hl opt">;</span>
<span class="hl kwa">use</span> printer<span class="hl opt">::</span>services<span class="hl opt">;</span>
<span class="hl kwa">use</span> printer<span class="hl opt">::</span>detect<span class="hl opt">;</span>
<span class="hl kwa">use</span> printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">;</span>
<span class="hl kwa">use</span> printer<span class="hl opt">::</span>data<span class="hl opt">;</span>

<span class="hl kwc">my</span> <span class="hl kwb">$shortdistroname</span> <span class="hl opt">=</span> <span class="hl str">&quot;Mandrakelinux&quot;</span><span class="hl opt">;</span>

<span class="hl kwc">my</span> <span class="hl kwb">$hp1000fwtext</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;The HP LaserJet 1000 needs its firmware to be uploaded after being turned on. Download the Windows driver package from the HP web site (the firmware on the printer&apos;s CD does not work) and extract the firmware file from it by decompressing the self-extracting &apos;.exe&apos; file with the &apos;unzip&apos; utility and searching for the &apos;sihp1000.img&apos; file. Copy this file into the &apos;/etc/printer&apos; directory. There it will be found by the automatic uploader script and uploaded whenever the printer is connected and turned on.</span>
<span class="hl str">&quot;</span><span class="hl opt">);</span>

<span class="hl num">1</span><span class="hl opt">;</span>

<span class="hl kwa">sub</span> config_cups <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwc">local</span> <span class="hl opt">$::</span>isWizard <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl slc"># Check whether the network functionality is configured and</span>
    <span class="hl slc"># running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">)) {</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl opt">};</span>

    <span class="hl slc">#$in-&gt;set_help(&apos;configureRemoteCUPSServer&apos;) if $::isInstall;</span>
    <span class="hl slc">#- hack to handle cups remote server printing,</span>
    <span class="hl slc">#- first read /etc/cups/cupsd.conf for variable BrowsePoll address:port</span>
    <span class="hl slc"># Return value: 0 when nothing was changed (&quot;Apply&quot; never pressed), 1</span>
    <span class="hl slc"># when &quot;Apply&quot; was at least pressed once.</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$retvalue</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl slc"># Read CUPS config file</span>
    <span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>cupsd_conf<span class="hl opt">}} =</span>
	printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_cupsd_conf<span class="hl opt">();</span>
    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_cups_config<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    <span class="hl slc"># Read client.conf file</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups, $remote_cups_server</span><span class="hl opt">) =</span>
	printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_client_conf<span class="hl opt">();</span>
    <span class="hl slc"># Read state of japanese text printing mode</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$jap_textmode</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>get_jap_textmode<span class="hl opt">();</span>
    <span class="hl slc"># Read state for auto-correction of cupsd.conf</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>autocorrection<span class="hl opt">} =</span>
	printer<span class="hl opt">::</span>main<span class="hl opt">::</span>get_cups_autoconf<span class="hl opt">();</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$oldautocorr</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>autocorrection<span class="hl opt">};</span>
    <span class="hl slc"># Human-readable strings for hosts onto which the local printers</span>
    <span class="hl slc"># are shared</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$maindone</span><span class="hl opt">;</span>
    <span class="hl kwa">while</span> <span class="hl opt">(!</span><span class="hl kwb">$maindone</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$sharehosts</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>makesharehostlist<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$browsepoll</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>makebrowsepolllist<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$buttonclicked</span><span class="hl opt">;</span>
	<span class="hl slc">#- Show dialog</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
	     <span class="hl opt">{</span> 
		 title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;CUPS printer configuration&quot;</span><span class="hl opt">),</span>
		 messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Here you can choose whether the printers connected to this machine should be accessible by remote machines and by which remote machines.&quot;</span><span class="hl opt">) .</span>
		     N<span class="hl opt">(</span><span class="hl str">&quot;You can also decide here whether printers on remote machines should be automatically made available on this machine.&quot;</span><span class="hl opt">),</span>
	     <span class="hl opt">},</span>
	     <span class="hl opt">[</span>
	      <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;The printers on this machine are available to other computers&quot;</span><span class="hl opt">),</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
		val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>localprintersshared<span class="hl opt">},</span>
		disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$daemonless_cups</span><span class="hl opt">;</span>
		<span class="hl opt">} },</span>
	      <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Automatically find available printers on remote machines&quot;</span><span class="hl opt">),</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
		val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>remotebroadcastsaccepted<span class="hl opt">},</span>
		disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$daemonless_cups</span><span class="hl opt">;</span>
		<span class="hl opt">} },</span>
	      <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer sharing on hosts/networks: &quot;</span><span class="hl opt">) .</span>
		    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>customsharingsetup<span class="hl opt">}</span> ?
		     N<span class="hl opt">(</span><span class="hl str">&quot;Custom configuration&quot;</span><span class="hl opt">) :</span>
		     <span class="hl opt">(</span><span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &gt;=</span> <span class="hl num">0</span> ?
		      <span class="hl opt">(</span><span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &gt;</span> <span class="hl num">1</span> ?
		       <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&quot;, &quot;</span><span class="hl opt">, &#64;{</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}}[</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">1</span><span class="hl opt">]) .</span> <span class="hl str">&quot; ...&quot;</span> <span class="hl opt">:</span>
		       <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&quot;, &quot;</span><span class="hl opt">, &#64;{</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}})) :</span>
		      N<span class="hl opt">(</span><span class="hl str">&quot;No remote machines&quot;</span><span class="hl opt">))),</span> 
		type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
		clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;sharehosts&quot;</span><span class="hl opt">;</span>
		    <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl opt">},</span>
		disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$daemonless_cups</span> <span class="hl opt">||</span>
		    <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>localprintersshared<span class="hl opt">} &amp;&amp;</span>
		     <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>remotebroadcastsaccepted<span class="hl opt">});</span>
		<span class="hl opt">} },</span>
	      <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Additional CUPS servers: &quot;</span><span class="hl opt">) .</span>
		     <span class="hl opt">(</span><span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &gt;=</span> <span class="hl num">0</span> ?
		      <span class="hl opt">(</span><span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &gt;</span> <span class="hl num">1</span> ?
		       <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&quot;, &quot;</span><span class="hl opt">, &#64;{</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}}[</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">1</span><span class="hl opt">]) .</span> <span class="hl str">&quot; ...&quot;</span> <span class="hl opt">:</span>
		       <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&quot;, &quot;</span><span class="hl opt">, &#64;{</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}})) :</span>
		      N<span class="hl opt">(</span><span class="hl str">&quot;None&quot;</span><span class="hl opt">)),</span> 
		type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
		help <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;To get access to printers on remote CUPS servers in your local network you only need to turn on the</span> <span class="hl esc">\&quot;</span><span class="hl str">Automatically find available printers on remote machines</span><span class="hl esc">\&quot;</span> <span class="hl str">option; the CUPS servers inform your machine automatically about their printers. All printers currently known to your machine are listed in the</span> <span class="hl esc">\&quot;</span><span class="hl str">Remote printers</span><span class="hl esc">\&quot;</span> <span class="hl str">section in the main window of Printerdrake. If your CUPS server(s) is/are not in your local network, you have to enter the IP address(es) and optionally the port number(s) here to get the printer information from the server(s).&quot;</span><span class="hl opt">),</span>
		clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;browsepoll&quot;</span><span class="hl opt">;</span>
		    <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl opt">},</span>
		disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$daemonless_cups</span><span class="hl opt">;</span>
		<span class="hl opt">} },</span>
	      <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Japanese text printing mode&quot;</span><span class="hl opt">),</span>
		help <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Turning on this allows to print plain text files in Japanese language. Only use this function if you really want to print text in Japanese, if it is activated you cannot print accentuated characters in latin fonts any more and you will not be able to adjust the margins, the character size, etc. This setting only affects printers defined on this machine. If you want to print Japanese text on a printer set up on a remote machine, you have to activate this function on that remote machine.&quot;</span><span class="hl opt">),</span>
		type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
		val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$jap_textmode,</span> 
		disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$daemonless_cups</span><span class="hl opt">;</span>
		<span class="hl opt">} },</span>
	      if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">},</span>
		  <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Automatic correction of CUPS configuration&quot;</span><span class="hl opt">),</span>
		    type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
		    help <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;When this option is turned on, on every startup of CUPS it is automatically made sure that</span>
<span class="hl str"></span>
<span class="hl str">- if LPD/LPRng is installed, /etc/printcap will not be overwritten by CUPS</span>
<span class="hl str"></span>
<span class="hl str">- if /etc/cups/cupsd.conf is missing, it will be created</span>
<span class="hl str"></span>
<span class="hl str">- when printer information is broadcasted, it does not contain</span> <span class="hl esc">\&quot;</span><span class="hl str">localhost</span><span class="hl esc">\&quot;</span> <span class="hl str">as the server name.</span>
<span class="hl str"></span>
<span class="hl str">If some of these measures lead to problems for you, turn this option off, but then you have to take care of these points.&quot;</span><span class="hl opt">),</span>
		    val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>autocorrection<span class="hl opt">},</span>
                    disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			<span class="hl kwb">$daemonless_cups</span><span class="hl opt">;</span>
		    <span class="hl opt">} }),</span>
	      <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote CUPS server and no local CUPS daemon&quot;</span><span class="hl opt">) .</span>
		    <span class="hl str">&quot;: &quot;</span> <span class="hl opt">.</span>
		    <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups</span> ? 
		     N<span class="hl opt">(</span><span class="hl str">&quot;On&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot;; &quot;</span> <span class="hl opt">.</span> N<span class="hl opt">(</span><span class="hl str">&quot;Server&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot;: &quot;</span> <span class="hl opt">.</span> 
		     <span class="hl kwb">$remote_cups_server</span> <span class="hl opt">:</span>
		     N<span class="hl opt">(</span><span class="hl str">&quot;Off&quot;</span><span class="hl opt">)),</span>
		help <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;In this mode the local CUPS daemon will be stopped and all printing requests go directly to the server specified below. Note that it is not possible to define local print queues then and if the specified server is down it cannot be printed at all from this machine.&quot;</span><span class="hl opt">),</span>
		type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
		clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;daemonlesscups&quot;</span><span class="hl opt">;</span>
		    <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl opt">} },</span>
	      <span class="hl opt">]</span>
	     <span class="hl opt">)</span>
	    <span class="hl opt">) {</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;sharehosts&quot;</span><span class="hl opt">) {</span>
		<span class="hl slc"># Show dialog to add hosts to share printers to</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$subdone</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$choice</span><span class="hl opt">;</span>
		<span class="hl kwa">while</span> <span class="hl opt">(!</span><span class="hl kwb">$subdone</span><span class="hl opt">) {</span>
		    <span class="hl slc"># Entry should be edited when double-clicked</span>
		    <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;edit&quot;</span><span class="hl opt">;</span>
		    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
			 <span class="hl opt">{</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Sharing of local printers&quot;</span><span class="hl opt">),</span>
			   messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;These are the machines and networks on which the locally connected printer(s) should be available:&quot;</span><span class="hl opt">),</span>
			   ok <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
			   cancel <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
		         <span class="hl opt">},</span>
			 <span class="hl slc"># List the hosts</span>
			 <span class="hl opt">[ {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$choice,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span>
			     <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span> separator <span class="hl opt">=&gt;</span> <span class="hl str">&quot;####&quot;</span><span class="hl opt">,</span>
			     tree_expanded <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
			     quit_if_double_click <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
			     allow_empty_list <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
			     list <span class="hl opt">=&gt;</span> <span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Add host/network&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;add&quot;</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Edit selected host/network&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;edit&quot;</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">},</span>
			     disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwa">return</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &lt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
			     <span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remove selected host/network&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;remove&quot;</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">},</span>
			     disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwa">return</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &lt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
			     <span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Done&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
				 <span class="hl kwb">$subdone</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">} },</span>
			   <span class="hl opt">]</span>
			 <span class="hl opt">);</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;add&quot;</span> <span class="hl opt">||</span>
			<span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;edit&quot;</span><span class="hl opt">) {</span>
			<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$hostchoice, $ip</span><span class="hl opt">);</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;add&quot;</span><span class="hl opt">) {</span>
			    <span class="hl slc"># Use first entry as default for a new entry</span>
			    <span class="hl kwb">$hostchoice</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Local network(s)&quot;</span><span class="hl opt">);</span>
			<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">} =~</span> <span class="hl kwd">/^\&#64;/</span><span class="hl opt">) {</span>
				<span class="hl slc"># Entry to edit is not an IP address</span>
				<span class="hl kwb">$hostchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$choice</span><span class="hl opt">;</span>
			    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
				<span class="hl slc"># Entry is an IP address</span>
				<span class="hl kwb">$hostchoice</span> <span class="hl opt">=</span> 
				    N<span class="hl opt">(</span><span class="hl str">&quot;IP address of host/network:&quot;</span><span class="hl opt">);</span>
				<span class="hl kwb">$ip</span> <span class="hl opt">=</span> <span class="hl kwb">$sharehosts</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">};</span>
			    <span class="hl opt">}</span>
			<span class="hl opt">}</span>
			<span class="hl kwc">my</span> <span class="hl kwb">&#64;menu</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Local network(s)&quot;</span><span class="hl opt">);</span>
			<span class="hl kwc">my</span> <span class="hl kwb">&#64;interfaces</span> <span class="hl opt">=</span> 
			    printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getNetworkInterfaces<span class="hl opt">();</span>
		        <span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$interface</span> <span class="hl opt">(</span><span class="hl kwb">&#64;interfaces</span><span class="hl opt">) {</span>
			    <span class="hl kwc">push</span> <span class="hl kwb">&#64;menu,</span> N<span class="hl opt">(</span><span class="hl str">&quot;Interface</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl str">&quot;,</span> <span class="hl ipl">$interface</span><span class="hl str">);</span>
<span class="hl str">			}</span>
<span class="hl str">			push</span> <span class="hl ipl">&#64;menu,</span> <span class="hl str">N(&quot;</span>IP address of host<span class="hl opt">/</span>network<span class="hl opt">:</span><span class="hl str">&quot;);</span>
<span class="hl str">			# Show the dialog</span>
<span class="hl str">			my</span> <span class="hl ipl">$address</span><span class="hl str">;</span>
<span class="hl str">			my</span> <span class="hl ipl">$oldaddress</span> <span class="hl str">= </span>
<span class="hl str">			    (</span><span class="hl ipl">$buttonclicked</span> <span class="hl str">eq &quot;</span>edit<span class="hl str">&quot; ?</span>
<span class="hl str"></span>			     <span class="hl ipl">$sharehosts</span><span class="hl str">-&gt;{invhash}{</span><span class="hl ipl">$choice</span><span class="hl str">} : &quot;</span><span class="hl str">&quot;);</span>
<span class="hl str">			if (</span><span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_(</span>
<span class="hl str">			     { title =&gt; N(&quot;</span>Sharing of <span class="hl kwc">local</span> printers<span class="hl str">&quot;),</span>
<span class="hl str">			       messages =&gt; N(&quot;</span>Choose the network <span class="hl kwc">or</span> host on which the <span class="hl kwc">local</span> printers should be made available<span class="hl opt">:</span><span class="hl str">&quot;),</span>
<span class="hl str">			       callbacks =&gt; {</span>
<span class="hl str">				   complete =&gt; sub {</span>
<span class="hl str">				       if (</span><span class="hl ipl">$hostchoice</span> <span class="hl str">eq </span>
<span class="hl str">					    N(&quot;</span>IP address of host<span class="hl opt">/</span>network<span class="hl opt">:</span><span class="hl str">&quot;) &amp;&amp;</span>
<span class="hl str"></span>					   <span class="hl ipl">$ip</span> <span class="hl str">=~ /^\s*</span><span class="hl ipl">$/</span><span class="hl str">) {</span>
<span class="hl str">					   </span>
<span class="hl str"></span>					   <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Error<span class="hl str">&quot;), N(&quot;</span>Host<span class="hl opt">/</span>network IP address missing<span class="hl opt">.</span><span class="hl str">&quot;));</span>
<span class="hl str">					   return 1, 1;</span>
<span class="hl str">				       }</span>
<span class="hl str">				       if (</span><span class="hl ipl">$hostchoice</span> <span class="hl str">eq </span>
<span class="hl str">					    N(&quot;</span>IP address of host<span class="hl opt">/</span>network<span class="hl opt">:</span><span class="hl str">&quot;) &amp;&amp;</span>
<span class="hl str">					   !printer::main::is_network_ip(</span><span class="hl ipl">$ip</span><span class="hl str">)) {</span>
<span class="hl str">					   </span>
<span class="hl str"></span>					   <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Error<span class="hl str">&quot;), </span>
<span class="hl str">N(&quot;</span>The entered host<span class="hl opt">/</span>network IP <span class="hl kwa">is</span> <span class="hl kwc">not</span> correct<span class="hl opt">.</span><span class="hl esc">\n</span><span class="hl str">&quot;) .</span>
<span class="hl str">N(&quot;</span>Examples <span class="hl kwa">for</span> correct IPs<span class="hl opt">:</span><span class="hl esc">\n</span><span class="hl str">&quot;) .</span>
<span class="hl str">  &quot;</span><span class="hl num">192.168.100.194</span><span class="hl esc">\n</span><span class="hl str">&quot; .</span>
<span class="hl str">  &quot;</span><span class="hl num">10.0.0</span><span class="hl opt">.*</span><span class="hl esc">\n</span><span class="hl str">&quot; .</span>
<span class="hl str">  &quot;</span><span class="hl num">10.1</span><span class="hl opt">.*</span><span class="hl esc">\n</span><span class="hl str">&quot; .</span>
<span class="hl str">  &quot;</span><span class="hl num">192.168.100.0</span><span class="hl opt">/</span><span class="hl num">24</span><span class="hl esc">\n</span><span class="hl str">&quot; .</span>
<span class="hl str">  &quot;</span><span class="hl num">192.168.100.0</span><span class="hl opt">/</span><span class="hl num">255.255.255.0</span><span class="hl esc">\n</span><span class="hl str">&quot;</span>
<span class="hl str">);</span>
<span class="hl str">					   return 1, 1;</span>
<span class="hl str">				       }</span>
<span class="hl str">				       if (</span><span class="hl ipl">$hostchoice</span> <span class="hl str">eq</span> <span class="hl ipl">$menu</span><span class="hl str">[0]) {</span>
<span class="hl str"></span>					   <span class="hl ipl">$address</span> <span class="hl str">= &apos;</span><span class="hl ipl">&#64;LOCAL</span><span class="hl str">&apos;;</span>
<span class="hl str">				       } elsif (</span><span class="hl ipl">$hostchoice</span> <span class="hl str">eq</span> <span class="hl ipl">$menu</span><span class="hl str">[-1]) {</span>
<span class="hl str"></span>					   <span class="hl ipl">$address</span> <span class="hl str">=</span> <span class="hl ipl">$ip</span><span class="hl str">;</span>
<span class="hl str">				       } else {</span>
<span class="hl str">					   (</span><span class="hl ipl">$address</span><span class="hl str">) =</span>
<span class="hl str">					       grep {</span> <span class="hl ipl">$hostchoice</span> <span class="hl str">=~ /</span><span class="hl ipl">$_/</span> <span class="hl str">} </span>
<span class="hl str"></span>					       <span class="hl ipl">&#64;interfaces</span><span class="hl str">;</span>
<span class="hl str"></span>					   <span class="hl ipl">$address</span> <span class="hl str">= &quot;</span>\<span class="hl kwb">&#64;IF</span><span class="hl opt">(</span><span class="hl kwb">$address</span><span class="hl opt">)</span><span class="hl str">&quot;;</span>
<span class="hl str">				       }</span>
<span class="hl str">				       # Check whether item is duplicate</span>
<span class="hl str">				       if (</span><span class="hl ipl">$address</span> <span class="hl str">ne</span> <span class="hl ipl">$oldaddress</span> <span class="hl str">&amp;&amp;</span>
<span class="hl str">					   member(</span><span class="hl ipl">$address,</span>
<span class="hl str">						  &#64;{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}})) {</span>
<span class="hl str"></span>					   <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Error<span class="hl str">&quot;), </span>
<span class="hl str">							 N(&quot;</span>This host<span class="hl opt">/</span>network <span class="hl kwa">is</span> already <span class="hl kwa">in</span> the list<span class="hl opt">,</span> it cannot be added again<span class="hl opt">.</span><span class="hl esc">\n</span><span class="hl str">&quot;));</span>
<span class="hl str">					   if (</span><span class="hl ipl">$hostchoice</span> <span class="hl str">eq </span>
<span class="hl str">					       N(&quot;</span>IP address of host<span class="hl opt">/</span>network<span class="hl opt">:</span><span class="hl str">&quot;)) {</span>
<span class="hl str">					       return 1, 1;</span>
<span class="hl str">					   } else {</span>
<span class="hl str">					       return 1, 0;</span>
<span class="hl str">					   }</span>
<span class="hl str">				       }</span>
<span class="hl str">				       return 0;</span>
<span class="hl str">				   },</span>
<span class="hl str">			       },</span>
<span class="hl str">			   },</span>
<span class="hl str">			     # List the host types</span>
<span class="hl str">			     [ { val =&gt; \</span><span class="hl ipl">$hostchoice,</span> <span class="hl str">format =&gt; \&amp;translate,</span>
<span class="hl str">				 type =&gt; &apos;list&apos;,</span>
<span class="hl str">				 sort =&gt; 0,</span>
<span class="hl str">				 list =&gt; \</span><span class="hl ipl">&#64;menu</span> <span class="hl str">},</span>
<span class="hl str">			       { val =&gt; \</span><span class="hl ipl">$ip,</span> 
<span class="hl str">				 disabled =&gt; sub {</span>
<span class="hl str"></span>				     <span class="hl ipl">$hostchoice</span> <span class="hl str">ne </span>
<span class="hl str">					 N(&quot;</span>IP address of host<span class="hl opt">/</span>network<span class="hl opt">:</span><span class="hl str">&quot;);</span>
<span class="hl str">			         } },</span>
<span class="hl str">			       ],</span>
<span class="hl str">			     )) {</span>
<span class="hl str">			    # OK was clicked, insert new item into the list</span>
<span class="hl str">			    if (</span><span class="hl ipl">$buttonclicked</span> <span class="hl str">eq &quot;</span>add<span class="hl str">&quot;) {</span>
<span class="hl str">				push(&#64;{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}},</span>
<span class="hl str"></span>				     <span class="hl ipl">$address</span><span class="hl str">);</span>
<span class="hl str">			    } else {</span>
<span class="hl str">				&#64;{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}} =</span>
<span class="hl str">				    map { (</span><span class="hl ipl">$_</span> <span class="hl str">eq</span>
<span class="hl str"></span>					  <span class="hl ipl">$sharehosts</span><span class="hl str">-&gt;{invhash}{</span><span class="hl ipl">$choice</span><span class="hl str">} ?</span>
<span class="hl str"></span>					  <span class="hl ipl">$address</span> <span class="hl str">:</span> <span class="hl ipl">$_</span><span class="hl str">) }</span>
<span class="hl str">				        &#64;{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}};</span>
<span class="hl str">			    }</span>
<span class="hl str">			    # Refresh list of hosts</span>
<span class="hl str"></span>			    <span class="hl ipl">$sharehosts</span> <span class="hl str">= </span>
<span class="hl str">			    printer::main::makesharehostlist(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">			    # We have modified the configuration now</span>
<span class="hl str"></span>			    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{customsharingsetup} = 0;</span>
<span class="hl str">			    # Position the list cursor on the new/modified</span>
<span class="hl str">			    # item</span>
<span class="hl str"></span>			    <span class="hl ipl">$choice</span> <span class="hl str">=</span> <span class="hl ipl">$sharehosts</span><span class="hl str">-&gt;{hash}{</span><span class="hl ipl">$address</span><span class="hl str">};</span>
<span class="hl str">			}</span>
<span class="hl str">		    } elsif (</span><span class="hl ipl">$buttonclicked</span> <span class="hl str">eq &quot;</span>remove<span class="hl str">&quot;) {</span>
<span class="hl str">			&#64;{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}} =</span>
<span class="hl str">			    grep {</span> <span class="hl ipl">$_</span> <span class="hl str">ne</span> <span class="hl ipl">$sharehosts</span><span class="hl str">-&gt;{invhash}{</span><span class="hl ipl">$choice</span><span class="hl str">} }</span>
<span class="hl str">			    &#64;{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}};</span>
<span class="hl str">			# Refresh list of hosts</span>
<span class="hl str"></span>			<span class="hl ipl">$sharehosts</span> <span class="hl str">= </span>
<span class="hl str">			    printer::main::makesharehostlist(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">			# We have modified the configuration now</span>
<span class="hl str"></span>			<span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{customsharingsetup} = 0;</span>
<span class="hl str">		    }</span>
<span class="hl str">		}</span>
<span class="hl str">		# If we have no entry in the list, we do not</span>
<span class="hl str">		# share the local printers, mark this</span>
<span class="hl str">		if (</span><span class="hl ipl">$#</span><span class="hl str">{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{clientnetworks}} &lt; 0) {</span>
<span class="hl str"></span>		    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{localprintersshared} = 0;</span>
<span class="hl str"></span>		    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{cupsconfig}{remotebroadcastsaccepted} = 0;</span>
<span class="hl str">		}</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$buttonclicked</span> <span class="hl str">eq &quot;</span>browsepoll<span class="hl str">&quot;) {</span>
<span class="hl str">		# Show dialog to add hosts to &quot;</span>BrowsePoll<span class="hl str">&quot; from</span>
<span class="hl str">		my</span> <span class="hl ipl">$subdone</span> <span class="hl str">= 0;</span>
<span class="hl str">		my</span> <span class="hl ipl">$choice</span><span class="hl str">;</span>
<span class="hl str">		while (!</span><span class="hl ipl">$subdone</span><span class="hl str">) {</span>
<span class="hl str">		    # Entry should be edited when double-clicked</span>
<span class="hl str"></span>		    <span class="hl ipl">$buttonclicked</span> <span class="hl str">= &quot;</span>edit<span class="hl str">&quot;;</span>
<span class="hl str"></span>		    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_(</span>
<span class="hl str">			 { title =&gt; N(&quot;</span>Accessing printers on remote CUPS servers<span class="hl str">&quot;),</span>
<span class="hl str">			   messages =&gt; N(&quot;</span>Add here the CUPS servers whose printers you want to <span class="hl kwa">use</span><span class="hl opt">.</span> You only need to <span class="hl kwa">do</span> this <span class="hl kwa">if</span> the servers <span class="hl kwa">do</span> <span class="hl kwc">not</span> broadcast their printer information into the <span class="hl kwc">local</span> network<span class="hl opt">.</span><span class="hl str">&quot;),</span>
<span class="hl str">			   ok =&gt; &quot;</span><span class="hl str">&quot;,</span>
<span class="hl str">			   cancel =&gt; &quot;</span><span class="hl str">&quot;,</span>
<span class="hl str">		         },</span>
<span class="hl str">			 # List the hosts</span>
<span class="hl str">			 [ { val =&gt; \</span><span class="hl ipl">$choice,</span> <span class="hl str">format =&gt; \&amp;translate,</span>
<span class="hl str">			     sort =&gt; 0, separator =&gt; &quot;</span><span class="hl slc">####&quot;,</span>
			     tree_expanded <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
			     quit_if_double_click <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
			     allow_empty_list <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
			     list <span class="hl opt">=&gt;</span> <span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Add server&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;add&quot;</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Edit selected server&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;edit&quot;</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">},</span>
			     disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwa">return</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &lt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
			     <span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remove selected server&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;remove&quot;</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">},</span>
			     disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwa">return</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>list<span class="hl opt">}} &lt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
			     <span class="hl opt">} },</span>
			   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Done&quot;</span><span class="hl opt">),</span> 
			     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;button&apos;</span><span class="hl opt">,</span>
			     clicked_may_quit <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$buttonclicked</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
				 <span class="hl kwb">$subdone</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
				 <span class="hl num">1</span><span class="hl opt">;</span> 
			     <span class="hl opt">} },</span>
			   <span class="hl opt">]</span>
			 <span class="hl opt">);</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;add&quot;</span> <span class="hl opt">||</span>
			<span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;edit&quot;</span><span class="hl opt">) {</span>
			<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$ip, $port</span><span class="hl opt">);</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;add&quot;</span><span class="hl opt">) {</span>
			    <span class="hl slc"># Use default port</span>
			    <span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl str">&apos;631&apos;</span><span class="hl opt">;</span>
			<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">} =~</span>
				<span class="hl kwd">/^([^:]+):([^:]+)$/</span><span class="hl opt">) {</span>
				<span class="hl slc"># Entry to edit has IP and port</span>
				<span class="hl kwb">$ip</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
				<span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
			    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
				<span class="hl slc"># Entry is only an IP, no port, so take</span>
				<span class="hl slc"># the default port 631</span>
				<span class="hl kwb">$ip</span> <span class="hl opt">=</span> <span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">};</span>
				<span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl str">&apos;631&apos;</span><span class="hl opt">;</span>
			    <span class="hl opt">}</span>
			<span class="hl opt">}</span>
			<span class="hl slc"># Show the dialog</span>
			<span class="hl kwc">my</span> <span class="hl kwb">$address</span><span class="hl opt">;</span>
			<span class="hl kwc">my</span> <span class="hl kwb">$oldaddress</span> <span class="hl opt">=</span> 
			    <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;edit&quot;</span> ?
			     <span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">} :</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">);</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
			     <span class="hl opt">{</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Accessing printers on remote CUPS servers&quot;</span><span class="hl opt">),</span>
			       messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Enter IP address and port of the host whose printers you want to use.&quot;</span><span class="hl opt">) .</span> <span class="hl str">&apos; &apos;</span> <span class="hl opt">.</span>
				   N<span class="hl opt">(</span><span class="hl str">&quot;If no port is given, 631 will be taken as default.&quot;</span><span class="hl opt">),</span>
			       callbacks <span class="hl opt">=&gt; {</span>
				   complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				       <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$ip</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*$/</span><span class="hl opt">) {</span>
					   <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Server IP missing!&quot;</span><span class="hl opt">));</span>
					   <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span>
				       <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$ip</span> <span class="hl opt">!~</span> 
					   <span class="hl kwd">/^\s*(\d+\.\d+\.\d+\.\d+)\s*$/</span><span class="hl opt">) {</span>
					   <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> 
N<span class="hl opt">(</span><span class="hl str">&quot;The entered IP is not correct.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">) .</span>
N<span class="hl opt">(</span><span class="hl str">&quot;Examples for correct IPs:</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">) .</span>
  <span class="hl str">&quot;192.168.100.194</span><span class="hl esc">\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span>
  <span class="hl str">&quot;10.0.0.2</span><span class="hl esc">\n</span><span class="hl str">&quot;</span>
<span class="hl opt">);</span>
					   <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
					   <span class="hl kwb">$ip</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span>
				       <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$port</span> <span class="hl opt">!~</span> <span class="hl kwd">/\S/</span><span class="hl opt">) {</span>
					   <span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl str">&apos;631&apos;</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$port</span> <span class="hl opt">!~</span> <span class="hl kwd">/^\s*(\d+)\s*$/</span><span class="hl opt">) {</span>
					   <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;The port number should be an integer!&quot;</span><span class="hl opt">));</span>
					   <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
					   <span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span>
				       <span class="hl kwb">$address</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$ip</span><span class="hl str">:</span><span class="hl ipl">$port</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
				       <span class="hl slc"># Check whether item is duplicate</span>
				       <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$address</span> <span class="hl kwc">ne</span> <span class="hl kwb">$oldaddress</span> <span class="hl opt">&amp;&amp;</span>
					   member<span class="hl opt">(</span><span class="hl kwb">$address,</span>
						  <span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>BrowsePoll<span class="hl opt">}})) {</span>
					   <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> 
							 N<span class="hl opt">(</span><span class="hl str">&quot;This server is already in the list, it cannot be added again.</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">));</span>
					   <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
				       <span class="hl opt">}</span>
				       <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
				   <span class="hl opt">},</span>
			       <span class="hl opt">},</span>
			   <span class="hl opt">},</span>
			     <span class="hl slc"># Ask for IP and port</span>
			     <span class="hl opt">[ {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$ip,</span> 
				 label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;IP address&quot;</span><span class="hl opt">) },</span>
			       <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$port,</span> 
				 label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Port&quot;</span><span class="hl opt">) },</span>
			       <span class="hl opt">],</span>
			     <span class="hl opt">)) {</span>
			    <span class="hl slc"># OK was clicked, insert new item into the list</span>
			    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;add&quot;</span><span class="hl opt">) {</span>
				<span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>BrowsePoll<span class="hl opt">}},</span>
				     <span class="hl kwb">$address</span><span class="hl opt">);</span>
			    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
				<span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>BrowsePoll<span class="hl opt">}} =</span>
				    <span class="hl kwc">map</span> <span class="hl opt">{ (</span><span class="hl kwb">$_</span> <span class="hl kwc">eq</span>
					  <span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">}</span> ?
					  <span class="hl kwb">$address</span> <span class="hl opt">:</span> <span class="hl kwb">$_</span><span class="hl opt">) }</span>
				        <span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>BrowsePoll<span class="hl opt">}};</span>
			    <span class="hl opt">}</span>
			    <span class="hl slc"># Refresh list of hosts</span>
			    <span class="hl kwb">$browsepoll</span> <span class="hl opt">=</span> 
			    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>makebrowsepolllist<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
			    <span class="hl slc"># Position the list cursor on the new/modified</span>
			    <span class="hl slc"># item</span>
			    <span class="hl kwb">$choice</span> <span class="hl opt">=</span> <span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>hash<span class="hl opt">}{</span><span class="hl kwb">$address</span><span class="hl opt">};</span>
			<span class="hl opt">}</span>
		    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;remove&quot;</span><span class="hl opt">) {</span>
			<span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>BrowsePoll<span class="hl opt">}} =</span>
			    <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl kwc">ne</span> <span class="hl kwb">$browsepoll</span><span class="hl opt">-&gt;{</span>invhash<span class="hl opt">}{</span><span class="hl kwb">$choice</span><span class="hl opt">} }</span>
			    <span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>BrowsePoll<span class="hl opt">}};</span>
			<span class="hl slc"># Refresh list of hosts</span>
			<span class="hl kwb">$browsepoll</span> <span class="hl opt">=</span> 
			    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>makebrowsepolllist<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$buttonclicked</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;daemonlesscups&quot;</span><span class="hl opt">) {</span>
		<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$modechoice, $rserver</span><span class="hl opt">);</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$modechoice</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;On, Name or IP of remote server:&quot;</span><span class="hl opt">);</span>
		    <span class="hl kwb">$rserver</span> <span class="hl opt">=</span> <span class="hl kwb">$remote_cups_server</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$modechoice</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Off&quot;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Show the dialog</span>
		<span class="hl slc">#my $address;</span>
		<span class="hl slc">#my $oldaddress = </span>
		<span class="hl slc">#    ($buttonclicked eq &quot;edit&quot; ?</span>
		<span class="hl slc">#     $sharehosts-&gt;{invhash}{$choice} : &quot;&quot;);</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span>
		    <span class="hl opt">({</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote CUPS server and no local CUPS daemon&quot;</span><span class="hl opt">),</span>
		       messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;In this mode the local CUPS daemon will be stopped and all printing requests go directly to the server specified below. Note that it is not possible to define local print queues then and if the specified server is down it cannot be printed at all from this machine.&quot;</span><span class="hl opt">),</span>
		       callbacks <span class="hl opt">=&gt; {</span>
			   complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			       <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$modechoice</span> <span class="hl kwc">eq</span> 
				   N<span class="hl opt">(</span><span class="hl str">&quot;On, Name or IP of remote server:&quot;</span><span class="hl opt">) &amp;&amp;</span>
				   <span class="hl kwb">$rserver</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*$/</span><span class="hl opt">) {</span>
				   
				   <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;CUPS server name or IP address missing.&quot;</span><span class="hl opt">));</span>
				   <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
			       <span class="hl opt">}</span>
			       <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
			   <span class="hl opt">},</span>
		       <span class="hl opt">},</span>
		   <span class="hl opt">},</span>
		     <span class="hl slc"># Show the widgets</span>
		     <span class="hl opt">[ {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$modechoice,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span>
			 type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;list&apos;</span><span class="hl opt">,</span>
			 <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
			 list <span class="hl opt">=&gt; [</span> N<span class="hl opt">(</span><span class="hl str">&quot;Off&quot;</span><span class="hl opt">),</span>
				   N<span class="hl opt">(</span><span class="hl str">&quot;On, Name or IP of remote server:&quot;</span><span class="hl opt">) ]},</span>
		       <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$rserver,</span> 
			 disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			     <span class="hl kwb">$modechoice</span> <span class="hl kwc">ne</span> 
				 N<span class="hl opt">(</span><span class="hl str">&quot;On, Name or IP of remote server:&quot;</span><span class="hl opt">);</span>
			 <span class="hl opt">} },</span>
		       <span class="hl opt">],</span>
		     <span class="hl opt">)) {</span>
		    <span class="hl slc"># OK was clicked, update the data</span>
		    <span class="hl kwb">$daemonless_cups</span> <span class="hl opt">=</span> 
			<span class="hl opt">(</span><span class="hl kwb">$modechoice</span> <span class="hl kwc">eq</span> N<span class="hl opt">(</span><span class="hl str">&quot;On, Name or IP of remote server:&quot;</span><span class="hl opt">));</span>
		    <span class="hl kwb">$remote_cups_server</span> <span class="hl opt">=</span> <span class="hl kwb">$rserver</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl slc"># We have clicked &quot;OK&quot;</span>
		<span class="hl kwb">$retvalue</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl kwb">$maindone</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl slc"># Write state for auto-correction of cupsd.conf</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$oldautocorr</span> <span class="hl opt">!=</span> 
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>autocorrection<span class="hl opt">}) {</span>
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>set_cups_autoconf<span class="hl opt">(</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>autocorrection<span class="hl opt">});</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Write state of japanese text printing mode</span>
		printer<span class="hl opt">::</span>main<span class="hl opt">::</span>set_jap_textmode<span class="hl opt">(</span><span class="hl kwb">$jap_textmode</span><span class="hl opt">);</span>
		<span class="hl slc"># Switch state of daemon-less CUPS mode and write</span>
		<span class="hl slc"># client.conf</span>
		<span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$daemonless_cups</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">) ||</span>
		    <span class="hl opt">(!</span><span class="hl kwb">$daemonless_cups</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">)) {</span>
		    <span class="hl kwc">my</span> <span class="hl kwb">$oldspooler</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">};</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} = (</span><span class="hl kwb">$daemonless_cups</span> ? 
					  <span class="hl str">&quot;rcups&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">);</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span>install_spooler<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">,</span> <span class="hl kwb">$in, $upNetwork,</span> <span class="hl num">1</span><span class="hl opt">)) {</span>
			printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>set_spooler<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
			printer<span class="hl opt">::</span>main<span class="hl opt">::</span>write_client_conf
			    <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups, $remote_cups_server</span><span class="hl opt">);</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">} =</span>
			    <span class="hl kwb">$remote_cups_server</span><span class="hl opt">;</span>
			<span class="hl slc"># Get the queues of this spooler</span>
			<span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span>
			    <span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Reading printer data...&quot;</span><span class="hl opt">));</span>
			printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_configured_queues<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
			<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
			<span class="hl slc"># Re-read the printer database next time</span>
			<span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb <span class="hl opt">= ();</span>
			assure_default_printer_is_set<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
		    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> <span class="hl kwb">$oldspooler</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups</span><span class="hl opt">) {</span>
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>write_client_conf<span class="hl opt">(</span><span class="hl kwb">$daemonless_cups,</span>
						     <span class="hl kwb">$remote_cups_server</span><span class="hl opt">);</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">} =</span> <span class="hl kwb">$remote_cups_server</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">};</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Write cupsd.conf</span>
		printer<span class="hl opt">::</span>main<span class="hl opt">::</span>write_cups_config<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> 
		    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;Restarting CUPS...&quot;</span><span class="hl opt">));</span>
		printer<span class="hl opt">::</span>main<span class="hl opt">::</span>write_cupsd_conf<span class="hl opt">(</span>
		    <span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>cupsconfig<span class="hl opt">}{</span>cupsd_conf<span class="hl opt">}});</span>
		<span class="hl slc">#- restart cups after updating configuration.</span>
		printer<span class="hl opt">::</span>main<span class="hl opt">::</span>SIGHUP_daemon<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">});</span>
		<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl slc"># Cancel clicked</span>
	    <span class="hl kwb">$maindone</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>clean_cups_config<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    <span class="hl kwa">return</span> <span class="hl kwb">$retvalue</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> choose_printer_type <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$havelocalnetworks</span> <span class="hl opt">=</span> check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">1</span><span class="hl opt">) &amp;&amp;</span>
	                    printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getIPsInLocalNetworks<span class="hl opt">() != ();</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>str_type<span class="hl opt">} =</span> <span class="hl kwb">$printer_type_inv</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">}};</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">};</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;printertypes</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>printer_type<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
		   <span class="hl opt">{</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Select Printer Connection&quot;</span><span class="hl opt">),</span>
		     messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;How is the printer connected?&quot;</span><span class="hl opt">) .</span>
			 if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">,</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Printers on remote CUPS servers do not need to be configured here; these printers will be automatically detected.&quot;</span><span class="hl opt">)) .</span>
			 if_<span class="hl opt">(!</span><span class="hl kwb">$havelocalnetworks,</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">WARNING: No local network connection active, remote printers can neither be detected nor tested!&quot;</span><span class="hl opt">)),</span>
		     <span class="hl opt">},</span>
		   <span class="hl opt">[</span>
		    <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>str_type<span class="hl opt">},</span>
		      list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;printertypes,</span> 
		      not_edit <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
		      type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;list&apos;</span> <span class="hl opt">},</span>
		    <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer auto-detection (Local, TCP/Socket, SMB printers, and device URI)&quot;</span><span class="hl opt">),</span>
		      type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$autodetect</span> <span class="hl opt">}</span>
		    <span class="hl opt">]</span>
		   <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">} =</span> <span class="hl kwb">$autodetect</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> <span class="hl kwb">$printer_type</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>str_type<span class="hl opt">}};</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_printer_connection <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># Choose the appropriate connection config dialog</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$done</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">}) {</span>
	<span class="hl kwd">/LOCAL/</span>    <span class="hl kwc">and</span> setup_local_autoscan<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwd">/LPD/</span>      <span class="hl kwc">and</span> setup_lpd<span class="hl opt">(</span>      <span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwd">/SOCKET/</span>   <span class="hl kwc">and</span> setup_socket<span class="hl opt">(</span>   <span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwd">/SMB/</span>      <span class="hl kwc">and</span> setup_smb<span class="hl opt">(</span>      <span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwd">/NCP/</span>      <span class="hl kwc">and</span> setup_ncp<span class="hl opt">(</span>      <span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwd">/URI/</span>      <span class="hl kwc">and</span> setup_uri<span class="hl opt">(</span>      <span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwd">/POSTPIPE/</span> <span class="hl kwc">and</span> setup_postpipe<span class="hl opt">(</span> <span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl kwb">$done</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> <span class="hl kwb">$done</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> first_time_dialog <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>get_spooler<span class="hl opt">() || $::</span>isInstall<span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Checking your system...&quot;</span><span class="hl opt">));</span>

    <span class="hl slc"># Auto-detect local printers   </span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;autodetected</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>local_detect<span class="hl opt">();</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$msg</span> <span class="hl opt">=</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">&#64;printerlist</span> <span class="hl opt">=</span> 
	      <span class="hl kwc">map</span> <span class="hl opt">{</span>
		  <span class="hl kwc">my</span> <span class="hl kwb">$entry</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">};</span>
		  <span class="hl kwb">$entry</span> <span class="hl opt">||=</span> <span class="hl str">&quot;</span><span class="hl ipl">$_</span><span class="hl str">-&gt;{val}{MANUFACTURER}</span> <span class="hl ipl">$_</span><span class="hl str">-&gt;{val}{MODEL}&quot;</span><span class="hl opt">;</span>
		  if_<span class="hl opt">(</span><span class="hl kwb">$entry,</span> <span class="hl str">&quot;  -</span>  <span class="hl ipl">$entry\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
	      <span class="hl opt">}</span> <span class="hl kwb">&#64;autodetected</span><span class="hl opt">;</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$unknown_printers</span> <span class="hl opt">=</span> <span class="hl kwb">&#64;autodetected</span> <span class="hl opt">-</span> <span class="hl kwb">&#64;printerlist</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">&#64;printerlist</span><span class="hl opt">) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$unknown_msg</span> <span class="hl opt">=</span> 
		  <span class="hl kwb">$unknown_printers</span> <span class="hl opt">==</span> <span class="hl num">1</span> ? 
		    <span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span> N<span class="hl opt">(</span><span class="hl str">&quot;and one unknown printer&quot;</span><span class="hl opt">) :</span>
		  <span class="hl kwb">$unknown_printers</span> <span class="hl opt">&gt;</span> <span class="hl num">1</span> ?
		    <span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span> N<span class="hl opt">(</span><span class="hl str">&quot;and</span> <span class="hl ipl">%d</span> <span class="hl str">unknown printers&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$unknown_printers</span><span class="hl opt">) :</span>
		    <span class="hl str">&apos;&apos;</span><span class="hl opt">;</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$main_msg</span> <span class="hl opt">=</span> 
		  <span class="hl kwb">&#64;printerlist</span> <span class="hl opt">&gt;</span> <span class="hl num">1</span> ?
		    N_<span class="hl opt">(</span><span class="hl str">&quot;The following printers</span><span class="hl esc">\n\n</span><span class="hl str"></span><span class="hl ipl">%s%s\nare</span> <span class="hl str">directly connected to your system&quot;</span><span class="hl opt">) :</span>
		  <span class="hl kwb">$unknown_printers</span> ?
		    N_<span class="hl opt">(</span><span class="hl str">&quot;The following printer</span><span class="hl esc">\n\n</span><span class="hl str"></span><span class="hl ipl">%s%s\nare</span> <span class="hl str">directly connected to your system&quot;</span><span class="hl opt">) :</span>
		    N_<span class="hl opt">(</span><span class="hl str">&quot;The following printer</span><span class="hl esc">\n\n</span><span class="hl str"></span><span class="hl ipl">%s%s\nis</span> <span class="hl str">directly connected to your system&quot;</span><span class="hl opt">);</span>
		<span class="hl kwc">sprintf</span><span class="hl opt">(</span><span class="hl kwb">$main_msg,</span> <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> <span class="hl kwb">&#64;printerlist</span><span class="hl opt">),</span> <span class="hl kwb">$unknown_msg</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$unknown_printers</span> <span class="hl opt">==</span> <span class="hl num">1</span> ?
		  N<span class="hl opt">(</span><span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">There is one unknown printer directly connected to your system&quot;</span><span class="hl opt">) :</span>
		  N<span class="hl opt">(</span><span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">There are</span> <span class="hl ipl">%d</span> <span class="hl str">unknown printers directly connected to your system&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$unknown_printers</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    N<span class="hl opt">(</span><span class="hl str">&quot;There are no printers found which are directly connected to your machine&quot;</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>
    <span class="hl opt">};</span>
    <span class="hl kwb">$msg</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot; (Make sure that all your printers are connected and turned on).</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>

    <span class="hl slc"># Do we have a local network?</span>

    <span class="hl slc"># If networking is configured, start it, but do not ask the user to</span>
    <span class="hl slc"># configure networking.</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$havelocalnetworks</span> <span class="hl opt">=</span> 
	 check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">1</span><span class="hl opt">) &amp;&amp;</span> 
           printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getIPsInLocalNetworks<span class="hl opt">() != ();</span>

    <span class="hl slc"># Finish building the dialog text</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$question</span> <span class="hl opt">= (</span><span class="hl kwb">$havelocalnetworks</span> ?
		    <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span> ?
		     N<span class="hl opt">(</span><span class="hl str">&quot;Do you want to enable printing on the printers mentioned above or on printers in the local network?</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">) :</span>
		     N<span class="hl opt">(</span><span class="hl str">&quot;Do you want to enable printing on printers in the local network?</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">)) :</span>
		    <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span> ?
		     N<span class="hl opt">(</span><span class="hl str">&quot;Do you want to enable printing on the printers mentioned above?</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">) :</span>
		     N<span class="hl opt">(</span><span class="hl str">&quot;Are you sure that you want to set up printing on this machine?</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">)));</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$warning</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;NOTE: Depending on the printer model and the printing system up to</span> <span class="hl ipl">%d</span> <span class="hl str">MB of additional software will be installed.&quot;</span><span class="hl opt">,</span> <span class="hl num">80</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$dialogtext</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$msg\n$question\n$warning</span><span class="hl str">&quot;</span><span class="hl opt">;</span>

    <span class="hl slc"># Close wait message</span>
    <span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>

    <span class="hl kwa">while</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl slc"># Show dialog</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$do_it</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Yes&quot;</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$quit</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Quit&quot;</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;choices</span> <span class="hl opt">= (</span><span class="hl kwb">$do_it, $quit</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$choice</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span> <span class="hl kwb">$dialogtext,</span> 
					\<span class="hl kwb">&#64;choices, $quit</span><span class="hl opt">);</span>
	<span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl kwb">$choice</span> <span class="hl kwc">ne</span> <span class="hl kwb">$do_it</span><span class="hl opt">;</span>
    
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$havelocalnetworks</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">&#64;autodetected</span> <span class="hl opt">) {</span>
	    <span class="hl kwa">return</span> set_cups_daemon_mode<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> configure_new_printers <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $_upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># This procedure auto-detects local printers and checks whether</span>
    <span class="hl slc"># there is already a queue for them. If there is no queue for an</span>
    <span class="hl slc"># auto-detected printer, a queue gets set up non-interactively.</span>

    <span class="hl slc"># Experts can have weird things as self-made CUPS backends, so do not</span>
    <span class="hl slc"># automatically pollute the system with unwished queues in expert</span>
    <span class="hl slc"># mode</span>
    <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">};</span>
    
    <span class="hl slc"># Wait message</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">= $::</span>noX <span class="hl opt">||</span> 
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;Searching for new printers...&quot;</span><span class="hl opt">));</span>

    <span class="hl slc"># When HPOJ is running, it blocks the printer ports on which it is</span>
    <span class="hl slc"># configured, so we stop it here. If it is not installed or not </span>
    <span class="hl slc"># configured, this command has no effect.</span>
    <span class="hl kwa">require</span> services<span class="hl opt">;</span>
    services<span class="hl opt">::</span>stop<span class="hl opt">(</span><span class="hl str">&quot;hpoj&quot;</span><span class="hl opt">);</span>

    <span class="hl slc"># Auto-detect local printers</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;autodetected</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>local_detect<span class="hl opt">();</span>

    <span class="hl slc"># We are ready with auto-detection, so we restart HPOJ here. If it </span>
    <span class="hl slc"># is not installed or not configured, this command has no effect.</span>
    services<span class="hl opt">::</span>start<span class="hl opt">(</span><span class="hl str">&quot;hpoj&quot;</span><span class="hl opt">);</span>

    <span class="hl slc"># No printer found? So no need of new queues.</span>
    <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">;</span>

    <span class="hl slc"># Black-list all auto-detected printers for which there is already</span>
    <span class="hl slc"># a queue</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;blacklist</span><span class="hl opt">;</span>
    <span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">(</span><span class="hl kwc">keys</span> <span class="hl opt">%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}}) {</span>
	<span class="hl slc"># Does the URI of this installed queue match one of the autodetected</span>
	<span class="hl slc"># printers?</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$uri</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$p</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>autodetectionentry_for_uri<span class="hl opt">(</span>
	    <span class="hl kwb">$uri, &#64;autodetected</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">)) {</span>
	    <span class="hl slc"># Blacklist the port</span>
	    <span class="hl kwc">push</span><span class="hl opt">(</span><span class="hl kwb">&#64;blacklist, $p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">});</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Now install queues for all auto-detected printers which have no queue</span>
    <span class="hl slc"># yet</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl slc"># Suppress all interactive steps</span>
    <span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$p</span> <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span>member<span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">},</span> <span class="hl kwb">&#64;blacklist</span><span class="hl opt">)) {</span>
	    <span class="hl slc"># Initialize some variables for queue setup</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> <span class="hl str">&quot;LOCAL&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">} = {</span> queue    <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 foomatic <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
					 desc     <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 loc      <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 make     <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 model    <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 printer  <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 driver   <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 <span class="hl kwc">connect</span>  <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
					 spooler  <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">},</span>
				       <span class="hl opt">};</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
	    <span class="hl kwb">$w</span> <span class="hl opt">= $::</span>noX <span class="hl opt">||</span> 
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
				  N<span class="hl opt">(</span><span class="hl str">&quot;Found printer on</span> <span class="hl ipl">%s</span><span class="hl str">...&quot;</span><span class="hl opt">,</span>
				    <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">}));</span>
	    <span class="hl slc"># Do configuration of multi-function devices and look up</span>
	    <span class="hl slc"># model name in the printer database</span>
	    setup_common<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">},</span> <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">},</span>
			 <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">&#64;autodetected</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span>
	    <span class="hl slc"># Do the steps of queue setup</span>
	    get_db_entry<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	    <span class="hl slc"># Let the user choose the model manually if it could not be</span>
	    <span class="hl slc"># auto-detected.</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">}) {</span>
		<span class="hl slc"># Skip this printer if we install print queues in a</span>
		<span class="hl slc"># background without X access.</span>
		<span class="hl kwa">if</span> <span class="hl opt">($::</span>noX<span class="hl opt">) {</span>
		    <span class="hl slc"># Delete some variables</span>
		    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl str">qw(OLD_QUEUE QUEUE TYPE str_type DBENTRY ARGS OLD_CHOICE currentqueue NEW)</span><span class="hl opt">) {</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		    <span class="hl kwa">next</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Set the OLD_CHOICE to a non-existing value</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_CHOICE<span class="hl opt">} =</span> <span class="hl str">&quot;XXX&quot;</span><span class="hl opt">;</span>
		<span class="hl slc"># Set model selection cursor onto the &quot;Raw Printer&quot; entry.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> N<span class="hl opt">(</span><span class="hl str">&quot;Raw printer (No driver)&quot;</span><span class="hl opt">);</span>
		<span class="hl slc"># Info about what was detected</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$info</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;(&quot;</span><span class="hl opt">) .</span> if_<span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">},</span>
					<span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">} .</span> N<span class="hl opt">(</span><span class="hl str">&quot; on &quot;</span><span class="hl opt">)) .</span>
					<span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} .</span> N<span class="hl opt">(</span><span class="hl str">&quot;)&quot;</span><span class="hl opt">);</span>
		<span class="hl slc"># Remove wait message</span>
		<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
		<span class="hl slc"># Choose the printer/driver from the list</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> 
		    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_treelist</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer model selection&quot;</span><span class="hl opt">),</span>
					   N<span class="hl opt">(</span><span class="hl str">&quot;Which printer model do you have?&quot;</span><span class="hl opt">) .</span>
					   N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str"></span>
<span class="hl str">Printerdrake could not determine which model your printer</span> <span class="hl ipl">%s</span> <span class="hl str">is. Please choose the correct model from the list.&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$info</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
					   N<span class="hl opt">(</span><span class="hl str">&quot;If your printer is not listed, choose a compatible (see printer manual) or a similar one.&quot;</span><span class="hl opt">),</span> <span class="hl str">&apos;|&apos;</span><span class="hl opt">,</span>
					   <span class="hl opt">[</span> <span class="hl kwc">keys</span> <span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb <span class="hl opt">],</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">})</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span>
		<span class="hl slc"># Restore wait message</span>
		<span class="hl kwb">$w</span> <span class="hl opt">= $::</span>noX <span class="hl opt">||</span>
		    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;Configuring printer on</span> <span class="hl ipl">%s</span><span class="hl str">...&quot;</span><span class="hl opt">,</span>
					<span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">}));</span>
	    <span class="hl opt">}</span>
	    get_printer_info<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span>
	    setup_options<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$_queue</span> <span class="hl opt">=</span> generate_queuename<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl slc"># Change wait message</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
	    <span class="hl kwb">$w</span> <span class="hl opt">= $::</span>noX <span class="hl opt">||</span> 
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
				  N<span class="hl opt">(</span><span class="hl str">&quot;Configuring printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">...</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>				    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{queue}));</span>
<span class="hl str">	    # Create the queue</span>
<span class="hl str">	    configure_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) or next;</span>
<span class="hl str">	    # If there is no default printer set, let this one get the</span>
<span class="hl str">	    # default</span>
<span class="hl str">	    if (!</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT}) {</span>
<span class="hl str"></span>		<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE};</span>
<span class="hl str">		printer::default::set_printer(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">	    }</span>
<span class="hl str">	}</span>
<span class="hl str">	# Delete some variables</span>
<span class="hl str">	foreach (qw(OLD_QUEUE QUEUE TYPE str_type DBENTRY ARGS OLD_CHOICE)</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">} = {};</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>complete<span class="hl opt">} =</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> generate_queuename <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>model<span class="hl opt">}) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>model<span class="hl opt">}</span> <span class="hl kwc">eq</span> N<span class="hl opt">(</span><span class="hl str">&quot;Unknown model&quot;</span><span class="hl opt">)) {</span>
	    <span class="hl kwb">$queue</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer&quot;</span><span class="hl opt">);</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>make<span class="hl opt">} .</span> <span class="hl str">&apos;|&apos;</span> <span class="hl opt">.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>model<span class="hl opt">};</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">};</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$queue</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\|/ /g</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>desc<span class="hl opt">} =</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
    <span class="hl kwb">$queue</span> <span class="hl opt">=~</span> <span class="hl kwd">s/series//gi</span><span class="hl opt">;</span>
    <span class="hl kwb">$queue</span> <span class="hl opt">=~</span> <span class="hl kwd">s/[\s\(\)\-,]//g</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$make</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>make<span class="hl opt">};</span>
    <span class="hl kwb">$queue</span> <span class="hl opt">=~</span> <span class="hl kwd">s/$make$make/$make/gi</span><span class="hl opt">;</span>
    <span class="hl slc"># Append a number if the queue name already exists</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}) {</span>
	<span class="hl kwb">$queue</span> <span class="hl opt">=~</span> <span class="hl kwd">s/(\d)$/$1_/</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl kwa">while</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl str">&quot;</span><span class="hl ipl">$queue$i</span><span class="hl str">&quot;</span><span class="hl opt">}) {</span>
	    <span class="hl kwb">$i++</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">$queue</span> <span class="hl opt">.=</span> <span class="hl kwb">$i</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>queue<span class="hl opt">} =</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">} =</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">} =</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
    <span class="hl kwa">return</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> wizard_welcome <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$ret</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$autodetectlocal</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$autodetectnetwork</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$autodetectsmb</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl slc"># If networking is configured, start it, but do not ask the user to</span>
    <span class="hl slc"># configure networking.</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$havelocalnetworks</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}) {</span>
	<span class="hl kwb">$havelocalnetworks</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">};</span>
	<span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">};</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$havelocalnetworks</span> <span class="hl opt">=</span> check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">1</span><span class="hl opt">) &amp;&amp;</span>
			      printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getIPsInLocalNetworks<span class="hl opt">() != ();</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$havelocalnetworks</span><span class="hl opt">) {</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">};</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">};</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">$autodetectlocal</span> <span class="hl opt">=</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTLOCAL<span class="hl opt">};</span>
	<span class="hl kwb">$autodetectnetwork</span> <span class="hl opt">=</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">};</span>
	<span class="hl kwb">$autodetectsmb</span> <span class="hl opt">=</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">};</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) {</span>
	<span class="hl kwc">eval</span> <span class="hl opt">{</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}) {</span>
		<span class="hl kwa">if</span> <span class="hl opt">($::</span>isWizard<span class="hl opt">) {</span>
		    <span class="hl kwb">$ret</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_okcancel</span><span class="hl opt">(</span>
			 N<span class="hl opt">(</span><span class="hl str">&quot;Add a new printer&quot;</span><span class="hl opt">),</span>
			 N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Welcome to the Printer Setup Wizard</span>
<span class="hl str"></span>
<span class="hl str">This wizard allows you to install local or remote printers to be used from this machine and also from other machines in the network.</span>
<span class="hl str"></span>
<span class="hl str">It asks you for all necessary information to set up the printer and gives you access to all available printer drivers, driver options, and printer connection types.&quot;</span><span class="hl opt">));</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$ret</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$ret</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
		     <span class="hl opt">{</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Add a new printer&quot;</span><span class="hl opt">),</span>
		       messages <span class="hl opt">=&gt; (</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;pdq&quot;</span> ? 
				   <span class="hl opt">(</span><span class="hl kwb">$havelocalnetworks</span> ? N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Welcome to the Printer Setup Wizard</span>
<span class="hl str"></span>
<span class="hl str">This wizard will help you to install your printer(s) connected to this computer, connected directly to the network or to a remote Windows machine.</span>
<span class="hl str"></span>
<span class="hl str">Please plug in and turn on all printers connected to this machine so that it/they can be auto-detected. Also your network printer(s) and your Windows machines must be connected and turned on.</span>
<span class="hl str"></span>
<span class="hl str">Note that auto-detecting printers on the network takes longer than the auto-detection of only the printers connected to this machine. So turn off the auto-detection of network and/or Windows-hosted printers when you do not need it.</span>
<span class="hl str"></span>
<span class="hl str"> Click on</span> <span class="hl esc">\&quot;</span><span class="hl str">Next</span><span class="hl esc">\&quot;</span> <span class="hl str">when you are ready, and on</span> <span class="hl esc">\&quot;</span><span class="hl str">Cancel</span><span class="hl esc">\&quot;</span> <span class="hl str">if you do not want to set up your printer(s) now.&quot;</span><span class="hl opt">) :</span> N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Welcome to the Printer Setup Wizard</span>
<span class="hl str"></span>
<span class="hl str">This wizard will help you to install your printer(s) connected to this computer.</span>
<span class="hl str"></span>
<span class="hl str">Please plug in and turn on all printers connected to this machine so that it/they can be auto-detected.</span>
<span class="hl str"></span>
<span class="hl str"> Click on</span> <span class="hl esc">\&quot;</span><span class="hl str">Next</span><span class="hl esc">\&quot;</span> <span class="hl str">when you are ready, and on</span> <span class="hl esc">\&quot;</span><span class="hl str">Cancel</span><span class="hl esc">\&quot;</span> <span class="hl str">if you do not want to set up your printer(s) now.&quot;</span><span class="hl opt">)) :</span> 
				   <span class="hl opt">(</span><span class="hl kwb">$havelocalnetworks</span> ? N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Welcome to the Printer Setup Wizard</span>
<span class="hl str"></span>
<span class="hl str">This wizard will help you to install your printer(s) connected to this computer or connected directly to the network.</span>
<span class="hl str"></span>
<span class="hl str">If you have printer(s) connected to this machine, Please plug it/them in on this computer and turn it/them on so that it/they can be auto-detected. Also your network printer(s) must be connected and turned on.</span>
<span class="hl str"></span>
<span class="hl str">Note that auto-detecting printers on the network takes longer than the auto-detection of only the printers connected to this machine. So turn off the auto-detection of network printers when you do not need it.</span>
<span class="hl str"></span>
<span class="hl str"> Click on</span> <span class="hl esc">\&quot;</span><span class="hl str">Next</span><span class="hl esc">\&quot;</span> <span class="hl str">when you are ready, and on</span> <span class="hl esc">\&quot;</span><span class="hl str">Cancel</span><span class="hl esc">\&quot;</span> <span class="hl str">if you do not want to set up your printer(s) now.&quot;</span><span class="hl opt">) :</span> N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Welcome to the Printer Setup Wizard</span>
<span class="hl str"></span>
<span class="hl str">This wizard will help you to install your printer(s) connected to this computer.</span>
<span class="hl str"></span>
<span class="hl str">If you have printer(s) connected to this machine, Please plug it/them in on this computer and turn it/them on so that it/they can be auto-detected.</span>
<span class="hl str"></span>
<span class="hl str"> Click on</span> <span class="hl esc">\&quot;</span><span class="hl str">Next</span><span class="hl esc">\&quot;</span> <span class="hl str">when you are ready, and on</span> <span class="hl esc">\&quot;</span><span class="hl str">Cancel</span><span class="hl esc">\&quot;</span> <span class="hl str">if you do not want to set up your printer(s) now.&quot;</span><span class="hl opt">))) },</span>
		     <span class="hl opt">[</span>
		      <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Auto-detect printers connected to this machine&quot;</span><span class="hl opt">),</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
			val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$autodetectlocal</span> <span class="hl opt">},</span>
		           if_<span class="hl opt">(</span><span class="hl kwb">$havelocalnetworks,</span>
		      <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Auto-detect printers connected directly to the local network&quot;</span><span class="hl opt">),</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
			val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$autodetectnetwork</span> <span class="hl opt">},</span>
			   if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;pdq&quot;</span><span class="hl opt">,</span>
		      <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Auto-detect printers connected to machines running Microsoft Windows&quot;</span><span class="hl opt">),</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
			val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$autodetectsmb</span> <span class="hl opt">})),</span>
		      <span class="hl opt">]);</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTLOCAL<span class="hl opt">} =</span> <span class="hl kwb">$autodetectlocal</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">} =</span> <span class="hl kwb">$autodetectnetwork</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">} =</span> <span class="hl kwb">$autodetectsmb</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;pdq&quot;</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">};</span>
	<span class="hl kwa">return</span> <span class="hl kwb">$&#64;</span> <span class="hl opt">=~</span> <span class="hl kwd">/wizcancel/</span> ? <span class="hl num">0</span> <span class="hl opt">:</span> <span class="hl kwb">$ret</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> wizard_congratulations <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_okcancel</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Add a new printer&quot;</span><span class="hl opt">),</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">Congratulations, your printer is now installed and configured!</span>
<span class="hl str"></span>
<span class="hl str">You can print using the</span> <span class="hl esc">\&quot;</span><span class="hl str">Print</span><span class="hl esc">\&quot;</span> <span class="hl str">command of your application (usually in the</span> <span class="hl esc">\&quot;</span><span class="hl str">File</span><span class="hl esc">\&quot;</span> <span class="hl str">menu).</span>
<span class="hl str"></span>
<span class="hl str">If you want to add, remove, or rename a printer, or if you want to change the default option settings (paper input tray, printout quality, ...), select</span> <span class="hl esc">\&quot;</span><span class="hl str">Printer</span><span class="hl esc">\&quot;</span> <span class="hl str">in the</span> <span class="hl esc">\&quot;</span><span class="hl str">Hardware</span><span class="hl esc">\&quot;</span> <span class="hl str">section of the</span> <span class="hl ipl">%s</span> <span class="hl str">Control Center.&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$shortdistroname</span><span class="hl opt">))</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_local_autoscan <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">};</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$expert_or_modify</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} || !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">};</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$do_auto_detect</span> <span class="hl opt">=</span> 
	<span class="hl opt">(</span><span class="hl kwb">$expert_or_modify</span> <span class="hl opt">&amp;&amp;</span>
	  <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">} ||</span>
	 <span class="hl opt">(!</span><span class="hl kwb">$expert_or_modify</span> <span class="hl opt">&amp;&amp;</span>
	  <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTLOCAL<span class="hl opt">} ||</span>
	   <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">} ||</span>
	   <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">})));</span>

    <span class="hl slc"># If the user requested auto-detection of remote printers, check</span>
    <span class="hl slc"># whether the network functionality is configured and running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">}) {</span>
	<span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">unless</span> check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>

    <span class="hl kwc">my</span> <span class="hl kwb">&#64;autodetected</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$menuentries</span> <span class="hl opt">= {};</span>
<span class="hl slc">#    $in-&gt;set_help(&apos;setupLocal&apos;) if $::isInstall;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$do_auto_detect</span><span class="hl opt">) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp;</span>
	    <span class="hl opt">!</span><span class="hl kwb">$expert_or_modify</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">} &amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/smbclient&apos;</span><span class="hl opt">)) {</span>
	    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;samba-client&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Warning&quot;</span><span class="hl opt">),</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
				<span class="hl str">&quot;Samba client&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Skipping Windows/SMB server auto-detection&quot;</span><span class="hl opt">));</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">} =</span> <span class="hl num">0</span><span class="hl opt">;</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTLOCAL<span class="hl opt">} &amp;&amp;</span>
			     <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">};</span>
	    <span class="hl opt">};</span>
	<span class="hl opt">}</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer auto-detection&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Detecting devices...&quot;</span><span class="hl opt">));</span>
	<span class="hl slc"># When HPOJ is running, it blocks the printer ports on which it is</span>
	<span class="hl slc"># configured, so we stop it here. If it is not installed or not </span>
	<span class="hl slc"># configured, this command has no effect.</span>
	<span class="hl kwa">require</span> services<span class="hl opt">;</span>
	services<span class="hl opt">::</span>stop<span class="hl opt">(</span><span class="hl str">&quot;hpoj&quot;</span><span class="hl opt">);</span>
	<span class="hl kwb">&#64;autodetected</span> <span class="hl opt">= (</span>
	    <span class="hl kwb">$expert_or_modify</span> <span class="hl opt">||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTLOCAL<span class="hl opt">}</span> ? printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>local_detect<span class="hl opt">() : (),</span>
	    <span class="hl opt">!</span><span class="hl kwb">$expert_or_modify</span> ? printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>whatNetPrinter<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">},</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">}) : (),</span>
        <span class="hl opt">);</span>
	<span class="hl slc"># We have more than one printer, so we must ask the user for a queue</span>
	<span class="hl slc"># name in the fully automatic printer configuration.</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MORETHANONE<span class="hl opt">} =</span> <span class="hl kwb">$#autodetected</span> <span class="hl opt">&gt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;str</span><span class="hl opt">;</span>
	<span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$p</span> <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">) {</span>
	    <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">}) || (</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>MODEL<span class="hl opt">})) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$menustr</span> <span class="hl opt">= (</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">}</span> ?
			       <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">} :</span>
			       <span class="hl opt">((</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>MANUFACTURER<span class="hl opt">}</span> ? 
				 <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>MANUFACTURER<span class="hl opt">} .</span> <span class="hl str">&quot; &quot;</span><span class="hl opt">) : ()) .</span>
				<span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>MODEL<span class="hl opt">}));</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^/dev/lp(\d+)$!</span><span class="hl opt">) {</span>
                    <span class="hl kwc">my</span> <span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
		    <span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot; on parallel port #</span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$port</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^/dev/usb/lp(\d+)$!</span><span class="hl opt">) {</span>
                    <span class="hl kwc">my</span> <span class="hl kwb">$printer</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
		    <span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;, USB printer #</span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$printer</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^socket://([^:]+):(\d+)$!</span><span class="hl opt">) {</span>
                    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $port</span><span class="hl opt">) = (</span><span class="hl kwb">$1, $2</span><span class="hl opt">);</span>
		    <span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;, network printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">,</span> port <span class="hl kwb">%s</span><span class="hl str">&quot;,</span> <span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$port</span><span class="hl str">);</span>
<span class="hl str">		} elsif (</span><span class="hl ipl">$p</span><span class="hl str">-&gt;{port} =~ m!^smb://([^/:]+)/([^/:]+)$!) {</span>
<span class="hl str">                    my (</span><span class="hl ipl">$server,</span> <span class="hl str"></span><span class="hl ipl">$printer</span><span class="hl str">) = (</span><span class="hl ipl">$1,</span> <span class="hl str"></span><span class="hl ipl">$2</span><span class="hl str">);</span>
<span class="hl str"></span>		    <span class="hl ipl">$menustr</span> <span class="hl str">.= N(&quot;</span><span class="hl opt">,</span> printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; on SMB/Windows server</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl str">&quot;,</span> <span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$server</span><span class="hl str">);</span>
<span class="hl str">		}</span>
<span class="hl str"></span>		<span class="hl ipl">$menustr</span> <span class="hl str">.= &quot;</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">})</span><span class="hl str">&quot; if</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert};</span>
<span class="hl str"></span>		<span class="hl ipl">$menuentries</span><span class="hl str">-&gt;{</span><span class="hl ipl">$menustr</span><span class="hl str">} =</span> <span class="hl ipl">$p</span><span class="hl str">-&gt;{port};</span>
<span class="hl str">		push</span> <span class="hl ipl">&#64;str,</span> <span class="hl str">N(&quot;</span>Detected <span class="hl kwb">%s</span><span class="hl str">&quot;,</span> <span class="hl ipl">$menustr</span><span class="hl str">);</span>
<span class="hl str">	    } else {</span>
<span class="hl str">		my</span> <span class="hl ipl">$menustr</span><span class="hl str">;</span>
<span class="hl str">		if (</span><span class="hl ipl">$p</span><span class="hl str">-&gt;{port} =~ m!^/dev/lp(\d+)$!) {</span>
<span class="hl str">                    my</span> <span class="hl ipl">$port</span> <span class="hl str">=</span> <span class="hl ipl">$1</span><span class="hl str">;</span>
<span class="hl str"></span>		    <span class="hl ipl">$menustr</span> <span class="hl str">= N(&quot;</span>Printer on parallel port <span class="hl slc">#%s&quot;, $port);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^/dev/usb/lp(\d+)$!</span><span class="hl opt">) {</span>
                    <span class="hl kwc">my</span> <span class="hl kwb">$printer</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
		    <span class="hl kwb">$menustr</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;USB printer #</span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$printer</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^socket://([^:]+):(\d+)$!</span><span class="hl opt">) {</span>
                    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $port</span><span class="hl opt">);</span>
		    <span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Network printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">,</span> port <span class="hl kwb">%s</span><span class="hl str">&quot;,</span> <span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$port</span><span class="hl str">);</span>
<span class="hl str">		} elsif (</span><span class="hl ipl">$p</span><span class="hl str">-&gt;{port} =~ m!^smb://([^/:]+)/([^/:]+)$!) {</span>
<span class="hl str">                    my (</span><span class="hl ipl">$server,</span> <span class="hl str"></span><span class="hl ipl">$printer</span><span class="hl str">) = (</span><span class="hl ipl">$1,</span> <span class="hl str"></span><span class="hl ipl">$2</span><span class="hl str">);</span>
<span class="hl str"></span>		    <span class="hl ipl">$menustr</span> <span class="hl str">.= N(&quot;</span>Printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; on SMB/Windows server</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl str">&quot;,</span> <span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$server</span><span class="hl str">);</span>
<span class="hl str">		}</span>
<span class="hl str"></span>		<span class="hl ipl">$menustr</span> <span class="hl str">.= &quot;</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">})</span><span class="hl str">&quot; if</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert};</span>
<span class="hl str"></span>		<span class="hl ipl">$menuentries</span><span class="hl str">-&gt;{</span><span class="hl ipl">$menustr</span><span class="hl str">} =</span> <span class="hl ipl">$p</span><span class="hl str">-&gt;{port};</span>
<span class="hl str">	    }</span>
<span class="hl str">	}</span>
<span class="hl str">	my</span> <span class="hl ipl">&#64;port</span><span class="hl str">;</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert}) {</span>
<span class="hl str"></span>	    <span class="hl ipl">&#64;port</span> <span class="hl str">= printer::detect::whatPrinterPort();</span>
<span class="hl str">	  LOOP: foreach my</span> <span class="hl ipl">$q</span> <span class="hl str">(</span><span class="hl ipl">&#64;port</span><span class="hl str">) {</span>
<span class="hl str">		if (</span><span class="hl ipl">&#64;str</span><span class="hl str">) {</span>
<span class="hl str">		    foreach my</span> <span class="hl ipl">$p</span> <span class="hl str">(</span><span class="hl ipl">&#64;autodetected</span><span class="hl str">) {</span>
<span class="hl str">			last LOOP if</span> <span class="hl ipl">$p</span><span class="hl str">-&gt;{port} eq</span> <span class="hl ipl">$q</span><span class="hl str">;</span>
<span class="hl str">		    }</span>
<span class="hl str">		}</span>
<span class="hl str">		my</span> <span class="hl ipl">$menustr</span><span class="hl str">;</span>
<span class="hl str">		if (</span><span class="hl ipl">$q</span> <span class="hl str">=~ m!^/dev/lp(\d+)$!) {</span>
<span class="hl str">                    my</span> <span class="hl ipl">$port</span> <span class="hl str">=</span> <span class="hl ipl">$1</span><span class="hl str">;</span>
<span class="hl str"></span>		    <span class="hl ipl">$menustr</span> <span class="hl str">= N(&quot;</span>Printer on parallel port <span class="hl slc">#%s&quot;, $port);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$q</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^/dev/usb/lp(\d+)$!</span><span class="hl opt">) {</span>
                    <span class="hl kwc">my</span> <span class="hl kwb">$printer</span><span class="hl opt">;</span>
		    <span class="hl kwb">$menustr</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;USB printer #</span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$printer</span><span class="hl opt">);</span>
		<span class="hl opt">}</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> <span class="hl str">&quot; (</span><span class="hl ipl">$q</span><span class="hl str">)&quot;</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">};</span>
		<span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl kwb">$q</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># We are ready with auto-detection, so we restart HPOJ here. If it </span>
	<span class="hl slc"># is not installed or not configured, this command has no effect.</span>
	printer<span class="hl opt">::</span>services<span class="hl opt">::</span>start<span class="hl opt">(</span><span class="hl str">&quot;hpoj&quot;</span><span class="hl opt">);</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl slc"># Always ask for queue name in recommended mode when no auto-</span>
	<span class="hl slc"># detection was done</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MORETHANONE<span class="hl opt">} =</span> <span class="hl kwb">$#autodetected</span> <span class="hl opt">&gt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$m</span><span class="hl opt">;</span>
	<span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwb">$m</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$m</span> <span class="hl opt">&lt;=</span> <span class="hl num">2</span><span class="hl opt">;</span> <span class="hl kwb">$m++</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$menustr</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer on parallel port #</span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$m</span><span class="hl opt">);</span>
	    <span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> <span class="hl str">&quot; (/dev/lp</span><span class="hl ipl">$m</span><span class="hl str">)&quot;</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">};</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl str">&quot;/dev/lp</span><span class="hl ipl">$m</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwb">$menustr</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;USB printer #</span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$m</span><span class="hl opt">);</span>
	    <span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> <span class="hl str">&quot; (/dev/usb/lp</span><span class="hl ipl">$m</span><span class="hl str">)&quot;</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">};</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl str">&quot;/dev/usb/lp</span><span class="hl ipl">$m</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;menuentrieslist</span> <span class="hl opt">=</span> <span class="hl kwc">sort</span> <span class="hl opt">{</span> 
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;prefixes</span> <span class="hl opt">= (</span><span class="hl str">&quot;/dev/lp&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;/dev/usb/lp&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;/dev/&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;socket:&quot;</span><span class="hl opt">,</span> 
			<span class="hl str">&quot;smb:&quot;</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$first</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$a</span><span class="hl opt">};</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$second</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$b</span><span class="hl opt">};</span>
	<span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$i</span> <span class="hl opt">&lt;=</span> <span class="hl kwb">$#prefixes</span><span class="hl opt">;</span> <span class="hl kwb">$i++</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$firstinlist</span> <span class="hl opt">=</span> <span class="hl kwb">$first</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^$prefixes[$i]!</span><span class="hl opt">;</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$secondinlist</span> <span class="hl opt">=</span> <span class="hl kwb">$second</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^$prefixes[$i]!</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$firstinlist</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$secondinlist</span><span class="hl opt">) {</span> <span class="hl kwa">return</span> <span class="hl opt">-</span><span class="hl num">1</span> <span class="hl opt">};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$secondinlist</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$firstinlist</span><span class="hl opt">) {</span> <span class="hl kwa">return</span> <span class="hl num">1</span> <span class="hl opt">};</span>
	<span class="hl opt">}</span>
	<span class="hl kwa">return</span> <span class="hl kwb">$first</span> <span class="hl kwc">cmp</span> <span class="hl kwb">$second</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwc">keys</span><span class="hl opt">(</span><span class="hl kwb">%$menuentries</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$device</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$p</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>autodetectionentry_for_uri<span class="hl opt">(</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span> <span class="hl kwb">&#64;autodetected</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">)) {</span>
	    <span class="hl kwb">$device</span> <span class="hl opt">=</span> <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">};</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl opt">= {</span> <span class="hl kwc">reverse</span> <span class="hl kwb">%$menuentries</span> <span class="hl opt">}-&gt;{</span><span class="hl kwb">$device</span><span class="hl opt">};</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">&#64;menuentrieslist</span> <span class="hl opt">&gt; -</span><span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentrieslist</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">];</span>
	<span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
	<span class="hl kwb">$device</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuchoice</span><span class="hl opt">}</span> <span class="hl kwa">if</span> <span class="hl kwb">$device</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) {</span>
<span class="hl slc">#	$printer-&gt;{expert} or $in-&gt;set_help(&apos;configurePrinterDev&apos;) if $::isInstall;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$#menuentrieslist</span> <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">) {</span> <span class="hl slc"># No menu entry</span>
	    <span class="hl slc"># auto-detection has failed, we must do all manually</span>
	    <span class="hl kwb">$do_auto_detect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}) {</span>
		<span class="hl kwb">$device</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entry</span><span class="hl opt">(</span>
		     N<span class="hl opt">(</span><span class="hl str">&quot;Local Printer&quot;</span><span class="hl opt">),</span>
		     N<span class="hl opt">(</span><span class="hl str">&quot;No local printer found! To manually install a printer enter a device name/file name in the input line (Parallel Ports: /dev/lp0, /dev/lp1, ..., equivalent to LPT1:, LPT2:, ..., 1st USB printer: /dev/usb/lp0, 2nd USB printer: /dev/usb/lp1, ...).&quot;</span><span class="hl opt">),</span>
		     <span class="hl opt">{</span> 
			 complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
				 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;You must enter a device or file name!&quot;</span><span class="hl opt">));</span>
				 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
			     <span class="hl opt">}</span>
			     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
			 <span class="hl opt">}</span>
		     <span class="hl opt">});</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl kwb">$device</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer auto-detection&quot;</span><span class="hl opt">),</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;No printer found!&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$manualconf</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl kwb">$manualconf</span> <span class="hl opt">=</span> <span class="hl num">1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} || !</span><span class="hl kwb">$do_auto_detect</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
		 <span class="hl opt">{</span> title <span class="hl opt">=&gt; (</span><span class="hl kwb">$expert_or_modify</span> ?
			     N<span class="hl opt">(</span><span class="hl str">&quot;Local Printers&quot;</span><span class="hl opt">) :</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Available printers&quot;</span><span class="hl opt">)),</span>
		   messages <span class="hl opt">=&gt; ((</span><span class="hl kwb">$do_auto_detect</span> ?
				 <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> ?
				  <span class="hl opt">(</span><span class="hl kwb">&#64;menuentrieslist</span> <span class="hl opt">==</span> <span class="hl num">1</span> ?
				   <span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;The following printer was auto-detected. &quot;</span><span class="hl opt">) .</span>
				    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">}</span> ?
				     N<span class="hl opt">(</span><span class="hl str">&quot;If it is not the one you want to configure, enter a device name/file name in the input line&quot;</span><span class="hl opt">) :</span>
				     N<span class="hl opt">(</span><span class="hl str">&quot;Alternatively, you can specify a device name/file name in the input line&quot;</span><span class="hl opt">))) :</span>
				   <span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Here is a list of all auto-detected printers. &quot;</span><span class="hl opt">) .</span>
				    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">}</span> ?
				     N<span class="hl opt">(</span><span class="hl str">&quot;Please choose the printer you want to set up or enter a device name/file name in the input line&quot;</span><span class="hl opt">) :</span>
				     N<span class="hl opt">(</span><span class="hl str">&quot;Please choose the printer to which the print jobs should go or enter a device name/file name in the input line&quot;</span><span class="hl opt">)))) :</span>
				  <span class="hl opt">(</span><span class="hl kwb">&#64;menuentrieslist</span> <span class="hl opt">==</span> <span class="hl num">1</span> ?
				   <span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;The following printer was auto-detected. &quot;</span><span class="hl opt">) .</span>
				    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">}</span> ?
				     N<span class="hl opt">(</span><span class="hl str">&quot;The configuration of the printer will work fully automatically. If your printer was not correctly detected or if you prefer a customized printer configuration, turn on</span> <span class="hl esc">\&quot;</span><span class="hl str">Manual configuration</span><span class="hl esc">\&quot;</span><span class="hl str">.&quot;</span><span class="hl opt">) :</span> 
				     N<span class="hl opt">(</span><span class="hl str">&quot;Currently, no alternative possibility is available&quot;</span><span class="hl opt">))) :</span>
				   <span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Here is a list of all auto-detected printers. &quot;</span><span class="hl opt">) .</span>
				    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">}</span> ?
				     N<span class="hl opt">(</span><span class="hl str">&quot;Please choose the printer you want to set up. The configuration of the printer will work fully automatically. If your printer was not correctly detected or if you prefer a customized printer configuration, turn on</span> <span class="hl esc">\&quot;</span><span class="hl str">Manual configuration</span><span class="hl esc">\&quot;</span><span class="hl str">.&quot;</span><span class="hl opt">) :</span>
				     N<span class="hl opt">(</span><span class="hl str">&quot;Please choose the printer to which the print jobs should go.&quot;</span><span class="hl opt">))))) :</span>
				 <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> ?
				  N<span class="hl opt">(</span><span class="hl str">&quot;Please choose the port that your printer is connected to or enter a device name/file name in the input line&quot;</span><span class="hl opt">) :</span>
				  N<span class="hl opt">(</span><span class="hl str">&quot;Please choose the port that your printer is connected to.&quot;</span><span class="hl opt">))) .</span>
				if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">},</span>
				    N<span class="hl opt">(</span><span class="hl str">&quot; (Parallel Ports: /dev/lp0, /dev/lp1, ..., equivalent to LPT1:, LPT2:, ..., 1st USB printer: /dev/usb/lp0, 2nd USB printer: /dev/usb/lp1, ...).&quot;</span><span class="hl opt">))),</span> 
				  callbacks <span class="hl opt">=&gt; {</span>
				      complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
					  <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
					      <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;You must choose/enter a printer/device!&quot;</span><span class="hl opt">));</span>
					      <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
					  <span class="hl opt">}</span>
					  <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
				      <span class="hl opt">},</span>
				      changed <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
					  <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$oldmenuchoice</span> <span class="hl kwc">ne</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">) {</span>
					      <span class="hl kwb">$device</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuchoice</span><span class="hl opt">};</span>
					      <span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
					  <span class="hl opt">}</span>
					  <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
				      <span class="hl opt">}</span>
				  <span class="hl opt">} },</span>
		 <span class="hl opt">[</span>
		  if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}, {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$device</span> <span class="hl opt">}),</span>
		  <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$menuchoice,</span> list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;menuentrieslist,</span> 
		    not_edit <span class="hl opt">=&gt; !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">},</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span>
		    allow_empty_list <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;list&apos;</span> <span class="hl opt">},</span>
		  if_<span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} &amp;&amp;</span> <span class="hl kwb">$do_auto_detect</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">},</span> 
		   <span class="hl opt">{</span> text <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Manual configuration&quot;</span><span class="hl opt">),</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span>
		     val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$manualconf</span> <span class="hl opt">}),</span>
		  <span class="hl opt">]</span>
		 <span class="hl opt">)) {</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$device</span> <span class="hl kwc">ne</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuchoice</span><span class="hl opt">}) {</span>
		<span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
		<span class="hl kwb">$do_auto_detect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} =</span> <span class="hl kwb">$manualconf</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl slc">#- LPD and LPRng need netcat (&apos;nc&apos;) to access to socket printers</span>
    <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lpd&apos;</span> <span class="hl opt">||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lprng&apos;</span><span class="hl opt">) &amp;&amp;</span>
        <span class="hl opt">!$::</span>testing <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$device</span> <span class="hl opt">=~</span> <span class="hl kwd">/^socket:/</span> <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/nc&apos;</span><span class="hl opt">)) {</span>
        <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;nc&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;nc&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
        <span class="hl opt">};</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Do configuration of multi-function devices and look up model name</span>
    <span class="hl slc"># in the printer database</span>
    setup_common<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $menuchoice, $device, $do_auto_detect,</span>
		  <span class="hl kwb">&#64;autodetected</span><span class="hl opt">);</span>

    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_lpd <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># Check whether the network functionality is configured and</span>
    <span class="hl slc"># running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">)) {</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl opt">};</span>

<span class="hl slc">#    $in-&gt;set_help(&apos;setupLPD&apos;) if $::isInstall;</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$uri, $remotehost, $remotequeue</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m/^lpd:/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$uri</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^\s*lpd://([^/]+)/([^/]+)/?\s*$!</span><span class="hl opt">) {</span>
         <span class="hl kwb">$remotehost</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
         <span class="hl kwb">$remotequeue</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
     <span class="hl opt">}</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$remotehost</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl kwb">$remotequeue</span> <span class="hl opt">=</span> <span class="hl str">&quot;lp&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Remote lpd Printer Options&quot;</span><span class="hl opt">),</span>
N<span class="hl opt">(</span><span class="hl str">&quot;To use a remote lpd printer, you need to supply the hostname of the printer server and the printer name on that server.&quot;</span><span class="hl opt">), [</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote host name&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$remotehost</span> <span class="hl opt">},</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote printer name&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$remotequeue</span> <span class="hl opt">} ],</span>
complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$remotehost</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote host name missing!&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$remotequeue</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote printer name missing!&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>
			      <span class="hl opt">);</span>
    <span class="hl slc">#- make the DeviceURI from user input.</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&quot;lpd://</span><span class="hl ipl">$remotehost/$remotequeue</span><span class="hl str">&quot;</span><span class="hl opt">;</span>

    <span class="hl slc">#- LPD does not support filtered queues to a remote LPD server by itself</span>
    <span class="hl slc">#- It needs an additional program as &quot;rlpr&quot;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lpd&apos;</span> <span class="hl opt">&amp;&amp; !$::</span>testing <span class="hl opt">&amp;&amp;</span>
        <span class="hl opt">!</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/rlpr&apos;</span><span class="hl opt">)) {</span>
        <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;rlpr&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;rlpr&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
        <span class="hl opt">};</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Auto-detect printer model (works if host is an ethernet-connected</span>
    <span class="hl slc"># printer)</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$modelinfo</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getSNMPModel<span class="hl opt">(</span><span class="hl kwb">$remotehost</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$auto_hpoj</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$modelinfo</span><span class="hl opt">) &amp;&amp;</span>
	<span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MANUFACTURER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MODEL<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
        <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Information&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Detected model:</span> <span class="hl ipl">%s</span> <span class="hl str"></span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
                            <span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MANUFACTURER<span class="hl opt">},</span> <span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MODEL<span class="hl opt">}));</span>
        <span class="hl kwb">$auto_hpoj</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$auto_hpoj</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Do configuration of multi-function devices and look up model name</span>
    <span class="hl slc"># in the printer database</span>
    setup_common<span class="hl opt">(</span><span class="hl kwb">$printer, $in,</span>
		  <span class="hl str">&quot;</span><span class="hl ipl">$modelinfo</span><span class="hl str">-&gt;{MANUFACTURER}</span> <span class="hl ipl">$modelinfo</span><span class="hl str">-&gt;{MODEL}&quot;</span><span class="hl opt">,</span> 
		  <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span> <span class="hl kwb">$auto_hpoj,</span>
                  <span class="hl opt">({</span>port <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span>
                    val <span class="hl opt">=&gt;</span> <span class="hl kwb">$modelinfo</span> <span class="hl opt">}));</span>

    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_smb <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># Check whether the network functionality is configured and</span>
    <span class="hl slc"># running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">)) {</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl opt">};</span>

<span class="hl slc">#    $in-&gt;set_help(&apos;setupSMB&apos;) if $::isInstall;</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$uri, $smbuser, $smbpassword, $workgroup, $smbserver, $smbserverip, $smbshare</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m/^smb:/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$uri</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$parameters</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl kwa">if</span> <span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^\s*smb://(.*)$!</span><span class="hl opt">;</span>
	<span class="hl slc"># Get the user&apos;s login and password from the URI</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$parameters</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^&#64;]*)&#64;([^&#64;]+)!</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$login</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$parameters</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$login</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^:]*):([^:]*)!</span><span class="hl opt">) {</span>
		<span class="hl kwb">$smbuser</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
		<span class="hl kwb">$smbpassword</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$smbuser</span> <span class="hl opt">=</span> <span class="hl kwb">$login</span><span class="hl opt">;</span>
		<span class="hl kwb">$smbpassword</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$smbuser</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwb">$smbpassword</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Get the workgroup, server, and share name</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$parameters</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^/]*)/([^/]+)/([^/]+)$!</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$workgroup</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$smbserver</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	    <span class="hl kwb">$smbshare</span> <span class="hl opt">=</span> <span class="hl kwb">$3</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$parameters</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^/]+)/([^/]+)$!</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$workgroup</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwb">$smbserver</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$smbshare</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwc">die</span> <span class="hl str">qq(The &quot;smb://&quot; URI must at least contain the server name and the share name!</span><span class="hl esc">\n</span><span class="hl str">)</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>is_ip<span class="hl opt">(</span><span class="hl kwb">$smbserver</span><span class="hl opt">)) {</span>
	    <span class="hl kwb">$smbserverip</span> <span class="hl opt">=</span> <span class="hl kwb">$smbserver</span><span class="hl opt">;</span>
	    <span class="hl kwb">$smbserver</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;autodetected</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$menuentries</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;menuentrieslist</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">}) {</span>
	<span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/smbclient&apos;</span><span class="hl opt">)) {</span>
	    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;samba-client&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
				<span class="hl str">&quot;Samba client&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl opt">};</span>
	<span class="hl opt">}</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer auto-detection&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Scanning network...&quot;</span><span class="hl opt">));</span>
	<span class="hl kwb">&#64;autodetected</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>net_smb_detect<span class="hl opt">();</span>
     <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$server, $share</span><span class="hl opt">);</span>
	<span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$p</span> <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^smb://([^/:]+)/([^/:]+)$!</span><span class="hl opt">) {</span>
             <span class="hl kwb">$server</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
             <span class="hl kwb">$share</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
         <span class="hl opt">}</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">}) {</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">=</span> <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">};</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;, printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> on server <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
			      <span class="hl kwb">$share, $server</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> on server <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
			     <span class="hl kwb">$share, $server</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$server</span> <span class="hl kwc">eq</span> <span class="hl kwb">$smbserver</span> <span class="hl opt">&amp;&amp;</span>
		<span class="hl kwb">$share</span> <span class="hl kwc">eq</span> <span class="hl kwb">$smbshare</span><span class="hl opt">) {</span>
		<span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">&#64;menuentrieslist</span> <span class="hl opt">=</span> <span class="hl kwc">sort</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$a</span><span class="hl opt">}</span> <span class="hl kwc">cmp</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$b</span><span class="hl opt">};</span>
	<span class="hl opt">}</span> <span class="hl kwc">keys</span><span class="hl opt">(</span><span class="hl kwb">%$menuentries</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m/^smb:/</span> <span class="hl opt">&amp;&amp;</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>make<span class="hl opt">}) {</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{make}</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{model}&quot;</span><span class="hl opt">;</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;, printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> on server <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
			      <span class="hl kwb">$smbshare, $smbserver</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> on server <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
			     <span class="hl kwb">$smbshare, $smbserver</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl str">&quot;smb://</span><span class="hl ipl">$smbserver/$smbshare</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwc">unshift</span><span class="hl opt">(</span><span class="hl kwb">&#64;menuentrieslist, $menustr</span><span class="hl opt">);</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$#menuentrieslist</span> <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentrieslist</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">];</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuentrieslist</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]} =~</span>
		<span class="hl kwd">m!^smb://([^/:]+)/([^/:]+)$!</span><span class="hl opt">) {</span>
             <span class="hl kwb">$smbserver</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
             <span class="hl kwb">$smbshare</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
         <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from</span><span class="hl opt">(</span>
	 N<span class="hl opt">(</span><span class="hl str">&quot;SMB (Windows 9x/NT) Printer Options&quot;</span><span class="hl opt">),</span>
	 N<span class="hl opt">(</span><span class="hl str">&quot;To print to a SMB printer, you need to provide the SMB host name (Note! It may be different from its TCP/IP hostname!) and possibly the IP address of the print server, as well as the share name for the printer you wish to access and any applicable user name, password, and workgroup information.&quot;</span><span class="hl opt">) .</span>
	 <span class="hl opt">(</span><span class="hl kwb">$autodetect</span> ? N<span class="hl opt">(</span><span class="hl str">&quot; If the desired printer was auto-detected, simply choose it from the list and then add user name, password, and/or workgroup if needed.&quot;</span><span class="hl opt">) :</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">),</span>
	 <span class="hl opt">[</span> 
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;SMB server host&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$smbserver</span> <span class="hl opt">},</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;SMB server IP&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$smbserverip</span> <span class="hl opt">},</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Share name&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$smbshare</span> <span class="hl opt">},</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;User name&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$smbuser</span> <span class="hl opt">},</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Password&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$smbpassword,</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Workgroup&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$workgroup</span> <span class="hl opt">},</span>
	  if_<span class="hl opt">(</span><span class="hl kwb">$autodetect,</span>
	   <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Auto-detected&quot;</span><span class="hl opt">),</span>
	     val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$menuchoice,</span> list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;menuentrieslist,</span> 
	     not_edit <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span> <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
	     allow_empty_list <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;combo&apos;</span> <span class="hl opt">}) ],</span>
	 complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	     <span class="hl kwa">if</span> <span class="hl opt">(!</span>is_ip<span class="hl opt">(</span><span class="hl kwb">$smbserverip</span><span class="hl opt">) &amp;&amp;</span> <span class="hl kwb">$smbserverip</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
		 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;IP address should be in format 1.2.3.4&quot;</span><span class="hl opt">));</span>
		 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
	     <span class="hl opt">}</span>
	     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$smbserver</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$smbserverip</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
		 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Either the server name or the server&apos;s IP must be given!&quot;</span><span class="hl opt">));</span>
		 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
	     <span class="hl opt">}</span>
	     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$smbshare</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
		 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Samba share name missing!&quot;</span><span class="hl opt">));</span>
		 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">;</span>
	     <span class="hl opt">}</span>
	     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$smbpassword</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
		 <span class="hl kwc">local</span> <span class="hl opt">$::</span>isWizard <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
		 <span class="hl kwc">my</span> <span class="hl kwb">$yes</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span>
		      N<span class="hl opt">(</span><span class="hl str">&quot;SECURITY WARNING!&quot;</span><span class="hl opt">),</span>
		      N<span class="hl opt">(</span><span class="hl str">&quot;You are about to set up printing to a Windows account with password. Due to a fault in the architecture of the Samba client software the password is put in clear text into the command line of the Samba client used to transmit the print job to the Windows server. So it is possible for every user on this machine to display the password on the screen by issuing commands as</span> <span class="hl esc">\&quot;</span><span class="hl str">ps auxwww</span><span class="hl esc">\&quot;</span><span class="hl str">.</span>
<span class="hl str"></span>
<span class="hl str">We recommend to make use of one of the following alternatives (in all cases you have to make sure that only machines from your local network have access to your Windows server, for example by means of a firewall):</span>
<span class="hl str"></span>
<span class="hl str">Use a password-less account on your Windows server, as the</span> <span class="hl esc">\&quot;</span><span class="hl str">GUEST</span><span class="hl esc">\&quot;</span> <span class="hl str">account or a special account dedicated for printing. Do not remove the password protection from a personal account or the administrator account.</span>
<span class="hl str"></span>
<span class="hl str">Set up your Windows server to make the printer available under the LPD protocol. Then set up printing from this machine with the</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> connection type <span class="hl kwa">in</span> Printerdrake<span class="hl opt">.</span>

<span class="hl str">&quot;, N(&quot;</span>Printer on remote lpd server<span class="hl str">&quot;)) .</span>
<span class="hl str">		      (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert} ? </span>
<span class="hl str">		       N(&quot;</span>Set up your Windows server to make the printer available under the IPP protocol <span class="hl kwc">and</span> set up printing from this machine with the <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; connection type in Printerdrake.</span>
<span class="hl str"></span>
<span class="hl str">&quot;</span><span class="hl opt">,</span> N<span class="hl opt">(</span><span class="hl str">&quot;Enter a printer device URI&quot;</span><span class="hl opt">)) :</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) .</span>
N<span class="hl opt">(</span><span class="hl str">&quot;Connect your printer to a Linux server and let your Windows machine(s) connect to it as a client.</span>
<span class="hl str"></span>
<span class="hl str">Do you really want to continue setting up this printer as you are doing now?&quot;</span><span class="hl opt">),</span> <span class="hl num">0</span><span class="hl opt">);</span>
		 <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl kwb">$yes</span><span class="hl opt">;</span>
		 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">;</span>
	     <span class="hl opt">}</span>
	     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	 <span class="hl opt">},</span>
	 changed <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	     <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$autodetect</span><span class="hl opt">;</span>
	     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$oldmenuchoice</span> <span class="hl kwc">ne</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">) {</span>
		 <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuchoice</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^smb://([^/:]+)/([^/:]+)$!</span><span class="hl opt">) {</span>
               <span class="hl kwb">$smbserver</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
               <span class="hl kwb">$smbshare</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
           <span class="hl opt">}</span>
		 <span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
	     <span class="hl opt">}</span>
	     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	 <span class="hl opt">}</span>
	 <span class="hl opt">);</span>
    <span class="hl slc">#- make the DeviceURI from, try to probe for available variable to</span>
    <span class="hl slc">#- build a suitable URI.</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span>
    <span class="hl kwc">join</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">, (</span><span class="hl str">&quot;smb://&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$smbuser</span> <span class="hl opt">&amp;&amp; (</span><span class="hl kwb">$smbuser</span> <span class="hl opt">.</span> 
    <span class="hl opt">(</span><span class="hl kwb">$smbpassword</span> <span class="hl opt">&amp;&amp;</span> <span class="hl str">&quot;:</span><span class="hl ipl">$smbpassword</span><span class="hl str">&quot;</span><span class="hl opt">) .</span> <span class="hl str">&apos;&#64;&apos;</span><span class="hl opt">)), (</span><span class="hl kwb">$workgroup</span> <span class="hl opt">&amp;&amp;</span> <span class="hl str">&quot;</span><span class="hl ipl">$workgroup/</span><span class="hl str">&quot;</span><span class="hl opt">),</span>
    <span class="hl opt">(</span><span class="hl kwb">$smbserver</span> <span class="hl opt">||</span> <span class="hl kwb">$smbserverip</span><span class="hl opt">),</span> <span class="hl str">&quot;/</span><span class="hl ipl">$smbshare</span><span class="hl str">&quot;</span><span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/smbclient&apos;</span><span class="hl opt">)) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;samba-client&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;Samba client&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
        <span class="hl opt">};</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span> <span class="hl kwc">and</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>restart_queue<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_ncp <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># Check whether the network functionality is configured and</span>
    <span class="hl slc"># running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">)) {</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl opt">};</span>

<span class="hl slc">#    $in-&gt;set_help(&apos;setupNCP&apos;) if $::isInstall;</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$uri, $ncpuser, $ncppassword, $ncpserver, $ncpqueue</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m/^ncp:/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$uri</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$parameters</span> <span class="hl opt">=</span> <span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^\s*ncp://(.*)$!</span><span class="hl opt">;</span>
	<span class="hl slc"># Get the user&apos;s login and password from the URI</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$parameters</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^&#64;]*)&#64;([^&#64;]+)!</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$login</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$parameters</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$login</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^:]*):([^:]*)!</span><span class="hl opt">) {</span>
		<span class="hl kwb">$ncpuser</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
		<span class="hl kwb">$ncppassword</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$ncpuser</span> <span class="hl opt">=</span> <span class="hl kwb">$login</span><span class="hl opt">;</span>
		<span class="hl kwb">$ncppassword</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$ncpuser</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwb">$ncppassword</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Get the workgroup, server, and share name</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$parameters</span> <span class="hl opt">=~</span> <span class="hl kwd">m!([^/]+)/([^/]+)$!</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$ncpserver</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$ncpqueue</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwc">die</span> <span class="hl str">qq(The &quot;ncp://&quot; URI must at least contain the server name and the share name!</span><span class="hl esc">\n</span><span class="hl str">)</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;NetWare Printer Options&quot;</span><span class="hl opt">),</span>
N<span class="hl opt">(</span><span class="hl str">&quot;To print on a NetWare printer, you need to provide the NetWare print server name (Note! it may be different from its TCP/IP hostname!) as well as the print queue name for the printer you wish to access and any applicable user name and password.&quot;</span><span class="hl opt">), [</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer Server&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$ncpserver</span> <span class="hl opt">},</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Print Queue Name&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$ncpqueue</span> <span class="hl opt">},</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;User name&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$ncpuser</span> <span class="hl opt">},</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Password&quot;</span><span class="hl opt">),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$ncppassword,</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">} ],</span>
complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$ncpserver</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;NCP server name missing!&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$ncpqueue</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;NCP queue name missing!&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>
					<span class="hl opt">);</span>
    <span class="hl slc"># Generate the Foomatic URI</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span>
    <span class="hl kwc">join</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">, (</span><span class="hl str">&quot;ncp://&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$ncpuser</span> <span class="hl opt">&amp;&amp; (</span><span class="hl kwb">$ncpuser</span> <span class="hl opt">.</span> 
    <span class="hl opt">(</span><span class="hl kwb">$ncppassword</span> <span class="hl opt">&amp;&amp;</span> <span class="hl str">&quot;:</span><span class="hl ipl">$ncppassword</span><span class="hl str">&quot;</span><span class="hl opt">) .</span> <span class="hl str">&apos;&#64;&apos;</span><span class="hl opt">)),</span>
    <span class="hl str">&quot;</span><span class="hl ipl">$ncpserver/$ncpqueue</span><span class="hl str">&quot;</span><span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/nprint&apos;</span><span class="hl opt">)) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;ncpfs&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;ncpfs&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
        <span class="hl opt">};</span>
    <span class="hl opt">}</span> 
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_socket <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># Check whether the network functionality is configured and</span>
    <span class="hl slc"># running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">)) {</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl opt">};</span>

<span class="hl slc">#    $in-&gt;set_help(&apos;setupSocket&apos;) if $::isInstall;</span>

    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$uri, $remotehost, $remoteport</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span>  <span class="hl kwd">m!^(socket:|ptal://?hpjd:)!</span><span class="hl opt">) {</span>
	<span class="hl kwb">$uri</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^ptal:!</span><span class="hl opt">) {</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^ptal://?hpjd:([^/:]+):([0-9]+)/?\s*$!</span><span class="hl opt">) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$ptalport</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span> <span class="hl opt">-</span> <span class="hl num">9100</span><span class="hl opt">;</span>
		<span class="hl opt">(</span><span class="hl kwb">$remotehost, $remoteport</span><span class="hl opt">) = (</span><span class="hl kwb">$1, $ptalport</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^ptal://?hpjd:([^/:]+)\s*$!</span><span class="hl opt">) {</span>
		<span class="hl opt">(</span><span class="hl kwb">$remotehost, $remoteport</span><span class="hl opt">) = (</span><span class="hl kwb">$1,</span> <span class="hl num">9100</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl opt">(</span><span class="hl kwb">$remotehost, $remoteport</span><span class="hl opt">) =</span>
		<span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^\s*socket://([^/:]+):([0-9]+)/?\s*$!</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$remotehost</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl kwb">$remoteport</span> <span class="hl opt">=</span> <span class="hl str">&quot;9100&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;autodetected</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$menuentries</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;menuentrieslist</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">}) {</span>
	<span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer auto-detection&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Scanning network...&quot;</span><span class="hl opt">));</span>
	<span class="hl kwb">&#64;autodetected</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>net_detect<span class="hl opt">();</span>
     <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$host, $port</span><span class="hl opt">);</span>
	<span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$p</span> <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">} =~</span> <span class="hl kwd">m!^socket://([^:]+):(\d+)$!</span><span class="hl opt">) {</span>
             <span class="hl kwb">$host</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
             <span class="hl kwb">$port</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
         <span class="hl opt">}</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">}) {</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">=</span> <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">};</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;, host</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">,</span> port <span class="hl kwb">%s</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>			      <span class="hl ipl">$host,</span> <span class="hl str"></span><span class="hl ipl">$port</span><span class="hl str">);</span>
<span class="hl str">	    } else {</span>
<span class="hl str"></span>		<span class="hl ipl">$menustr</span> <span class="hl str">= N(&quot;</span>Host <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;, port</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$host, $port</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl kwb">$p</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$host</span> <span class="hl kwc">eq</span> <span class="hl kwb">$remotehost</span> <span class="hl opt">&amp;&amp;</span>
		<span class="hl kwb">$host</span> <span class="hl kwc">eq</span> <span class="hl kwb">$remotehost</span><span class="hl opt">) {</span>
		<span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">&#64;menuentrieslist</span> <span class="hl opt">=</span> <span class="hl kwc">sort</span> <span class="hl opt">{</span> 
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$a</span><span class="hl opt">}</span> <span class="hl kwc">cmp</span> <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$b</span><span class="hl opt">};</span>
	<span class="hl opt">}</span> <span class="hl kwc">keys</span><span class="hl opt">(</span><span class="hl kwb">%$menuentries</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^(socket:|ptal://?hpjd:)!</span> <span class="hl opt">&amp;&amp;</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>make<span class="hl opt">}) {</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{make}</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{model}&quot;</span><span class="hl opt">;</span>
		<span class="hl kwb">$menustr</span> <span class="hl opt">.=</span> N<span class="hl opt">(</span><span class="hl str">&quot;, host</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">,</span> port <span class="hl kwb">%s</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>			      <span class="hl ipl">$remotehost,</span> <span class="hl str"></span><span class="hl ipl">$remoteport</span><span class="hl str">);</span>
<span class="hl str">	    } else {</span>
<span class="hl str"></span>		<span class="hl ipl">$menustr</span> <span class="hl str">= N(&quot;</span>Host <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;, port</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
			      <span class="hl kwb">$remotehost, $remoteport</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menustr</span><span class="hl opt">} =</span> <span class="hl str">&quot;socket://</span><span class="hl ipl">$remotehost</span><span class="hl str">:</span><span class="hl ipl">$remoteport</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwc">unshift</span><span class="hl opt">(</span><span class="hl kwb">&#64;menuentrieslist, $menustr</span><span class="hl opt">);</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menustr</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$#menuentrieslist</span> <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$autodetect</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuentrieslist</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">];</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuentrieslist</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]} =~</span> <span class="hl kwd">m!^socket://([^:]+):(\d+)$!</span><span class="hl opt">) {</span>
             <span class="hl kwb">$remotehost</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
             <span class="hl kwb">$remoteport</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
         <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
	 <span class="hl opt">{</span>
	     title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;TCP/Socket Printer Options&quot;</span><span class="hl opt">),</span>
	     messages <span class="hl opt">=&gt; (</span><span class="hl kwb">$autodetect</span> ?
			  N<span class="hl opt">(</span><span class="hl str">&quot;Choose one of the auto-detected printers from the list or enter the hostname or IP and the optional port number (default is 9100) in the input fields.&quot;</span><span class="hl opt">) :</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;To print to a TCP or socket printer, you need to provide the host name or IP of the printer and optionally the port number (default is 9100). On HP JetDirect servers the port number is usually 9100, on other servers it can vary. See the manual of your hardware.&quot;</span><span class="hl opt">)),</span>
		 callbacks <span class="hl opt">=&gt; {</span>
		 complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		     <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$remotehost</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
			 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer host name or IP missing!&quot;</span><span class="hl opt">));</span>
			 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
		     <span class="hl opt">}</span>
		     <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$remoteport</span> <span class="hl opt">=~</span> <span class="hl kwd">/^[0-9]+$/</span><span class="hl opt">) {</span>
			 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;The port number should be an integer!&quot;</span><span class="hl opt">));</span>
			 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
		     <span class="hl opt">}</span>
		     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		 <span class="hl opt">},</span>
		 changed <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		     <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$autodetect</span><span class="hl opt">;</span>
		     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$oldmenuchoice</span> <span class="hl kwc">ne</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">) {</span>
                   <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuentries</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$menuchoice</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^socket://([^:]+):(\d+)$!</span><span class="hl opt">) {</span>
                       <span class="hl kwb">$remotehost</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
                       <span class="hl kwb">$remoteport</span> <span class="hl opt">=</span> <span class="hl kwb">$2</span><span class="hl opt">;</span>
                   <span class="hl opt">}</span>
                   <span class="hl kwb">$oldmenuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
		     <span class="hl opt">}</span>
		     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		 <span class="hl opt">}</span>
	     <span class="hl opt">}</span>
	 <span class="hl opt">},</span>
	 <span class="hl opt">[</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt; (</span><span class="hl kwb">$autodetect</span> ? <span class="hl str">&quot;&quot;</span> <span class="hl opt">:</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer host name or IP&quot;</span><span class="hl opt">)),</span>
	    val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$remotehost</span> <span class="hl opt">},</span>
	  <span class="hl opt">{</span> label <span class="hl opt">=&gt; (</span><span class="hl kwb">$autodetect</span> ? <span class="hl str">&quot;&quot;</span> <span class="hl opt">:</span> N<span class="hl opt">(</span><span class="hl str">&quot;Port&quot;</span><span class="hl opt">)),</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$remoteport</span> <span class="hl opt">},</span>
	  if_<span class="hl opt">(</span><span class="hl kwb">$autodetect,</span>
	   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$menuchoice,</span> list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;menuentrieslist,</span> 
	     not_edit <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span> <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
	     allow_empty_list <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;list&apos;</span> <span class="hl opt">})</span>
	  <span class="hl opt">]</span>
	 <span class="hl opt">);</span>
    
    <span class="hl slc">#- make the Foomatic URI</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> 
	<span class="hl kwc">join</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">, (</span><span class="hl str">&quot;socket://</span><span class="hl ipl">$remotehost</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$remoteport</span> ? <span class="hl str">&quot;:</span><span class="hl ipl">$remoteport</span><span class="hl str">&quot;</span> <span class="hl opt">: ());</span>

    <span class="hl slc">#- LPD and LPRng need netcat (&apos;nc&apos;) to access to socket printers</span>
    <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lpd&apos;</span> <span class="hl opt">||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lprng&apos;</span><span class="hl opt">) &amp;&amp;</span> 
        <span class="hl opt">!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/nc&apos;</span><span class="hl opt">)) {</span>
        <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;nc&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;nc&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Auto-detect printer model</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$modelinfo</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">}) {</span>
	<span class="hl kwb">$modelinfo</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getSNMPModel<span class="hl opt">(</span><span class="hl kwb">$remotehost</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$auto_hpoj</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$modelinfo</span><span class="hl opt">) &amp;&amp;</span>
	<span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MANUFACTURER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MODEL<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
        <span class="hl kwb">$auto_hpoj</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$auto_hpoj</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Do configuration of multi-function devices and look up model name</span>
    <span class="hl slc"># in the printer database</span>
    setup_common<span class="hl opt">(</span><span class="hl kwb">$printer, $in,</span>
		  <span class="hl str">&quot;</span><span class="hl ipl">$modelinfo</span><span class="hl str">-&gt;{MANUFACTURER}</span> <span class="hl ipl">$modelinfo</span><span class="hl str">-&gt;{MODEL}&quot;</span><span class="hl opt">,</span> 
		  <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span> <span class="hl kwb">$auto_hpoj,</span>
                  <span class="hl opt">({</span>port <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span>
                    val <span class="hl opt">=&gt;</span> <span class="hl kwb">$modelinfo</span> <span class="hl opt">}));</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_uri <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

<span class="hl slc">#    $in-&gt;set_help(&apos;setupURI&apos;) if $::isInstall;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">} &amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span> 
				   N<span class="hl opt">(</span><span class="hl str">&quot;Refreshing Device URI list...&quot;</span><span class="hl opt">));</span>
	printer<span class="hl opt">::</span>services<span class="hl opt">::</span>restart<span class="hl opt">(</span><span class="hl str">&quot;cups&quot;</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer Device URI&quot;</span><span class="hl opt">),</span>
N<span class="hl opt">(</span><span class="hl str">&quot;You can specify directly the URI to access the printer. The URI must fulfill either the CUPS or the Foomatic specifications. Note that not all URI types are supported by all the spoolers.&quot;</span><span class="hl opt">), [</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer Device URI&quot;</span><span class="hl opt">),</span>
val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span>
list <span class="hl opt">=&gt; [</span> if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span>
	      <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">}),</span>
	  <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span> ?
	   printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>lpinfo_v<span class="hl opt">() :</span>
	   <span class="hl opt">(</span><span class="hl str">&quot;parallel:/&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;usb:/&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;serial:/&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;http://&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;ipp://&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;lpd://&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;smb://&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;ncp://&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;socket://&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;ptal:/mlc:&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;ptal:/hpjd:&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&quot;file:/&quot;</span><span class="hl opt">,</span>
	    <span class="hl str">&apos;postpipe:&quot;&quot;&apos;</span><span class="hl opt">)),</span>
	  <span class="hl opt">],</span> not_edit <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span> <span class="hl opt">}, ],</span>
complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/[^:]+:.+/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;A valid URI must be entered!&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>
    <span class="hl opt">);</span>

    <span class="hl slc"># Non-local printer, check network and abort if no network available</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} !~</span> <span class="hl kwd">m!^(file|parallel|usb|serial|mtink|ptal://?mlc):/!</span> <span class="hl opt">&amp;&amp;</span>
        <span class="hl opt">!</span>check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">0</span><span class="hl opt">)) {</span> 
        <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl slc"># If the chosen protocol needs additional software, install it.</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/^lpd:/</span> <span class="hl opt">&amp;&amp;</span>
        <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lpd&apos;</span> <span class="hl opt">&amp;&amp;</span>
        <span class="hl opt">!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/rlpr&apos;</span><span class="hl opt">)) {</span>
	<span class="hl slc"># LPD does not support filtered queues to a remote LPD server by itself</span>
	<span class="hl slc"># It needs an additional program as &quot;rlpr&quot;</span>
        <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;rlpr&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;rlpr&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
            <span class="hl opt">};</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/^smb:/</span> <span class="hl opt">&amp;&amp;</span>
        <span class="hl opt">!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/smbclient&apos;</span><span class="hl opt">)) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;samba-client&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;Samba client&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
            <span class="hl opt">};</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/^ncp:/</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl opt">!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/nprint&apos;</span><span class="hl opt">)) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;ncpfs&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;ncpfs&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
            <span class="hl opt">};</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/^socket:/</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl slc">#- LPD and LPRng need netcat (&apos;nc&apos;) to access to socket printers</span>
	<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lpd&apos;</span> <span class="hl opt">||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lprng&apos;</span><span class="hl opt">) &amp;&amp;</span>
        <span class="hl opt">!$::</span>testing <span class="hl opt">&amp;&amp; !</span>files_exist<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/nc&apos;</span><span class="hl opt">)) {</span>
        <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;nc&apos;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
		  <span class="hl str">&quot;nc&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
		N<span class="hl opt">(</span><span class="hl str">&quot;Aborting&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
            <span class="hl opt">};</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^socket://([^:/]+)!</span> <span class="hl opt">||</span>
        <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^lpd://([^:/]+)!</span> <span class="hl opt">||</span>
        <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^http://([^:/]+)!</span> <span class="hl opt">||</span>
        <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^ipp://([^:/]+)!</span><span class="hl opt">) {</span>
	
	<span class="hl slc"># Auto-detect printer model (works if host is an ethernet-connected</span>
	<span class="hl slc"># printer)</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$remotehost</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$modelinfo</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getSNMPModel<span class="hl opt">(</span><span class="hl kwb">$remotehost</span><span class="hl opt">);</span>
        <span class="hl kwc">my</span> <span class="hl kwb">$auto_hpoj</span><span class="hl opt">;</span>
        <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$modelinfo</span><span class="hl opt">) &amp;&amp;</span>
            <span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MANUFACTURER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">&amp;&amp;</span>
	    <span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MODEL<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
            <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Information&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Detected model:</span> <span class="hl ipl">%s</span> <span class="hl str"></span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
                                <span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MANUFACTURER<span class="hl opt">},</span>
				<span class="hl kwb">$modelinfo</span><span class="hl opt">-&gt;{</span>MODEL<span class="hl opt">}));</span>
            <span class="hl kwb">$auto_hpoj</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
        <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$auto_hpoj</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
        <span class="hl opt">}</span>

        <span class="hl slc"># Do configuration of multi-function devices and look up model name</span>
        <span class="hl slc"># in the printer database</span>
        setup_common<span class="hl opt">(</span><span class="hl kwb">$printer, $in,</span>
		      <span class="hl str">&quot;</span><span class="hl ipl">$modelinfo</span><span class="hl str">-&gt;{MANUFACTURER}</span> <span class="hl ipl">$modelinfo</span><span class="hl str">-&gt;{MODEL}&quot;</span><span class="hl opt">,</span> 
		      <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span> <span class="hl kwb">$auto_hpoj,</span>
                      <span class="hl opt">({</span>port <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">},</span>
                        val <span class="hl opt">=&gt;</span> <span class="hl kwb">$modelinfo</span> <span class="hl opt">}));</span>
    <span class="hl opt">}</span>

    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_postpipe <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

<span class="hl slc">#    $in-&gt;set_help(&apos;setupPostpipe&apos;) if $::isInstall;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$uri</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$commandline</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m/^postpipe:/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$uri</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl kwb">$commandline</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl kwa">if</span> <span class="hl kwb">$uri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^\s*postpipe:&quot;(.*)&quot;$!</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$commandline</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Pipe into command&quot;</span><span class="hl opt">),</span>
N<span class="hl opt">(</span><span class="hl str">&quot;Here you can specify any arbitrary command line into which the job should be piped instead of being sent directly to a printer.&quot;</span><span class="hl opt">), [</span>
<span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Command line&quot;</span><span class="hl opt">),</span>
val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$commandline</span> <span class="hl opt">}, ],</span>
complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$commandline</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;A command line must be entered!&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl opt">);</span>

    <span class="hl slc">#- make the Foomatic URI</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&quot;postpipe:</span><span class="hl ipl">$commandline</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
    
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_common <span class="hl opt">{</span>

    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $makemodel, $device, $do_auto_detect, &#64;autodetected</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc">#- Check whether the printer is an HP multi-function device and </span>
    <span class="hl slc">#- configure HPOJ if it is one</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$ptaldevice</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$isHPOJ</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$device</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^/dev/!</span> <span class="hl opt">||</span> <span class="hl kwb">$device</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^socket://!</span><span class="hl opt">) {</span>
	<span class="hl slc"># Ask user whether he has a multi-function device when he did not</span>
	<span class="hl slc"># do auto-detection or when auto-detection failed</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$searchunknown</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Unknown model&quot;</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$do_auto_detect</span> <span class="hl opt">||</span>
	    <span class="hl kwb">$makemodel</span> <span class="hl kwc">eq</span> <span class="hl kwb">$searchunknown</span> <span class="hl opt">||</span>
	    <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*$/</span><span class="hl opt">) {</span>
	    <span class="hl kwc">local</span> <span class="hl opt">$::</span>isWizard <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">}) {</span>
		<span class="hl kwb">$isHPOJ</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Add a new printer&quot;</span><span class="hl opt">),</span>
					   N<span class="hl opt">(</span><span class="hl str">&quot;Is your printer a multi-function device from HP or Sony (OfficeJet, PSC, LaserJet 1100/1200/1220/3200/3300 with scanner, DeskJet 450, Sony IJP-V100), an HP PhotoSmart or an HP LaserJet 2200?&quot;</span><span class="hl opt">),</span> <span class="hl num">0</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+(OfficeJet|PSC|PhotoSmart|LaserJet\s+(1200|1220|2200|3200|33.0)|(DeskJet|dj)\s*450)/i</span> <span class="hl opt">||</span>
	    <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/Sony\s+IJP[\s\-]+V[\s\-]+100/i</span> <span class="hl opt">||</span>
	    <span class="hl kwb">$isHPOJ</span><span class="hl opt">) {</span>
	    <span class="hl slc"># Install HPOJ package</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$hpojinstallfailed</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp;</span>
		<span class="hl opt">!</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/sbin/ptal-mlcd</span>
<span class="hl str">				/usr/sbin/ptal-init</span>
<span class="hl str">				/usr/bin/xojpanel</span>
<span class="hl str">				/usr/sbin/lsusb)</span><span class="hl opt">)) {</span>
		<span class="hl kwa">if</span> <span class="hl opt">($::</span>noX<span class="hl opt">) {</span>
		    <span class="hl kwb">$hpojinstallfailed</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
					   N<span class="hl opt">(</span><span class="hl str">&quot;Installing HPOJ package...&quot;</span><span class="hl opt">))</span>
			<span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
		    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;hpoj&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;xojpanel&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;usbutils&apos;</span><span class="hl opt">)</span>
			<span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
			    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Warning&quot;</span><span class="hl opt">),</span>
					  N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
					    <span class="hl str">&quot;HPOJ&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
					  N<span class="hl opt">(</span><span class="hl str">&quot;Only printing will be possible on the</span> <span class="hl ipl">%s</span><span class="hl str">.&quot;</span><span class="hl opt">,</span>
					    <span class="hl kwb">$makemodel</span><span class="hl opt">));</span>
			    <span class="hl kwb">$hpojinstallfailed</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
			<span class="hl opt">};</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>
	    <span class="hl slc"># Configure and start HPOJ</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
	    <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
		 N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
		 N<span class="hl opt">(</span><span class="hl str">&quot;Checking device and configuring HPOJ...&quot;</span><span class="hl opt">))</span>
		<span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
	    
	    <span class="hl kwc">eval</span> <span class="hl opt">{</span> <span class="hl kwb">$ptaldevice</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>configure_hpoj
		       <span class="hl opt">(</span><span class="hl kwb">$device, &#64;autodetected</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$hpojinstallfailed</span> <span class="hl opt">};</span>

	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl kwb">$err</span> <span class="hl opt">=</span> <span class="hl kwb">$&#64;</span><span class="hl opt">) {</span>
		<span class="hl kwc">warn</span> <span class="hl str">qq(HPOJ conf failure: &quot;</span><span class="hl ipl">$err</span><span class="hl str">&quot;)</span><span class="hl opt">;</span>
		<span class="hl kwc">log</span><span class="hl opt">::</span>l<span class="hl opt">(</span><span class="hl str">qq(HPOJ conf failure: &quot;</span><span class="hl ipl">$err</span><span class="hl str">&quot;)</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>

	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$ptaldevice</span><span class="hl opt">) {</span>
		<span class="hl slc"># HPOJ has determined the device name, make use of it if we</span>
		<span class="hl slc"># did not know it before</span>
		<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$do_auto_detect</span> <span class="hl opt">||</span>
		    <span class="hl opt">!</span><span class="hl kwb">$makemodel</span> <span class="hl opt">||</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl kwc">eq</span> <span class="hl kwb">$searchunknown</span> <span class="hl opt">||</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*$/</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">=</span> <span class="hl kwb">$ptaldevice</span><span class="hl opt">;</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">s/^.*:([^:]+)$/$1/</span><span class="hl opt">;</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">s/_/ /g</span><span class="hl opt">;</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*IJP/i</span><span class="hl opt">) {</span>
			<span class="hl kwb">$makemodel</span> <span class="hl opt">=</span> <span class="hl str">&quot;Sony</span> <span class="hl ipl">$makemodel</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			<span class="hl kwb">$makemodel</span> <span class="hl opt">=</span> <span class="hl str">&quot;HP</span> <span class="hl ipl">$makemodel</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Configure scanning with SANE on the MF device</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+PhotoSmart/i</span> <span class="hl opt">&amp;&amp;</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+LaserJet\s+2200/i</span> <span class="hl opt">&amp;&amp;</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+(DeskJet|dj)\s*450/i</span><span class="hl opt">) {</span>
		    <span class="hl slc"># Install SANE</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp;</span>
			<span class="hl opt">(!</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/bin/scanimage</span>
<span class="hl str">					/usr/bin/xscanimage</span>
<span class="hl str">					/etc/sane.d/dll.conf</span>
<span class="hl str">					/usr/lib/libsane-hpoj.so.1)</span><span class="hl opt">) ||</span>
			 <span class="hl opt">(!</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/bin/xsane)</span><span class="hl opt">) &amp;&amp;</span>
			  <span class="hl opt">!</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/bin/kooka)</span><span class="hl opt">) &amp;&amp;</span>
			  <span class="hl opt">($::</span>isInstall <span class="hl opt">|| !</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">is_installed</span><span class="hl opt">(</span><span class="hl str">&apos;scanner-gui&apos;</span><span class="hl opt">))))) {</span>
			<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
			<span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Installing SANE packages...&quot;</span><span class="hl opt">))</span>
			    <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
			<span class="hl opt">$::</span>noX
			    <span class="hl kwc">or</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;sane-backends&apos;</span><span class="hl opt">,</span>
						     <span class="hl str">&apos;sane-frontends&apos;</span><span class="hl opt">,</span>
						     <span class="hl opt">($::</span>isInstall ?
						      <span class="hl str">&apos;xsane&apos;</span> <span class="hl opt">:</span> 
						      <span class="hl str">&apos;scanner-gui&apos;</span><span class="hl opt">),</span> 
						     <span class="hl str">&apos;libsane-hpoj1&apos;</span><span class="hl opt">)</span>
			    <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
				<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Warning&quot;</span><span class="hl opt">),</span>
					      N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
						<span class="hl str">&quot;SANE&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
					      N<span class="hl opt">(</span><span class="hl str">&quot;Scanning on the</span> <span class="hl ipl">%s</span> <span class="hl str">will not be possible.&quot;</span><span class="hl opt">,</span>
						<span class="hl kwb">$makemodel</span><span class="hl opt">));</span>
			    <span class="hl opt">};</span>
		    <span class="hl opt">}</span>
		    <span class="hl slc"># Configure the HPOJ SANE backend</span>
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>config_sane<span class="hl opt">();</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Configure photo card access with mtools and MToolsFM</span>
		<span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+PhotoSmart/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+PSC\s*9[05]0/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+PSC\s*135\d/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+PSC\s*21[57]\d/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+PSC\s*22\d\d/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+PSC\s*2[45]\d\d/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+OfficeJet\s+D\s*1[45]5/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+OfficeJet\s+71[34]0/i</span> <span class="hl opt">||</span>
		     <span class="hl kwb">$makemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">/HP\s+(DeskJet|dj)\s*450/i</span><span class="hl opt">) &amp;&amp;</span>
		    <span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+PhotoSmart\s+7150/i</span><span class="hl opt">) {</span>
		    <span class="hl slc"># Install mtools and MToolsFM</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp;</span>
			<span class="hl opt">!</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/bin/mdir</span>
<span class="hl str">						  /usr/bin/mcopy</span>
<span class="hl str">						  /usr/bin/MToolsFM</span>
<span class="hl str">						  )</span><span class="hl opt">)) {</span>
			<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
			<span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Installing mtools packages...&quot;</span><span class="hl opt">))</span>
			    <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
			<span class="hl opt">$::</span>noX
			    <span class="hl kwc">or</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;mtools&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;mtoolsfm&apos;</span><span class="hl opt">)</span>
			    <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
				<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Warning&quot;</span><span class="hl opt">),</span>
					      N<span class="hl opt">(</span><span class="hl str">&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">packages!&quot;</span><span class="hl opt">,</span>
						<span class="hl str">&quot;Mtools&quot;</span><span class="hl opt">) .</span> <span class="hl str">&quot; &quot;</span> <span class="hl opt">.</span>
					      N<span class="hl opt">(</span><span class="hl str">&quot;Photo memory card access on the</span> <span class="hl ipl">%s</span> <span class="hl str">will not be possible.&quot;</span><span class="hl opt">,</span>
						<span class="hl kwb">$makemodel</span><span class="hl opt">));</span>
			    <span class="hl opt">};</span>
		    <span class="hl opt">}</span>
		    <span class="hl slc"># Configure mtools/MToolsFM for photo card access</span>
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>config_photocard<span class="hl opt">();</span>
		<span class="hl opt">}</span>
		
		<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">}) {</span>
		    <span class="hl kwc">my</span> <span class="hl kwb">$text</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
		    <span class="hl slc"># Inform user about how to scan with his MF device</span>
		    <span class="hl kwb">$text</span> <span class="hl opt">=</span> scanner_help<span class="hl opt">(</span><span class="hl kwb">$makemodel,</span> <span class="hl str">&quot;ptal://</span><span class="hl ipl">$ptaldevice</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$text</span><span class="hl opt">) {</span>
			<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Scanning on your HP multi-function device&quot;</span><span class="hl opt">),</span>
			     <span class="hl kwb">$text</span><span class="hl opt">);</span>
		    <span class="hl opt">}</span>
		    <span class="hl slc"># Inform user about how to access photo cards with his </span>
		    <span class="hl slc"># MF device</span>
		    <span class="hl kwb">$text</span> <span class="hl opt">=</span> photocard_help<span class="hl opt">(</span><span class="hl kwb">$makemodel,</span> <span class="hl str">&quot;ptal://</span><span class="hl ipl">$ptaldevice</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$text</span><span class="hl opt">) {</span>
			<span class="hl kwc">undef</span> <span class="hl kwb">$w</span><span class="hl opt">;</span>
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Photo memory card access on your HP multi-function device&quot;</span><span class="hl opt">),</span>
				      <span class="hl kwb">$text</span><span class="hl opt">);</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># make the DeviceURI from $ptaldevice.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&quot;ptal://&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$ptaldevice</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl slc"># make the DeviceURI from $device.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl kwb">$device</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
		 N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
		 N<span class="hl opt">(</span><span class="hl str">&quot;Checking device and configuring HPOJ...&quot;</span><span class="hl opt">))</span>
		<span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">} &amp;&amp; !</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$w</span><span class="hl opt">);</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl slc"># make the DeviceURI from $device.</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl kwb">$device</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl slc"># make the DeviceURI from $device.</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl kwb">$device</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} !~</span> <span class="hl kwd">/:/</span><span class="hl opt">) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/usb/</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span>
		<span class="hl str">&quot;usb:&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">/(serial|tty)/</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span>
		<span class="hl str">&quot;serial:&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> 
		 <span class="hl kwd">/(printers|parallel|parport|lp\d)/</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span>
		<span class="hl str">&quot;parallel:&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span>
		<span class="hl str">&quot;file:&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">};</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl slc">#- if CUPS is the spooler, make sure that CUPS knows the device</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;cups&quot;</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$device</span> <span class="hl opt">!~</span> <span class="hl kwd">/^lpd:/</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$device</span> <span class="hl opt">!~</span> <span class="hl kwd">/^smb:/</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$device</span> <span class="hl opt">!~</span> <span class="hl kwd">/^socket:/</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$device</span> <span class="hl opt">!~</span> <span class="hl kwd">/^http:/</span> <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$device</span> <span class="hl opt">!~</span> <span class="hl kwd">/^ipp:/</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
             N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
	     N<span class="hl opt">(</span><span class="hl str">&quot;Making printer port available for CUPS...&quot;</span><span class="hl opt">))</span>
	    <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
	printer<span class="hl opt">::</span>main<span class="hl opt">::</span>assure_device_is_available_for_cups<span class="hl opt">(</span><span class="hl kwb">$ptaldevice</span> <span class="hl opt">||</span>
							   <span class="hl kwb">$device</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>

    <span class="hl slc">#- Read the printer driver database if necessary</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">keys</span> <span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb <span class="hl opt">==</span> <span class="hl num">0</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
	    N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Reading printer database...&quot;</span><span class="hl opt">))</span>
	    <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">};</span>
        printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_printer_db<span class="hl opt">(</span><span class="hl kwb">$printer, $printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">});</span>
    <span class="hl opt">}</span>

    <span class="hl slc">#- Search the database entry which matches the detected printer best</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$descr</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">&#64;autodetected</span><span class="hl opt">) {</span>
	<span class="hl kwb">$device</span> <span class="hl kwc">eq</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>port<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$automake, $automodel, $autodescr, $autocmdset, $autosku</span><span class="hl opt">) =</span>
	    <span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>MANUFACTURER<span class="hl opt">},</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>MODEL<span class="hl opt">},</span>
	     <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>DESCRIPTION<span class="hl opt">},</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span><span class="hl str">&apos;COMMAND SET&apos;</span><span class="hl opt">},</span>
	     <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>val<span class="hl opt">}{</span>SKU<span class="hl opt">});</span>
	<span class="hl slc"># Clean some manufacturer&apos;s names</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$descrmake</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>clean_manufacturer_name<span class="hl opt">(</span><span class="hl kwb">$automake</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$automake</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$autosku</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$descrmake</span><span class="hl str">|</span><span class="hl ipl">$autosku</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$automake</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$automodel</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$descrmake</span><span class="hl str">|</span><span class="hl ipl">$automodel</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$autodescr</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=</span> <span class="hl kwb">$autodescr</span><span class="hl opt">;</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=~</span> <span class="hl kwd">s/ /|/</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$automodel</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=</span> <span class="hl kwb">$automodel</span><span class="hl opt">;</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=~</span> <span class="hl kwd">s/ /|/</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$automake</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$descr</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$descrmake</span><span class="hl str">|&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Remove manufacturer&apos;s name from the beginning of the</span>
	<span class="hl slc"># description (do not do this with manufacturer names which</span>
	<span class="hl slc"># contain odd characters)</span>
	<span class="hl kwb">$descr</span> <span class="hl opt">=~</span> <span class="hl kwd">s/^$descrmake\|\s*$descrmake\s*/$descrmake|/i</span>
	    <span class="hl kwa">if</span> <span class="hl kwb">$descrmake</span> <span class="hl opt">&amp;&amp;</span> 
           <span class="hl kwb">$descrmake</span> <span class="hl opt">!~</span> <span class="hl kwd">m![\\/\(\)\[\]\|\.\$\&#64;\%\*\?]!</span><span class="hl opt">;</span>
	<span class="hl slc"># Clean up the description from noise which makes the best match</span>
	<span class="hl slc"># difficult</span>
	<span class="hl kwb">$descr</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\s+[Ss]eries//i</span><span class="hl opt">;</span>
	<span class="hl kwb">$descr</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\s+\(?[Pp]rinter\)?$//i</span><span class="hl opt">;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
	<span class="hl slc"># Try to find an exact match, check both whether the detected</span>
	<span class="hl slc"># make|model is in the make|model of the database entry and vice versa</span>
	<span class="hl slc"># If there is more than one matching database entry, the longest match</span>
	<span class="hl slc"># counts.</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$matchlength</span> <span class="hl opt">= -</span><span class="hl num">100</span><span class="hl opt">;</span>
	<span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$entry</span> <span class="hl opt">(</span><span class="hl kwc">keys</span> <span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">) {</span>
	    <span class="hl slc"># Try to match the device ID string of the auto-detection</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>make<span class="hl opt">} =~</span> <span class="hl kwd">/Generic/i</span><span class="hl opt">) {</span>
		<span class="hl slc"># Database entry for generic printer, check printer</span>
		<span class="hl slc"># languages (command set)</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$_cmd</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>devidcmd<span class="hl opt">};</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>model<span class="hl opt">} =~</span> 
		    <span class="hl kwd">m!PCL\s*5/5e!i</span><span class="hl opt">) {</span>
		    <span class="hl slc"># Generic PCL 5/5e Printer</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$autocmdset</span> <span class="hl opt">=~</span>
			<span class="hl kwd">/(^|[:,])PCL\s*\-*\s*(5|)([,;]|$)/i</span><span class="hl opt">) {</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$matchlength</span> <span class="hl opt">&lt; -</span><span class="hl num">50</span><span class="hl opt">) {</span>
			    <span class="hl kwb">$matchlength</span> <span class="hl opt">= -</span><span class="hl num">50</span><span class="hl opt">;</span>
			    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
			    <span class="hl kwa">next</span><span class="hl opt">;</span>
			<span class="hl opt">}</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>model<span class="hl opt">} =~</span> 
		    <span class="hl kwd">m!PCL\s*(6|XL)!i</span><span class="hl opt">) {</span>
		    <span class="hl slc"># Generic PCL 6/XL Printer</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$autocmdset</span> <span class="hl opt">=~</span>
			<span class="hl kwd">/(^|[:,])PCL\s*\-*\s*(6|XL)([,;]|$)/i</span><span class="hl opt">) {</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$matchlength</span> <span class="hl opt">&lt; -</span><span class="hl num">40</span><span class="hl opt">) {</span>
			    <span class="hl kwb">$matchlength</span> <span class="hl opt">= -</span><span class="hl num">40</span><span class="hl opt">;</span>
			    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
			    <span class="hl kwa">next</span><span class="hl opt">;</span>
			<span class="hl opt">}</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>model<span class="hl opt">} =~</span> 
		    <span class="hl kwd">m!(PostScript)!i</span><span class="hl opt">) {</span>
		    <span class="hl slc"># Generic PostScript Printer</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$autocmdset</span> <span class="hl opt">=~</span>
			<span class="hl kwd">/(^|[:,])(PS|POSTSCRIPT)[^:;,]*([,;]|$)/i</span><span class="hl opt">) {</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$matchlength</span> <span class="hl opt">&lt; -</span><span class="hl num">10</span><span class="hl opt">) {</span>
			    <span class="hl kwb">$matchlength</span> <span class="hl opt">= -</span><span class="hl num">10</span><span class="hl opt">;</span>
			    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
			    <span class="hl kwa">next</span><span class="hl opt">;</span>
			<span class="hl opt">}</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl slc"># &quot;Real&quot; manufacturer, check manufacturer, model, and/or</span>
		<span class="hl slc"># description</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$matched</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
		<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$mfg, $mdl, $des</span><span class="hl opt">);</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$mfg</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>devidmake<span class="hl opt">}) {</span>
		    <span class="hl kwb">$mfg</span> <span class="hl opt">=~</span> <span class="hl kwd">s/Hewlett[-\s_]Packard/HP/i</span><span class="hl opt">;</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">uc</span><span class="hl opt">(</span><span class="hl kwb">$mfg</span><span class="hl opt">)</span> <span class="hl kwc">ne uc</span><span class="hl opt">(</span><span class="hl kwb">$automake</span><span class="hl opt">)) {</span>
			<span class="hl kwb">$matched</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$mdl</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>devidmodel<span class="hl opt">}) {</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$mdl</span> <span class="hl kwc">ne</span> <span class="hl kwb">$automodel</span><span class="hl opt">) {</span>
			<span class="hl kwb">$matched</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$des</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$entry</span><span class="hl opt">}{</span>deviddesc<span class="hl opt">}) {</span>
		    <span class="hl kwb">$des</span> <span class="hl opt">=~</span> <span class="hl kwd">s/Hewlett[-\s_]Packard/HP/</span><span class="hl opt">;</span>
		    <span class="hl kwb">$des</span> <span class="hl opt">=~</span> <span class="hl kwd">s/HEWLETT[-\s_]PACKARD/HP/</span><span class="hl opt">;</span>    
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$des</span> <span class="hl kwc">ne</span> <span class="hl kwb">$autodescr</span><span class="hl opt">) {</span>
			<span class="hl kwb">$matched</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$matched</span> <span class="hl opt">&amp;&amp; (</span><span class="hl kwb">$des</span> <span class="hl opt">||</span> <span class="hl kwb">$mfg</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$mdl</span><span class="hl opt">)) {</span>
		    <span class="hl slc"># Full match to known auto-detection data</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
		    <span class="hl kwb">$matchlength</span> <span class="hl opt">=</span> <span class="hl num">1000</span><span class="hl opt">;</span>
		    <span class="hl kwa">last</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>
	    <span class="hl slc"># Do not search human-readable make and model names if we had an</span>
	    <span class="hl slc"># exact match or a match to the auto-detection ID string </span>
	    <span class="hl kwa">next if</span> <span class="hl kwb">$matchlength</span> <span class="hl opt">&gt;=</span> <span class="hl num">100</span><span class="hl opt">;</span>
	    <span class="hl slc"># Try to match the (human-readable) make and model of the</span>
	    <span class="hl slc"># Foomatic database or of thr PPD file</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$dbmakemodel</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}) {</span>
		<span class="hl kwb">$dbmakemodel</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl kwa">if</span> <span class="hl kwb">$entry</span> <span class="hl opt">=~</span> <span class="hl kwd">m/^(.*)\|[^\|]*$/</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$dbmakemodel</span> <span class="hl opt">=</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl slc"># Do not try to match if the database entry does not provide</span>
	    <span class="hl slc"># make and model</span>
	    <span class="hl kwa">next unless</span> <span class="hl kwb">$dbmakemodel</span><span class="hl opt">;</span>
	    <span class="hl slc"># If make and model match exactly, we have found the correct</span>
	    <span class="hl slc"># entry and we can stop searching human-readable makes and</span>
	    <span class="hl slc"># models</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">lc</span><span class="hl opt">(</span><span class="hl kwb">$dbmakemodel</span><span class="hl opt">)</span> <span class="hl kwc">eq lc</span><span class="hl opt">(</span><span class="hl kwb">$descr</span><span class="hl opt">)) {</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
		<span class="hl kwb">$matchlength</span> <span class="hl opt">=</span> <span class="hl num">100</span><span class="hl opt">;</span>
		<span class="hl kwa">next</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl slc"># Matching a part of the human-readable makes and models</span>
	    <span class="hl slc"># should only be done if the search term is not the name of</span>
	    <span class="hl slc"># an old model, otherwise the newest, not yet listed models</span>
	    <span class="hl slc"># match with the oldest model of the manufacturer (as the</span>
	    <span class="hl slc"># Epson Stylus Photo 900 with the original Epson Stylus Photo)</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">&#64;badsearchterms</span> <span class="hl opt">=</span> 
		<span class="hl opt">(</span><span class="hl str">&quot;HP|DeskJet&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;HP|LaserJet&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;HP|DesignJet&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;HP|OfficeJet&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;HP|PhotoSmart&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;EPSON|Stylus&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;EPSON|Stylus Color&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;EPSON|Stylus Photo&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;EPSON|Stylus Pro&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;XEROX|WorkCentre&quot;</span><span class="hl opt">,</span>
		 <span class="hl str">&quot;XEROX|DocuPrint&quot;</span><span class="hl opt">);</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span>member<span class="hl opt">(</span><span class="hl kwb">$descr, &#64;badsearchterms</span><span class="hl opt">)) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$searchterm</span> <span class="hl opt">=</span> <span class="hl kwb">$descr</span><span class="hl opt">;</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$lsearchterm</span> <span class="hl opt">=</span> <span class="hl kwc">length</span><span class="hl opt">(</span><span class="hl kwb">$searchterm</span><span class="hl opt">);</span>
		<span class="hl kwb">$searchterm</span> <span class="hl opt">=~</span> <span class="hl kwd">s!([\\/\(\)\[\]\|\.\$\&#64;\%\*\?])!\\$1!g</span><span class="hl opt">;</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$lsearchterm</span> <span class="hl opt">&gt;</span> <span class="hl kwb">$matchlength</span> <span class="hl opt">&amp;&amp;</span>
		    <span class="hl kwb">$dbmakemodel</span> <span class="hl opt">=~</span> <span class="hl kwd">m!$searchterm!i</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$matchlength</span> <span class="hl opt">=</span> <span class="hl kwb">$lsearchterm</span><span class="hl opt">;</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span>member<span class="hl opt">(</span><span class="hl kwb">$dbmakemodel, &#64;badsearchterms</span><span class="hl opt">)) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$searchterm</span> <span class="hl opt">=</span> <span class="hl kwb">$dbmakemodel</span><span class="hl opt">;</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$lsearchterm</span> <span class="hl opt">=</span> <span class="hl kwc">length</span><span class="hl opt">(</span><span class="hl kwb">$searchterm</span><span class="hl opt">);</span>
		<span class="hl kwb">$searchterm</span> <span class="hl opt">=~</span> <span class="hl kwd">s!([\\/\(\)\[\]\|\.\$\&#64;\%\*\?])!\\$1!g</span><span class="hl opt">;</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$lsearchterm</span> <span class="hl opt">&gt;</span> <span class="hl kwb">$matchlength</span> <span class="hl opt">&amp;&amp;</span>
		    <span class="hl kwb">$descr</span> <span class="hl opt">=~</span> <span class="hl kwd">m!$searchterm!i</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$matchlength</span> <span class="hl opt">=</span> <span class="hl kwb">$lsearchterm</span><span class="hl opt">;</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$entry</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># No matching printer found, try a best match as last mean (not</span>
	<span class="hl slc"># when generating queues non-interactively)</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">}) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} ||=</span>
		bestMatchSentence<span class="hl opt">(</span><span class="hl kwb">$descr,</span> <span class="hl kwc">keys</span> <span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">);</span>
	    <span class="hl slc"># If the manufacturer was not guessed correctly, discard the</span>
	    <span class="hl slc"># guess.</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$guessedmake</span> <span class="hl opt">=</span> <span class="hl kwc">lc</span><span class="hl opt">(</span><span class="hl kwb">$1</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =~</span> <span class="hl kwd">/^([^\|]+)\|/</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$guessedmake</span> <span class="hl opt">!~</span> <span class="hl kwd">/Generic/i</span> <span class="hl opt">&amp;&amp;</span>
		<span class="hl kwb">$descr</span> <span class="hl opt">!~</span> <span class="hl kwd">/$guessedmake/i</span> <span class="hl opt">&amp;&amp;</span>
		<span class="hl opt">(</span><span class="hl kwb">$guessedmake</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;hp&quot;</span> <span class="hl opt">||</span>
		 <span class="hl kwb">$descr</span> <span class="hl opt">!~</span> <span class="hl kwd">/Hewlett[\s-]+Packard/i</span><span class="hl opt">))</span>
            <span class="hl opt">{</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">};</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl slc">#- Pre-fill the &quot;Description&quot; field with the printer&apos;s model name</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>desc<span class="hl opt">} &amp;&amp;</span> <span class="hl kwb">$descr</span><span class="hl opt">) {</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>desc<span class="hl opt">} =</span> <span class="hl kwb">$descr</span><span class="hl opt">;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>desc<span class="hl opt">} =~</span> <span class="hl kwd">s/\|/ /g</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl slc">#- When we have chosen a printer here, the question whether the</span>
    <span class="hl slc">#- automatically chosen model from the database is correct, should</span>
    <span class="hl slc">#- have &quot;This model is correct&quot; as default answer</span>
    <span class="hl kwc">delete</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUALMODEL<span class="hl opt">});</span>

    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> choose_printer_name <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># Name, description, location</span>
<span class="hl slc">#    $in-&gt;set_help(&apos;setupPrinterName&apos;) if $::isInstall;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$default</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>queue<span class="hl opt">};</span>
    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
	 <span class="hl opt">{</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Enter Printer Name and Comments&quot;</span><span class="hl opt">),</span>
	   <span class="hl slc">#cancel =&gt; !$printer-&gt;{configured}{$queue} ? &apos;&apos; : N(&quot;Remove queue&quot;),</span>
	   callbacks <span class="hl opt">=&gt; {</span> complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	       <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>queue<span class="hl opt">} =~</span> <span class="hl kwd">/^\w+$/</span><span class="hl opt">) {</span>
		   <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Name of printer should contain only letters, numbers and the underscore&quot;</span><span class="hl opt">));</span>
		   <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">;</span>
	       <span class="hl opt">}</span>
	       <span class="hl kwc">local</span> <span class="hl opt">$::</span>isWizard <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	       <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>queue<span class="hl opt">}}</span>
		   <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>queue<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> <span class="hl opt">&amp;&amp;</span> 
		   <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Warning&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;The printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> already <span class="hl kwc">exists</span><span class="hl opt">,</span><span class="hl esc">\n</span>do you really want to overwrite its configuration?<span class="hl str">&quot;,</span>
<span class="hl str"></span>					    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{queue}),</span>
<span class="hl str">				      0)) {</span>
<span class="hl str">		   return 1, 0; # Let the user correct the name</span>
<span class="hl str">	       }</span>
<span class="hl str">	       return 0;</span>
<span class="hl str">	   },</span>
<span class="hl str">		      },</span>
<span class="hl str">	   messages =&gt;</span>
<span class="hl str">N(&quot;</span>Every printer needs a name <span class="hl opt">(</span><span class="hl kwa">for</span> example <span class="hl esc">\&quot;</span>printer<span class="hl esc">\&quot;</span><span class="hl opt">).</span> The Description <span class="hl kwc">and</span> Location fields <span class="hl kwa">do</span> <span class="hl kwc">not</span> need to be filled <span class="hl kwa">in</span><span class="hl opt">.</span> They are comments <span class="hl kwa">for</span> the users<span class="hl opt">.</span><span class="hl str">&quot;) }, </span>
<span class="hl str">	 [ { label =&gt; N(&quot;</span>Name of printer<span class="hl str">&quot;), val =&gt; \</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{queue} },</span>
<span class="hl str">	   { label =&gt; N(&quot;</span>Description<span class="hl str">&quot;), val =&gt; \</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{desc} },</span>
<span class="hl str">	   { label =&gt; N(&quot;</span>Location<span class="hl str">&quot;), val =&gt; \</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{loc} },</span>
<span class="hl str">	 ]) or return 0;</span>
<span class="hl str"></span>
<span class="hl str"></span>    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{queue};</span>
<span class="hl str">    1;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub get_db_entry {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    #- Read the printer driver database if necessary</span>
<span class="hl str">    if (keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb == 0) {</span>
<span class="hl str">	my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span>
<span class="hl str">				   N(&quot;</span>Reading printer database<span class="hl opt">...</span><span class="hl str">&quot;))</span>
<span class="hl str">	    if</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{noninteractive};</span>
<span class="hl str">	printer::main::read_printer_db(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER});</span>
<span class="hl str">    }</span>
<span class="hl str">    my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span>
<span class="hl str">			       N(&quot;</span>Preparing printer database<span class="hl opt">...</span><span class="hl str">&quot;))</span>
<span class="hl str">	if !</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{noninteractive};</span>
<span class="hl str">    my</span> <span class="hl ipl">$queue</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_QUEUE};</span>
<span class="hl str">    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}) {</span>
<span class="hl str">	# The queue was already configured</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{foomatic}) {</span>
<span class="hl str">	    # The queue was configured with Foomatic</span>
<span class="hl str">	    my</span> <span class="hl ipl">$driverstr</span><span class="hl str">;</span>
<span class="hl str">	    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{driver} eq &quot;</span>Postscript<span class="hl str">&quot;) {</span>
<span class="hl str"></span>		<span class="hl ipl">$driverstr</span> <span class="hl str">= &quot;</span>PostScript<span class="hl str">&quot;;</span>
<span class="hl str">	    } else {</span>
<span class="hl str"></span>		<span class="hl ipl">$driverstr</span> <span class="hl str">= &quot;</span>GhostScript <span class="hl opt">+</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>driver<span class="hl opt">}</span><span class="hl str">&quot;;</span>
<span class="hl str">	    }</span>
<span class="hl str">	    my</span> <span class="hl ipl">$make</span> <span class="hl str">= uc(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{make});</span>
<span class="hl str">	    my</span> <span class="hl ipl">$model</span> <span class="hl str">=</span>	<span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{model};</span>
<span class="hl str">	    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert}) {</span>
<span class="hl str"></span>		<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} = &quot;</span><span class="hl kwb">$make</span><span class="hl opt">|</span><span class="hl kwb">$model</span><span class="hl opt">|</span><span class="hl kwb">$driverstr</span><span class="hl str">&quot;;</span>
<span class="hl str">		# database key contains the &quot;</span><span class="hl opt">(</span>recommended<span class="hl opt">)</span><span class="hl str">&quot; for the</span>
<span class="hl str">		# recommended driver, so add it if necessary</span>
<span class="hl str">		unless (exists(</span><span class="hl ipl">$printer</span><span class="hl str">::main::thedb{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY}})) {</span>
<span class="hl str"></span>		    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} .= &quot;</span> <span class="hl opt">(</span>recommended<span class="hl opt">)</span><span class="hl str">&quot;;</span>
<span class="hl str">		}</span>
<span class="hl str">	    } else {</span>
<span class="hl str"></span>		<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} = &quot;</span><span class="hl kwb">$make</span><span class="hl opt">|</span><span class="hl kwb">$model</span><span class="hl str">&quot;;</span>
<span class="hl str">	    }</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_CHOICE} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY};</span>
<span class="hl str">	} elsif (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{ppd}) {</span>
<span class="hl str">	    # Do we have a native CUPS driver or a PostScript PPD file?</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =</span>
<span class="hl str">		printer::main::get_descr_from_ppd(</span><span class="hl ipl">$printer</span><span class="hl str">) ||</span>
<span class="hl str"></span>		<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY};</span>
<span class="hl str">	    unless (exists(</span><span class="hl ipl">$printer</span><span class="hl str">::main::thedb{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY}})) {</span>
<span class="hl str"></span>		<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} .= &quot;</span> <span class="hl opt">(</span>recommended<span class="hl opt">)</span><span class="hl str">&quot;;</span>
<span class="hl str">	    }</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_CHOICE} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY};</span>
<span class="hl str">	}</span>
<span class="hl str">	my (</span><span class="hl ipl">$make,</span> <span class="hl str"></span><span class="hl ipl">$model</span><span class="hl str">);</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} eq &quot;</span><span class="hl str">&quot;) {</span>
<span class="hl str">	    # Point the list cursor at least to manufacturer and model of </span>
<span class="hl str">	    # the printer</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} = &quot;</span><span class="hl str">&quot;;</span>
<span class="hl str">	    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{foomatic}) {</span>
<span class="hl str"></span>		<span class="hl ipl">$make</span> <span class="hl str">= uc(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{make});</span>
<span class="hl str"></span>		<span class="hl ipl">$model</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{model};</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{ppd}) {</span>
<span class="hl str">		my</span> <span class="hl ipl">$makemodel</span> <span class="hl str">=</span>
<span class="hl str">		    printer::main::get_descr_from_ppd(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">		if (</span><span class="hl ipl">$makemodel</span> <span class="hl str">=~ m!^([^\|]+)\|([^\|]+)(|\|.*)$!) {</span>
<span class="hl str"></span>              <span class="hl ipl">$make</span> <span class="hl str">=</span> <span class="hl ipl">$1</span><span class="hl str">;</span>
<span class="hl str"></span>              <span class="hl ipl">$model</span> <span class="hl str">=</span> <span class="hl ipl">$2</span><span class="hl str">;</span>
<span class="hl str">          }</span>
<span class="hl str">	    }</span>
<span class="hl str">	    foreach my</span> <span class="hl ipl">$key</span> <span class="hl str">(keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb) {</span>
<span class="hl str">		if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert} &amp;&amp;</span>
<span class="hl str"></span>		    <span class="hl ipl">$key</span> <span class="hl str">=~ /^</span><span class="hl ipl">$make\</span><span class="hl str">|</span><span class="hl ipl">$model\</span><span class="hl str">|.*\(recommended\)</span><span class="hl ipl">$/</span> <span class="hl str">||</span>
<span class="hl str">		    !</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert} &amp;&amp;</span> <span class="hl ipl">$key</span> <span class="hl str">=~ /^</span><span class="hl ipl">$make\</span><span class="hl str">|</span><span class="hl ipl">$model$/</span><span class="hl str">) {</span>
<span class="hl str"></span>		    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =</span> <span class="hl ipl">$key</span><span class="hl str">;</span>
<span class="hl str">		}</span>
<span class="hl str">	    }</span>
<span class="hl str">	}</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} eq &quot;</span><span class="hl str">&quot;) {</span>
<span class="hl str">	    # Exact match of make and model did not work, try to clean</span>
<span class="hl str">	    # up the model name</span>
<span class="hl str"></span>	    <span class="hl ipl">$model</span> <span class="hl str">=~ s/PS//;</span>
<span class="hl str"></span>	    <span class="hl ipl">$model</span> <span class="hl str">=~ s/PostScript//i;</span>
<span class="hl str"></span>	    <span class="hl ipl">$model</span> <span class="hl str">=~ s/Series//i;</span>
<span class="hl str">	    foreach my</span> <span class="hl ipl">$key</span> <span class="hl str">(keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb) {</span>
<span class="hl str">		if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert} &amp;&amp;</span> <span class="hl ipl">$key</span> <span class="hl str">=~ /^</span><span class="hl ipl">$make\</span><span class="hl str">|</span><span class="hl ipl">$model\</span><span class="hl str">|.*\(recommended\)</span><span class="hl ipl">$/</span> <span class="hl str">||</span>
<span class="hl str">		    !</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert} &amp;&amp;</span> <span class="hl ipl">$key</span> <span class="hl str">=~ /^</span><span class="hl ipl">$make\</span><span class="hl str">|</span><span class="hl ipl">$model$/</span><span class="hl str">) {</span>
<span class="hl str"></span>		    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =</span> <span class="hl ipl">$key</span><span class="hl str">;</span>
<span class="hl str">		}</span>
<span class="hl str">	    }</span>
<span class="hl str">	}</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} eq &quot;</span><span class="hl str">&quot; &amp;&amp;</span> <span class="hl ipl">$make</span> <span class="hl str">ne &quot;</span><span class="hl str">&quot;) {</span>
<span class="hl str">	    # Exact match with cleaned-up model did not work, try a best match</span>
<span class="hl str">	    my</span> <span class="hl ipl">$matchstr</span> <span class="hl str">= &quot;</span><span class="hl kwb">$make</span><span class="hl opt">|</span><span class="hl kwb">$model</span><span class="hl str">&quot;;</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} = </span>
<span class="hl str">		bestMatchSentence(</span><span class="hl ipl">$matchstr,</span> <span class="hl str">keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb);</span>
<span class="hl str">	    # If the manufacturer was not guessed correctly, discard the</span>
<span class="hl str">	    # guess.</span>
<span class="hl str">	    my</span> <span class="hl ipl">$guessedmake</span> <span class="hl str">= lc(</span><span class="hl ipl">$1</span><span class="hl str">) if</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =~ /^([^\|]+)\|/;</span>
<span class="hl str">	    if (</span><span class="hl ipl">$matchstr</span> <span class="hl str">!~ /</span><span class="hl ipl">$guessedmake/i</span> <span class="hl str">&amp;&amp;</span>
<span class="hl str">		(</span><span class="hl ipl">$guessedmake</span> <span class="hl str">ne &quot;</span>hp<span class="hl str">&quot; ||</span>
<span class="hl str"></span>		 <span class="hl ipl">$matchstr</span> <span class="hl str">!~ /Hewlett[\s-]+Packard/i))</span>
<span class="hl str">	    {</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} = &quot;</span><span class="hl str">&quot; };</span>
<span class="hl str">	}</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} eq &quot;</span><span class="hl str">&quot;) {</span>
<span class="hl str">	    # Set the OLD_CHOICE to a non-existing value</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_CHOICE} = &quot;</span>XXX<span class="hl str">&quot;;</span>
<span class="hl str">	}</span>
<span class="hl str">    } else {</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert} &amp;&amp;</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} !~ /(recommended)/) {</span>
<span class="hl str">	    my (</span><span class="hl ipl">$make,</span> <span class="hl str"></span><span class="hl ipl">$model</span><span class="hl str">) =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =~ /^([^\|]+)\|([^\|]+)\|/;</span>
<span class="hl str">	    foreach my</span> <span class="hl ipl">$key</span> <span class="hl str">(keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb) {</span>
<span class="hl str">		if (</span><span class="hl ipl">$key</span> <span class="hl str">=~ /^</span><span class="hl ipl">$make\</span><span class="hl str">|</span><span class="hl ipl">$model\</span><span class="hl str">|.*\(recommended\)</span><span class="hl ipl">$/</span><span class="hl str">) {</span>
<span class="hl str"></span>		    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =</span> <span class="hl ipl">$key</span><span class="hl str">;</span>
<span class="hl str">		}</span>
<span class="hl str">	    }</span>
<span class="hl str">	}</span>
<span class="hl str"></span>	<span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_CHOICE} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY};</span>
<span class="hl str">    }</span>
<span class="hl str">    1;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub is_model_correct {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;chooseModel&apos;) if $::isInstall;</span>
<span class="hl str">    my</span> <span class="hl ipl">$dbentry</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY};</span>
<span class="hl str">    if (!</span><span class="hl ipl">$dbentry</span><span class="hl str">) {</span>
<span class="hl str">	# If printerdrake could not determine the model, omit this dialog and</span>
<span class="hl str">	# let the user choose manually.</span>
<span class="hl str"></span>	<span class="hl ipl">$printer</span><span class="hl str">-&gt;{MANUALMODEL} = 1;</span>
<span class="hl str">	return 1;</span>
<span class="hl str">    }</span>
<span class="hl str"></span>    <span class="hl ipl">$dbentry</span> <span class="hl str">=~ s/\|/ /g;</span>
<span class="hl str">    my</span> <span class="hl ipl">$res</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_list_(</span>
<span class="hl str">	     N(&quot;</span>Your printer model<span class="hl str">&quot;),</span>
<span class="hl str">	     N(&quot;</span>Printerdrake <span class="hl kwa">has</span> compared the model name resulting from the printer auto-detection with the models listed <span class="hl kwa">in</span> its printer database to find the best match<span class="hl opt">.</span> This choice can be wrong<span class="hl opt">,</span> especially <span class="hl kwa">when</span> your printer <span class="hl kwa">is</span> <span class="hl kwc">not</span> listed at all <span class="hl kwa">in</span> the database<span class="hl opt">.</span> So check whether the choice <span class="hl kwa">is</span> correct <span class="hl kwc">and</span> click <span class="hl esc">\&quot;</span>The model <span class="hl kwa">is</span> correct<span class="hl esc">\&quot;</span> <span class="hl kwa">if</span> so <span class="hl kwc">and</span> <span class="hl kwa">if</span> <span class="hl kwc">not</span><span class="hl opt">,</span> click <span class="hl esc">\&quot;</span>Select model manually<span class="hl esc">\&quot;</span> so that you can choose your printer model manually on the <span class="hl kwa">next</span> screen<span class="hl opt">.</span>

For your printer Printerdrake <span class="hl kwa">has</span> found<span class="hl opt">:</span>

<span class="hl kwb">%s</span><span class="hl str">&quot;,</span> <span class="hl ipl">$dbentry</span><span class="hl str">),</span>
<span class="hl str">	     [N(&quot;</span>The model <span class="hl kwa">is</span> correct<span class="hl str">&quot;),</span>
<span class="hl str">	      N(&quot;</span>Select model manually<span class="hl str">&quot;)],</span>
<span class="hl str">	     (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{MANUALMODEL} ? N(&quot;</span>Select model manually<span class="hl str">&quot;) : </span>
<span class="hl str">	      N(&quot;</span>The model <span class="hl kwa">is</span> correct<span class="hl str">&quot;)));</span>
<span class="hl str">    return 0 if !</span><span class="hl ipl">$res</span><span class="hl str">;</span>
<span class="hl str"></span>    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{MANUALMODEL} =</span> <span class="hl ipl">$res</span> <span class="hl str">eq N(&quot;</span>Select model manually<span class="hl str">&quot;);</span>
<span class="hl str">    1;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub choose_model {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;chooseModel&apos;) if $::isInstall;</span>
<span class="hl str">    #- Read the printer driver database if necessary</span>
<span class="hl str">    if (keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb == 0) {</span>
<span class="hl str">	my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span>
<span class="hl str">				  N(&quot;</span>Reading printer database<span class="hl opt">...</span><span class="hl str">&quot;));</span>
<span class="hl str">        printer::main::read_printer_db(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER});</span>
<span class="hl str">    }</span>
<span class="hl str">    unless (exists(</span><span class="hl ipl">$printer</span><span class="hl str">::main::thedb{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY}})) {</span>
<span class="hl str"></span>	<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} = N(&quot;</span>Raw printer <span class="hl opt">(</span>No driver<span class="hl opt">)</span><span class="hl str">&quot;);</span>
<span class="hl str">    }</span>
<span class="hl str">    # Choose the printer/driver from the list</span>
<span class="hl str">    my</span> <span class="hl ipl">$choice</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY};</span>
<span class="hl str">    my</span> <span class="hl ipl">$loadppdchosen</span> <span class="hl str">= 0;</span>
<span class="hl str">    while (1) {</span>
<span class="hl str">	if (</span><span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_({ </span>
<span class="hl str">	    title =&gt; N(&quot;</span>Printer model selection<span class="hl str">&quot;),</span>
<span class="hl str">	    messages =&gt; N(&quot;</span>Which printer model <span class="hl kwa">do</span> you have?<span class="hl str">&quot;) .</span>
<span class="hl str">		N(&quot;</span>

Please check whether Printerdrake did the auto-detection of your printer model correctly<span class="hl opt">.</span> Find the correct model <span class="hl kwa">in</span> the list <span class="hl kwa">when</span> a wrong model <span class="hl kwc">or</span> <span class="hl esc">\&quot;</span>Raw printer<span class="hl esc">\&quot;</span> <span class="hl kwa">is</span> highlighted<span class="hl opt">.</span><span class="hl str">&quot;) </span>
<span class="hl str">		. &quot;</span> <span class="hl str">&quot; .</span>
<span class="hl str">		N(&quot;</span>If your printer <span class="hl kwa">is</span> <span class="hl kwc">not</span> listed<span class="hl opt">,</span> choose a compatible <span class="hl opt">(</span>see printer manual<span class="hl opt">)</span> <span class="hl kwc">or</span> a similar one<span class="hl opt">.</span><span class="hl str">&quot;),</span>
<span class="hl str">		#cancel =&gt; (&quot;</span><span class="hl str">&quot;),</span>
<span class="hl str">		#ok =&gt; (&quot;</span><span class="hl str">&quot;),</span>
<span class="hl str">	    }, [ </span>
<span class="hl str">		 # List the printers/drivers</span>
<span class="hl str">		 { val =&gt; \</span><span class="hl ipl">$choice,</span> <span class="hl str">format =&gt; \&amp;translate,</span>
<span class="hl str">		   sort =&gt; 1, separator =&gt; &quot;</span><span class="hl opt">|</span><span class="hl str">&quot;, tree_expanded =&gt; 0,</span>
<span class="hl str">		   quit_if_double_click =&gt; 1, allow_empty_list =&gt; 1,</span>
<span class="hl str">		   list =&gt; [ keys</span> <span class="hl ipl">%printer</span><span class="hl str">::main::thedb ] },</span>
<span class="hl str">		 # Button to install a manufacturer-supplied PPD file</span>
<span class="hl str">		 { clicked_may_quit =&gt;</span>
<span class="hl str">		       sub { </span>
<span class="hl str"></span>			   <span class="hl ipl">$loadppdchosen</span> <span class="hl str">= 1;</span>
<span class="hl str">			   1; </span>
<span class="hl str">		       },</span>
<span class="hl str">		   val =&gt; N(&quot;</span>Install a manufacturer-supplied PPD file<span class="hl str">&quot;) },</span>
<span class="hl str">		 ])) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} =</span> <span class="hl ipl">$choice</span> <span class="hl str">if !</span><span class="hl ipl">$loadppdchosen</span><span class="hl str">;</span>
<span class="hl str">	} else {</span>
<span class="hl str">	    return 0;</span>
<span class="hl str">	}</span>
<span class="hl str">	last if !</span><span class="hl ipl">$loadppdchosen</span><span class="hl str">;</span>
<span class="hl str">	# Install a manufacturer-supplied PPD file</span>
<span class="hl str">	my</span> <span class="hl ipl">$ppdentry</span><span class="hl str">;</span>
<span class="hl str">	if (</span><span class="hl ipl">$ppdentry</span> <span class="hl str">= installppd(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">)) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$choice</span> <span class="hl str">=</span> <span class="hl ipl">$ppdentry</span><span class="hl str">;</span>
<span class="hl str">	}</span>
<span class="hl str"></span>	<span class="hl ipl">$loadppdchosen</span> <span class="hl str">= 0;</span>
<span class="hl str">    }</span>
<span class="hl str">    return 1;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub installppd {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Install a manufacturer-supplied PPD file</span>
<span class="hl str"></span>
<span class="hl str">    # The dialogs to choose the PPD file should appear as extra</span>
<span class="hl str">    # windows and not embedded in the &quot;</span>Add printer<span class="hl str">&quot; wizard.</span>
<span class="hl str">    local $::isWizard = 0;</span>
<span class="hl str"></span>
<span class="hl str">    my</span> <span class="hl ipl">$ppdfile</span><span class="hl str">;</span>
<span class="hl str">    my (</span><span class="hl ipl">$mediachoice</span><span class="hl str">);</span>
<span class="hl str">    while (1) {</span>
<span class="hl str">	# Tell user about PPD file installation</span>
<span class="hl str"></span>	<span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from(&apos;Printerdrake&apos;,</span>
<span class="hl str">		      N(&quot;</span>Every PostScript printer <span class="hl kwa">is</span> delivered with a PPD file which describes the printer<span class="hl str">&apos;s options and features.&quot;) . &quot; &quot; .</span>
<span class="hl str">		      N(&quot;This file is usually somewhere on the CD with the Windows and Mac drivers delivered with the printer.&quot;) . &quot; &quot; .</span>
<span class="hl str">		      N(&quot;You can find the PPD files also on the manufacturer&apos;</span>s web sites<span class="hl opt">.</span><span class="hl str">&quot;) . &quot;</span> <span class="hl str">&quot; .</span>
<span class="hl str">		      N(&quot;</span>If you have Windows installed on your machine<span class="hl opt">,</span> you can find the PPD file on your Windows partition<span class="hl opt">,</span> too<span class="hl opt">.</span><span class="hl str">&quot;) . &quot;</span><span class="hl esc">\n</span><span class="hl str">&quot; .</span>
<span class="hl str">		      N(&quot;</span>Installing the printer<span class="hl str">&apos;s PPD file and using it when setting up the printer makes all options of the printer available which are provided by the printer&apos;</span>s hardware<span class="hl str">&quot;) . &quot;</span><span class="hl esc">\n</span><span class="hl str">&quot; .</span>
<span class="hl str">		      N(&quot;</span>Here you can choose the PPD file to be installed on your machine<span class="hl opt">,</span> it will then be used <span class="hl kwa">for</span> the setup of your printer<span class="hl opt">.</span><span class="hl str">&quot;),</span>
<span class="hl str">		      [</span>
<span class="hl str">		       { label =&gt; N(&quot;</span>Install PPD file from<span class="hl str">&quot;), </span>
<span class="hl str">			 val =&gt; \</span><span class="hl ipl">$mediachoice,</span>
<span class="hl str">			 list =&gt; [N(&quot;</span>CD-ROM<span class="hl str">&quot;),</span>
<span class="hl str">				  N(&quot;</span>Floppy Disk<span class="hl str">&quot;), </span>
<span class="hl str">				  N(&quot;</span>Other place<span class="hl str">&quot;)], </span>
<span class="hl str">			 not_edit =&gt; 1, sort =&gt; 0 },</span>
<span class="hl str">		       ],</span>
<span class="hl str">		      ) or return 0;</span>
<span class="hl str">	my</span> <span class="hl ipl">$dir</span><span class="hl str">;</span>
<span class="hl str">	if (</span><span class="hl ipl">$mediachoice</span> <span class="hl str">eq N(&quot;</span>CD-ROM<span class="hl str">&quot;)) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$dir</span> <span class="hl str">= &quot;</span><span class="hl kwd">/mnt/cd</span>rom<span class="hl str">&quot;;</span>
<span class="hl str">	} elsif (</span><span class="hl ipl">$mediachoice</span> <span class="hl str">eq N(&quot;</span>Floppy Disk<span class="hl str">&quot;)) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$dir</span> <span class="hl str">= &quot;</span><span class="hl kwd">/mnt/</span>floppy<span class="hl str">&quot;;</span>
<span class="hl str">	} elsif (</span><span class="hl ipl">$mediachoice</span> <span class="hl str">eq N(&quot;</span>Other place<span class="hl str">&quot;)) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$dir</span> <span class="hl str">= &quot;</span><span class="hl opt">/</span>mnt<span class="hl str">&quot;;</span>
<span class="hl str">	} else {</span>
<span class="hl str">	    return 0;</span>
<span class="hl str">	}</span>
<span class="hl str">	# Let user select a PPD file from a floppy, hard disk, ...</span>
<span class="hl str"></span>        <span class="hl ipl">$ppdfile</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_file(N(&quot;</span>Select PPD file<span class="hl str">&quot;),</span> <span class="hl ipl">$dir</span><span class="hl str">);</span>
<span class="hl str">	last if !</span><span class="hl ipl">$ppdfile</span><span class="hl str">;</span>
<span class="hl str">	if (! -r</span> <span class="hl ipl">$ppdfile</span><span class="hl str">) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Error<span class="hl str">&quot;),</span>
<span class="hl str">			  N(&quot;</span>The PPD file <span class="hl kwb">%s</span> <span class="hl kwa">does</span> <span class="hl kwc">not</span> exist <span class="hl kwc">or</span> <span class="hl kwa">is</span> unreadable<span class="hl opt">!</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>			    <span class="hl ipl">$ppdfile</span><span class="hl str">));</span>
<span class="hl str">	    next;</span>
<span class="hl str">	}</span>
<span class="hl str">	if (! printer::main::checkppd(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$ppdfile</span><span class="hl str">)) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Error<span class="hl str">&quot;),</span>
<span class="hl str">			  N(&quot;</span>The PPD file <span class="hl kwb">%s</span> <span class="hl kwa">does</span> <span class="hl kwc">not</span> conform with the PPD specifications<span class="hl opt">!</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>			    <span class="hl ipl">$ppdfile</span><span class="hl str">));</span>
<span class="hl str">	    next;</span>
<span class="hl str">	}</span>
<span class="hl str">	last;</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    return 0 if !</span><span class="hl ipl">$ppdfile</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Install the PPD file in /usr/share/cups/ppd/printerdrake/</span>
<span class="hl str">    my</span> <span class="hl ipl">$w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span>
<span class="hl str">			       N(&quot;</span>Installing PPD file<span class="hl opt">...</span><span class="hl str">&quot;));</span>
<span class="hl str">    my</span> <span class="hl ipl">$ppdentry</span> <span class="hl str">= printer::main::installppd(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$ppdfile</span><span class="hl str">);</span>
<span class="hl str">    undef</span> <span class="hl ipl">$w</span><span class="hl str">;</span>
<span class="hl str">    return</span> <span class="hl ipl">$ppdentry</span><span class="hl str">;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">my</span> <span class="hl ipl">%lexmarkinkjet_options</span> <span class="hl str">= (</span>
<span class="hl str">                             &apos;parallel:/dev/lp0&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>ParPort1<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;parallel:/dev/lp1&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>ParPort2<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;parallel:/dev/lp2&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>ParPort3<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp0&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>USB1<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp1&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>USB2<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp2&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>USB3<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/lp0&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>ParPort1<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/lp1&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>ParPort2<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/lp2&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>ParPort3<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp0&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>USB1<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp1&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>USB2<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp2&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Port<span class="hl opt">=</span>USB3<span class="hl str">&quot;,</span>
<span class="hl str">                             );</span>
<span class="hl str"></span>
<span class="hl str">my</span> <span class="hl ipl">%drv_x125_options</span> <span class="hl str">= (</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp0&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp1<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp1&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp2<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp2&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp3<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;usb:/dev/usb/lp3&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp3<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp0&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp1<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp1&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp2<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp2&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp3<span class="hl str">&quot;,</span>
<span class="hl str">                             &apos;file:/dev/usb/lp3&apos; =&gt; &quot;</span> <span class="hl opt">-</span>o Device<span class="hl opt">=</span>usb_lp3<span class="hl str">&quot;,</span>
<span class="hl str">                             );</span>
<span class="hl str"></span>
<span class="hl str">sub get_printer_info {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$queue</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_QUEUE};</span>
<span class="hl str">    my</span> <span class="hl ipl">$oldchoice</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_CHOICE};</span>
<span class="hl str">    my</span> <span class="hl ipl">$newdriver</span> <span class="hl str">= 0;</span>
<span class="hl str">    if (!</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">} ||    # New queue  or</span>
<span class="hl str">	(</span><span class="hl ipl">$oldchoice</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} &amp;&amp; # make/model/driver changed</span>
<span class="hl str">	 (</span><span class="hl ipl">$oldchoice</span> <span class="hl str">ne</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY} ||</span>
<span class="hl str"></span>	  <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{driver} ne </span>
<span class="hl str"></span>	   <span class="hl ipl">$printer</span><span class="hl str">::main::thedb{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{DBENTRY}}{driver}))) {</span>
<span class="hl str">	delete(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{printer});</span>
<span class="hl str">	delete(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{ppd});</span>
<span class="hl str"></span>	<span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{foomatic} = 0;</span>
<span class="hl str">	# Read info from printer database</span>
<span class="hl str">	foreach (qw(printer ppd driver make model)</span><span class="hl opt">) {</span> <span class="hl slc">#- copy some parameter, shorter that way...</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} =</span> <span class="hl kwb">$printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb<span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">}}{</span><span class="hl kwb">$_</span><span class="hl opt">};</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">$newdriver</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl slc"># Use the &quot;printer&quot; and not the &quot;foomatic&quot; field to identify a Foomatic</span>
    <span class="hl slc"># queue because in a new queue &quot;foomatic&quot; is not set yet.</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>printer<span class="hl opt">} ||</span> <span class="hl slc"># We have a Foomatic queue</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">}) {</span> <span class="hl slc"># We have a PPD queue</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>printer<span class="hl opt">}) {</span> <span class="hl slc"># Foomatic queue?</span>
	    <span class="hl slc"># In case of a new queue &quot;foomatic&quot; was not set yet</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>foomatic<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">} =</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">}) {</span> <span class="hl slc"># PPD queue?</span>
	    <span class="hl slc"># If we had a Foomatic queue before, unmark the flag and</span>
	    <span class="hl slc"># initialize the &quot;printer&quot; and &quot;driver&quot; fields</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>foomatic<span class="hl opt">} =</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>printer<span class="hl opt">} =</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">} =</span> <span class="hl str">&quot;PPD&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Now get the options for this printer/driver combo</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">} &amp;&amp;</span> 
	    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>foomatic<span class="hl opt">} ||</span>
	     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>ppd<span class="hl opt">})) {</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$newdriver</span><span class="hl opt">) {</span>
		<span class="hl slc"># The user did not change the printer/driver</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">} =</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>args<span class="hl opt">};</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>foomatic<span class="hl opt">}) {</span>
		<span class="hl slc"># The queue was already configured with Foomatic ...</span>
		<span class="hl slc"># ... and the user has chosen another printer/driver</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">} =</span> 
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_foomatic_options<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">}) {</span>
		<span class="hl slc"># ... and the user has chosen another printer/driver</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">} =</span> 
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_ppd_options<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl slc"># The queue was not configured with Foomatic before</span>
	    <span class="hl slc"># Set some special options</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPECIAL_OPTIONS<span class="hl opt">} =</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">;</span>
	    <span class="hl slc"># Default page size depending on the country/language</span>
	    <span class="hl slc"># (US/Canada -&gt; Letter, Others -&gt; A4)</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$pagesize</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>PAPERSIZE<span class="hl opt">}) {</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPECIAL_OPTIONS<span class="hl opt">} .=</span> 
		    <span class="hl str">&quot; -o PageSize=</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{PAPERSIZE}&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">((</span><span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;{</span>lang<span class="hl opt">}) ||</span>
		     <span class="hl opt">(</span><span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>LC_PAPER<span class="hl opt">}) ||</span>
		     <span class="hl opt">(</span><span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>LANG<span class="hl opt">}) ||</span>
		     <span class="hl opt">(</span><span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>LANGUAGE<span class="hl opt">}) ||</span>
		     <span class="hl opt">(</span><span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>LC_ALL<span class="hl opt">})) {</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$pagesize</span> <span class="hl opt">=~</span> <span class="hl kwd">/^en_CA/</span> <span class="hl opt">||</span>
		    <span class="hl kwb">$pagesize</span> <span class="hl opt">=~</span> <span class="hl kwd">/^fr_CA/</span> <span class="hl opt">||</span> 
		    <span class="hl kwb">$pagesize</span> <span class="hl opt">=~</span> <span class="hl kwd">/^en_US/</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl str">&quot;Letter&quot;</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$pagesize</span> <span class="hl opt">=</span> <span class="hl str">&quot;A4&quot;</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPECIAL_OPTIONS<span class="hl opt">} .=</span> 
		    <span class="hl str">&quot; -o PageSize=</span><span class="hl ipl">$pagesize</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl slc"># Do not embed the following messages in the add-printer</span>
	    <span class="hl slc"># wizard.</span>
	    <span class="hl kwc">local</span> <span class="hl opt">$::</span>isWizard <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	    <span class="hl slc"># oki4w driver -&gt; OKI winprinter which needs the</span>
	    <span class="hl slc"># oki4daemon to work</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;oki4w&apos;</span><span class="hl opt">) {</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} !~</span> 
		    <span class="hl kwd">m!^(parallel|file):/dev/lp0$!</span><span class="hl opt">) {</span>
		    <span class="hl opt">$::</span>noX <span class="hl opt">||</span> 
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;OKI winprinter configuration&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;You are configuring an OKI laser winprinter. These printers</span><span class="hl esc">\n</span><span class="hl str">use a very special communication protocol and therefore they work only when connected to the first parallel port. When your printer is connected to another port or to a print server box please connect the printer to the first parallel port before you print a test page. Otherwise the printer will not work. Your connection type setting will be ignored by the driver.&quot;</span><span class="hl opt">));</span>
		<span class="hl opt">}</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&apos;file:/dev/null&apos;</span><span class="hl opt">;</span>
		<span class="hl slc"># Start the oki4daemon</span>
		services<span class="hl opt">::</span>start_service_on_boot<span class="hl opt">(</span><span class="hl str">&apos;oki4daemon&apos;</span><span class="hl opt">);</span>
		printer<span class="hl opt">::</span>services<span class="hl opt">::</span>start<span class="hl opt">(</span><span class="hl str">&apos;oki4daemon&apos;</span><span class="hl opt">);</span>
		<span class="hl slc"># Set permissions</span>
		
		<span class="hl kwc">my</span> <span class="hl kwb">$h</span> <span class="hl opt">= {</span>
		    cups <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/dev/oki4drv&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;660&apos;</span><span class="hl opt">,</span> 
						  <span class="hl str">&apos;lp&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">) },</span>
		    pdq  <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/dev/oki4drv&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;666&apos;</span><span class="hl opt">) }</span>
		<span class="hl opt">};</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$s</span> <span class="hl opt">=</span> <span class="hl kwb">$h</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}} ||=</span> 
		    <span class="hl kwa">sub</span> <span class="hl opt">{</span> set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/dev/oki4drv&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;660&apos;</span><span class="hl opt">,</span>
					  <span class="hl str">&apos;lp&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">) };</span>
		<span class="hl opt">&amp;</span><span class="hl kwb">$s</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;lexmarkinkjet&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># Set &quot;Port&quot; option</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$opt</span> <span class="hl opt">=</span>
		    <span class="hl kwb">$lexmarkinkjet_options</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">}};</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$opt</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPECIAL_OPTIONS<span class="hl opt">} .=</span> <span class="hl kwb">$opt</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl opt">$::</span>noX <span class="hl opt">||</span> 
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Lexmark inkjet configuration&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;The inkjet printer drivers provided by Lexmark only support local printers, no printers on remote machines or print server boxes. Please connect your printer to a local port or configure it on the machine where it is connected to.&quot;</span><span class="hl opt">));</span>
		    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Set device permissions</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> 
		    <span class="hl kwd">/^\s*(file|parallel|usb):(\S*)\s*$/</span><span class="hl opt">) {</span>
              <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">) {</span>
                  set_permissions<span class="hl opt">(</span><span class="hl kwb">$2,</span> <span class="hl str">&apos;660&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">);</span>
              <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;pdq&apos;</span><span class="hl opt">) {</span>
                  set_permissions<span class="hl opt">(</span><span class="hl kwb">$2,</span> <span class="hl str">&apos;666&apos;</span><span class="hl opt">);</span>
              <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
                  set_permissions<span class="hl opt">(</span><span class="hl kwb">$2,</span> <span class="hl str">&apos;660&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">);</span>
              <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># This is needed to have the device not blocked by the</span>
		<span class="hl slc"># spooler backend.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&apos;file:/dev/null&apos;</span><span class="hl opt">;</span>
		<span class="hl slc">#install packages</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$drivertype</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>model<span class="hl opt">};</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$drivertype</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;Z22&apos;</span><span class="hl opt">) {</span> <span class="hl kwb">$drivertype</span> <span class="hl opt">=</span> <span class="hl str">&apos;Z32&apos;</span> <span class="hl opt">}</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$drivertype</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;Z23&apos;</span><span class="hl opt">) {</span> <span class="hl kwb">$drivertype</span> <span class="hl opt">=</span> <span class="hl str">&apos;Z33&apos;</span> <span class="hl opt">}</span>
		<span class="hl kwb">$drivertype</span> <span class="hl opt">=</span> <span class="hl kwc">lc</span><span class="hl opt">(</span><span class="hl kwb">$drivertype</span><span class="hl opt">);</span>
		<span class="hl kwa">if</span> <span class="hl opt">(!</span>files_exist<span class="hl opt">(</span><span class="hl str">&quot;/usr/local/lexmark/</span><span class="hl ipl">$drivertype/$drivertype</span><span class="hl str">&quot;</span><span class="hl opt">)) {</span>
		    <span class="hl kwc">eval</span> <span class="hl opt">{ $::</span>noX <span class="hl kwc">or</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&quot;lexmark-drivers-</span><span class="hl ipl">$drivertype</span><span class="hl str">&quot;</span><span class="hl opt">) };</span>
		<span class="hl opt">}</span>
		<span class="hl kwa">if</span> <span class="hl opt">(!</span>files_exist<span class="hl opt">(</span><span class="hl str">&quot;/usr/local/lexmark/</span><span class="hl ipl">$drivertype/$drivertype</span><span class="hl str">&quot;</span><span class="hl opt">)) {</span>
		    <span class="hl slc"># Driver installation failed, probably we do not have</span>
		    <span class="hl slc"># the commercial CDs</span>
		    <span class="hl opt">$::</span>noX <span class="hl opt">||</span> 
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Lexmark inkjet configuration&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;To be able to print with your Lexmark inkjet and this configuration, you need the inkjet printer drivers provided by Lexmark (http://www.lexmark.com/). Click on the</span> <span class="hl esc">\&quot;</span><span class="hl str">Drivers</span><span class="hl esc">\&quot;</span> <span class="hl str">link. Then choose your model and afterwards</span> <span class="hl esc">\&quot;</span><span class="hl str">Linux</span><span class="hl esc">\&quot;</span> <span class="hl str">as operating system. The drivers come as RPM packages or shell scripts with interactive graphical installation. You do not need to do this configuration by the graphical frontends. Cancel directly after the license agreement. Then print printhead alignment pages with</span> <span class="hl esc">\&quot;</span><span class="hl str">lexmarkmaintain</span><span class="hl esc">\&quot;</span> <span class="hl str">and adjust the head alignment settings with this program.&quot;</span><span class="hl opt">));</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;drv_x125&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># Set &quot;Device&quot; option</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$opt</span> <span class="hl opt">=</span>
		    <span class="hl kwb">$drv_x125_options</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">}};</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$opt</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPECIAL_OPTIONS<span class="hl opt">} .=</span> <span class="hl kwb">$opt</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl opt">$::</span>noX <span class="hl opt">||</span> 
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Lexmark X125 configuration&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;The driver for this printer only supports printers locally connected via USB, no printers on remote machines or print server boxes. Please connect your printer to a local USB port or configure it on the machine where it is connected to.&quot;</span><span class="hl opt">));</span>
		    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Set device permissions</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> 
		    <span class="hl kwd">/^\s*(file|parallel|usb):(\S*)\s*$/</span><span class="hl opt">) {</span>
              <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">) {</span>
                  set_permissions<span class="hl opt">(</span><span class="hl kwb">$2,</span> <span class="hl str">&apos;660&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">);</span>
              <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;pdq&apos;</span><span class="hl opt">) {</span>
                  set_permissions<span class="hl opt">(</span><span class="hl kwb">$2,</span> <span class="hl str">&apos;666&apos;</span><span class="hl opt">);</span>
              <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
                  set_permissions<span class="hl opt">(</span><span class="hl kwb">$2,</span> <span class="hl str">&apos;660&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">);</span>
              <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># This is needed to have the device not blocked by the</span>
		<span class="hl slc"># spooler backend.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&apos;file:/dev/null&apos;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;ml85p&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># Check whether printer is on first parallel port</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} !~</span>
		    <span class="hl kwd">m!^\s*(parallel|file):/dev/(lp|printers/)0\s*$!</span><span class="hl opt">) {</span>
		    <span class="hl opt">$::</span>noX <span class="hl opt">||</span> 
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Samsung ML/QL-85G configuration&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;The driver for this printer only supports printers locally connected on the first parallel port, no printers on remote machines or print server boxes or on other parallel ports. Please connect your printer to the first parallel port or configure it on the machine where it is connected to.&quot;</span><span class="hl opt">));</span>
		    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Set driver executable permissions</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">) {</span>
		    set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/ml85p&apos;</span><span class="hl opt">,</span> 
				    <span class="hl str">&apos;4750&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;root&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;pdq&apos;</span><span class="hl opt">) {</span>
		    set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/ml85p&apos;</span><span class="hl opt">,</span> 
				    <span class="hl str">&apos;4755&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;root&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/ml85p&apos;</span><span class="hl opt">,</span> 
				    <span class="hl str">&apos;4750&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;root&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># This is needed to have the device not blocked by the</span>
		<span class="hl slc"># spooler backend.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&apos;file:/dev/null&apos;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">} =~</span>
		      <span class="hl kwd">m!^\s*lbp[46]60\s*$!</span><span class="hl opt">) ||</span> 
		     <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">} &amp;&amp;</span> 
		      <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">} =~</span> 
		       <span class="hl kwd">m!Canon-LBP-[46]60-lbp[46]60.ppd!</span><span class="hl opt">))) {</span>
		<span class="hl slc"># Check whether printer is on first parallel port</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} !~</span>
		    <span class="hl kwd">m!^\s*(parallel|file):/dev/(lp|printers/)0\s*$!</span><span class="hl opt">) {</span>
		    <span class="hl opt">$::</span>noX <span class="hl opt">||</span> 
			<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Canon LBP-460/660 configuration&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;The driver for this printer only supports printers locally connected on the first parallel port, no printers on remote machines or print server boxes or on other parallel ports. Please connect your printer to the first parallel port or configure it on the machine where it is connected to.&quot;</span><span class="hl opt">));</span>
		    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># Set driver executable permissions</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">) {</span>
		    set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/lbp660&apos;</span><span class="hl opt">,</span> 
				    <span class="hl str">&apos;4750&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;root&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;pdq&apos;</span><span class="hl opt">) {</span>
		    set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/lbp660&apos;</span><span class="hl opt">,</span> 
				    <span class="hl str">&apos;4755&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;root&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;sys&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    set_permissions<span class="hl opt">(</span><span class="hl str">&apos;/usr/bin/lbp660&apos;</span><span class="hl opt">,</span> 
				    <span class="hl str">&apos;4750&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;root&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;lp&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span>
		<span class="hl slc"># This is needed to have the device not blocked by the</span>
		<span class="hl slc"># spooler backend.</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =</span> <span class="hl str">&apos;file:/dev/null&apos;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>printer<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;HP-LaserJet_1000&apos;</span><span class="hl opt">) {</span>
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Firmware-Upload for HP LaserJet 1000&quot;</span><span class="hl opt">),</span>
			      <span class="hl kwb">$hp1000fwtext</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>foomatic<span class="hl opt">}) {</span> <span class="hl slc"># Foomatic queue?</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">} =</span> 
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_foomatic_options<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>  <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">}) {</span> <span class="hl slc"># PPD queue?</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">} =</span>
		    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_ppd_options<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwc">delete</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPECIAL_OPTIONS<span class="hl opt">});</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setup_options <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;simple_options</span> <span class="hl opt">=</span> 
	<span class="hl opt">(</span><span class="hl str">&quot;PageSize&quot;</span><span class="hl opt">,</span>        <span class="hl slc"># Media properties</span>
	 <span class="hl str">&quot;MediaType&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Form&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;InputSlot&quot;</span><span class="hl opt">,</span>       <span class="hl slc"># Trays</span>
	 <span class="hl str">&quot;Tray&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;OutBin&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;OutputBin&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;FaceUp&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;FaceDown&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Collate&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Manual&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;ManualFeed&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Manualfeed&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;ManualFeeder&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Feeder&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Duplex&quot;</span><span class="hl opt">,</span>          <span class="hl slc"># Double-sided printing</span>
	 <span class="hl str">&quot;Binding&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Tumble&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;DoubleSided&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Resolution&quot;</span><span class="hl opt">,</span>      <span class="hl slc"># Resolution/Quality</span>
	 <span class="hl str">&quot;GSResolution&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;HWResolution&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;JCLResolution&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Quality&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;PrintQuality&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;PrintoutQuality&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;QualityType&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;ImageType&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;stpImageType&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;EconoMode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;JCLEconoMode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;FastRes&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;JCLFastRes&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;InkType&quot;</span><span class="hl opt">,</span>         <span class="hl slc"># Colour/Gray/BW, 4-ink/6-ink</span>
	 <span class="hl str">&quot;stpInkType&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Mode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;OutputMode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;OutputType&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;ColorMode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;ColorModel&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;PrintingMode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Monochrome&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;BlackOnly&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Grayscale&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;GrayScale&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Colour&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Color&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Gamma&quot;</span><span class="hl opt">,</span>           <span class="hl slc"># Lighter/Darker</span>
	 <span class="hl str">&quot;GammaCorrection&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;GammaGeneral&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;MasterGamma&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;StpGamma&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;stpGamma&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;EconoMode&quot;</span><span class="hl opt">,</span>       <span class="hl slc"># Ink/Toner saving</span>
	 <span class="hl str">&quot;Economode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;TonerSaving&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;JCLEconomode&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;HPNup&quot;</span><span class="hl opt">,</span>           <span class="hl slc"># Other useful options</span>
	 <span class="hl str">&quot;InstalledMemory&quot;</span><span class="hl opt">,</span> <span class="hl slc"># Laser printer hardware config</span>
	 <span class="hl str">&quot;Option1&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option2&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option3&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option4&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option5&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option6&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option7&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option8&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option9&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option10&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option11&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option12&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option13&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option14&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option15&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option16&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option17&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option18&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option19&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option20&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option21&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option22&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option23&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option24&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option25&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option26&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option27&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option28&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option29&quot;</span><span class="hl opt">,</span>
	 <span class="hl str">&quot;Option30&quot;</span>
	 <span class="hl opt">);</span>
<span class="hl slc">#    $in-&gt;set_help(&apos;setupOptions&apos;) if $::isInstall;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>printer<span class="hl opt">} ||</span> <span class="hl slc"># We have a Foomatic queue</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">}) {</span> <span class="hl slc"># We have a CUPS+PPD queue</span>
	<span class="hl slc"># Set up the widgets for the option dialog</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$helptext</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer default settings</span>
<span class="hl str"></span>
<span class="hl str">You should make sure that the page size and the ink type/printing mode (if available) and also the hardware configuration of laser printers (memory, duplex unit, extra trays) are set correctly. Note that with a very high printout quality/resolution printing can get substantially slower.&quot;</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;widgets</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;userinputs</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;choicelists</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;shortchoicelists</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$i</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;oldgroup</span> <span class="hl opt">= (</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">);</span>
	<span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$i</span> <span class="hl opt">&lt;=</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}};</span> <span class="hl kwb">$i++</span><span class="hl opt">) {</span>
	    <span class="hl slc"># Do not show hidden options (member options of a forced</span>
	    <span class="hl slc"># composite option)</span>
	    <span class="hl kwa">next if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>hidden<span class="hl opt">};</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$optshortdefault</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span><span class="hl kwa">default</span><span class="hl opt">};</span>
	    <span class="hl slc"># Should the option only show when the &quot;Advanced&quot; button was</span>
	    <span class="hl slc"># clicked?</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$advanced</span> <span class="hl opt">= ((</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>group<span class="hl opt">}) &amp;&amp;</span>
			     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>group<span class="hl opt">} !~</span>
			      <span class="hl kwd">/^(|General|.*install.*)$/i</span><span class="hl opt">) ||</span>
			    <span class="hl opt">(!(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>group<span class="hl opt">}) &amp;&amp;</span>
			     <span class="hl opt">!</span>member<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name<span class="hl opt">},</span>
				     <span class="hl kwb">&#64;simple_options</span><span class="hl opt">))</span> ? <span class="hl num">1</span> <span class="hl opt">:</span> <span class="hl num">0</span><span class="hl opt">);</span>
	    <span class="hl slc"># Group header</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>group<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl kwb">$oldgroup</span><span class="hl opt">[</span><span class="hl kwb">$advanced</span><span class="hl opt">]) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$_level</span> <span class="hl opt">=</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>grouptrans<span class="hl opt">}};</span>
		<span class="hl kwb">$oldgroup</span><span class="hl opt">[</span><span class="hl kwb">$advanced</span><span class="hl opt">] =</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>group<span class="hl opt">};</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>group<span class="hl opt">}) {</span>
		    <span class="hl kwc">push</span><span class="hl opt">(</span><span class="hl kwb">&#64;widgets,</span>
			 <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> 
			   <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&quot; / &quot;</span><span class="hl opt">, &#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>grouptrans<span class="hl opt">}}),</span>
			   advanced <span class="hl opt">=&gt;</span> <span class="hl kwb">$advanced</span> <span class="hl opt">});</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;enum&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># enumerated option</span>
		<span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] = [];</span>
		<span class="hl kwb">$shortchoicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] = [];</span>
		<span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$choice</span> <span class="hl opt">(&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>vals<span class="hl opt">}}) {</span>
		    <span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]},</span> <span class="hl kwb">$choice</span><span class="hl opt">-&gt;{</span>comment<span class="hl opt">});</span>
		    <span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$shortchoicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]},</span> <span class="hl kwb">$choice</span><span class="hl opt">-&gt;{</span>value<span class="hl opt">});</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$choice</span><span class="hl opt">-&gt;{</span>value<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$optshortdefault</span><span class="hl opt">) {</span>
			<span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] =</span> <span class="hl kwb">$choice</span><span class="hl opt">-&gt;{</span>comment<span class="hl opt">};</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
		<span class="hl kwc">push</span><span class="hl opt">(</span><span class="hl kwb">&#64;widgets,</span>
		     <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment<span class="hl opt">},</span> 
		       val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">],</span> 
		       not_edit <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
		       list <span class="hl opt">=&gt;</span> \<span class="hl opt">&#64;{</span><span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]},</span>
		       <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
		       advanced <span class="hl opt">=&gt;</span> <span class="hl kwb">$advanced,</span>
		       help <span class="hl opt">=&gt;</span> <span class="hl kwb">$helptext</span> <span class="hl opt">})</span>
		    <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&apos;PageRegion&apos;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># boolean option</span>
		<span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] = [(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment_true<span class="hl opt">} ||</span>
				     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name<span class="hl opt">} ||</span> <span class="hl str">&quot;Yes&quot;</span><span class="hl opt">),</span>
				    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment_false<span class="hl opt">} ||</span>
				     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name_false<span class="hl opt">} ||</span>
				     <span class="hl str">&quot;No&quot;</span><span class="hl opt">)];</span>
		<span class="hl kwb">$shortchoicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] = [];</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$numdefault</span> <span class="hl opt">=</span> 
		    <span class="hl opt">(</span><span class="hl kwb">$optshortdefault</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^\s*(true|on|yes|1)\s*$!</span> ? 
		     <span class="hl str">&quot;1&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;0&quot;</span><span class="hl opt">);</span>
		<span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] =</span> <span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">][</span><span class="hl num">1</span><span class="hl opt">-</span><span class="hl kwb">$numdefault</span><span class="hl opt">];</span>
		<span class="hl kwc">push</span><span class="hl opt">(</span><span class="hl kwb">&#64;widgets,</span>
		     <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment<span class="hl opt">},</span>
		       val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">],</span>
		       not_edit <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
		       list <span class="hl opt">=&gt;</span> \<span class="hl opt">&#64;{</span><span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]},</span>
		       <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
		       advanced <span class="hl opt">=&gt;</span> <span class="hl kwb">$advanced,</span>
		       help <span class="hl opt">=&gt;</span> <span class="hl kwb">$helptext</span> <span class="hl opt">});</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl slc"># numerical option</span>
		<span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] = [];</span>
		<span class="hl kwb">$shortchoicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] = [];</span>
		<span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] =</span> <span class="hl kwb">$optshortdefault</span><span class="hl opt">;</span>
		<span class="hl kwc">push</span><span class="hl opt">(</span><span class="hl kwb">&#64;widgets,</span>
		     <span class="hl opt">{</span> label <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment<span class="hl opt">} .</span> 
			   <span class="hl str">&quot; (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{ARGS}[</span><span class="hl ipl">$i</span><span class="hl str">]{min}... &quot;</span> <span class="hl opt">.</span>
			       <span class="hl str">&quot;</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{ARGS}[</span><span class="hl ipl">$i</span><span class="hl str">]{max})&quot;</span><span class="hl opt">,</span>
			   <span class="hl slc">#type =&gt; &apos;range&apos;,</span>
			   <span class="hl slc">#min =&gt; $printer-&gt;{ARGS}[$i]{min},</span>
			   <span class="hl slc">#max =&gt; $printer-&gt;{ARGS}[$i]{max},</span>
			   val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">],</span>
			   advanced <span class="hl opt">=&gt;</span> <span class="hl kwb">$advanced,</span>
			   help <span class="hl opt">=&gt;</span> <span class="hl kwb">$helptext</span> <span class="hl opt">});</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Show the options dialog. The call-back function does a</span>
	<span class="hl slc"># range check of the numerical options.</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$windowtitle</span> <span class="hl opt">=</span> <span class="hl str">&quot;</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{make}</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{model}&quot;</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$driver</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$driver</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>driver<span class="hl opt">}) {</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>foomatic<span class="hl opt">}) {</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$driver</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;Postscript&apos;</span><span class="hl opt">) {</span>
			<span class="hl kwb">$driver</span> <span class="hl opt">=</span> <span class="hl str">&quot;PostScript&quot;</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			<span class="hl kwb">$driver</span> <span class="hl opt">=</span> <span class="hl str">&quot;GhostScript +</span> <span class="hl ipl">$driver</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>ppd<span class="hl opt">}) {</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">}) {</span>
			<span class="hl kwb">$driver</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =~</span> <span class="hl kwd">/^[^\|]*\|[^\|]*\|(.*)$/</span><span class="hl opt">;</span>
		    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			<span class="hl kwb">$driver</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>get_descr_from_ppd<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$driver</span> <span class="hl opt">=~</span> <span class="hl kwd">/^[^\|]*\|[^\|]*$/</span><span class="hl opt">) {</span> <span class="hl slc"># No driver info</span>
			    <span class="hl kwb">$driver</span> <span class="hl opt">=</span> <span class="hl str">&quot;PPD&quot;</span><span class="hl opt">;</span>
			<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
			    <span class="hl kwb">$driver</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl kwa">if</span> <span class="hl kwb">$driver</span> <span class="hl opt">=~</span> <span class="hl kwd">/^[^\|]*\|[^\|]*\|(.*)$/</span><span class="hl opt">;</span>
			<span class="hl opt">}</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> 
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$driver</span><span class="hl opt">) {</span>
		<span class="hl kwb">$windowtitle</span> <span class="hl opt">.=</span> <span class="hl str">&quot;,</span> <span class="hl ipl">$driver</span><span class="hl str">&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Do not show the options setup dialog when installing a new printer</span>
	<span class="hl slc"># in recommended mode without &quot;Manual configuration&quot; turned on.</span>
	<span class="hl kwa">if</span> <span class="hl opt">((!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">}) &amp;&amp;</span>
	    <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>noninteractive<span class="hl opt">}) {</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from</span><span class="hl opt">(</span>
		 <span class="hl kwb">$windowtitle,</span>
		 N<span class="hl opt">(</span><span class="hl str">&quot;Printer default settings&quot;</span><span class="hl opt">),</span>
		 \<span class="hl kwb">&#64;widgets,</span>
		 complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		     <span class="hl kwc">my</span> <span class="hl kwb">$i</span><span class="hl opt">;</span>
		     <span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$i</span> <span class="hl opt">&lt;=</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}};</span> <span class="hl kwb">$i++</span><span class="hl opt">) {</span>
			 <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;int&apos;</span> <span class="hl opt">||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;float&apos;</span><span class="hl opt">) {</span>
			     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;int&apos;</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] !~</span> <span class="hl kwd">/^[\-\+]?[0-9]+$/</span><span class="hl opt">) {</span>
				 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Option</span> <span class="hl ipl">%s</span> <span class="hl str">must be an integer number!&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment<span class="hl opt">}));</span>
				 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">$i</span><span class="hl opt">;</span>
			     <span class="hl opt">}</span>
			     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;float&apos;</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] !~</span> <span class="hl kwd">/^[\-\+]?[0-9\.]+$/</span><span class="hl opt">) {</span>
				 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Option</span> <span class="hl ipl">%s</span> <span class="hl str">must be a number!&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment<span class="hl opt">}));</span>
				 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">$i</span><span class="hl opt">;</span>
			     <span class="hl opt">}</span>
			     <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] &lt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>min<span class="hl opt">} ||</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">] &gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>max<span class="hl opt">}) {</span>
				 <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Option</span> <span class="hl ipl">%s</span> <span class="hl str">out of range!&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>comment<span class="hl opt">}));</span>
				 <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">$i</span><span class="hl opt">;</span>
			     <span class="hl opt">}</span>
			 <span class="hl opt">}</span>
		     <span class="hl opt">}</span>
		     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		 <span class="hl opt">});</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Read out the user&apos;s choices and generate the appropriate command</span>
	<span class="hl slc"># line arguments</span>
	<span class="hl opt">&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>options<span class="hl opt">}} = ();</span>
	<span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$i</span> <span class="hl opt">&lt;=</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}};</span> <span class="hl kwb">$i++</span><span class="hl opt">) {</span>
	    <span class="hl slc"># We did not show hidden options, so we do not have user input </span>
	    <span class="hl slc"># to add to the option list</span>
	    <span class="hl kwa">next if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>hidden<span class="hl opt">};</span>
	    <span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>options<span class="hl opt">}},</span> <span class="hl str">&quot;-o&quot;</span><span class="hl opt">);</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;enum&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># enumerated option</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$j</span><span class="hl opt">;</span>
		<span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwb">$j</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$j</span> <span class="hl opt">&lt;=</span> <span class="hl kwb">$#</span><span class="hl opt">{</span><span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]};</span> <span class="hl kwb">$j++</span><span class="hl opt">) {</span>
		    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">][</span><span class="hl kwb">$j</span><span class="hl opt">]</span> <span class="hl kwc">eq</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]) {</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span><span class="hl kwa">default</span><span class="hl opt">} =</span>
			    <span class="hl kwb">$shortchoicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">][</span><span class="hl kwb">$j</span><span class="hl opt">];</span>
			<span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>options<span class="hl opt">}},</span>
			     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name<span class="hl opt">} .</span> <span class="hl str">&quot;=&quot;</span> <span class="hl opt">.</span>
			     <span class="hl kwb">$shortchoicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">][</span><span class="hl kwb">$j</span><span class="hl opt">]);</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">) {</span>
		<span class="hl slc"># boolean option</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$v</span> <span class="hl opt">=</span> 
		    <span class="hl opt">(</span><span class="hl kwb">$choicelists</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">][</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl kwc">eq</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]</span> ? <span class="hl str">&quot;1&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;0&quot;</span><span class="hl opt">);</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span><span class="hl kwa">default</span><span class="hl opt">} =</span> <span class="hl kwb">$v</span><span class="hl opt">;</span>
		<span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>options<span class="hl opt">}},</span>
		     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name<span class="hl opt">} .</span> <span class="hl str">&quot;=&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$v</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl slc"># numerical option</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span><span class="hl kwa">default</span><span class="hl opt">} =</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">];</span>
		<span class="hl kwc">push</span><span class="hl opt">(&#64;{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>options<span class="hl opt">}},</span>
		     <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>ARGS<span class="hl opt">}[</span><span class="hl kwb">$i</span><span class="hl opt">]{</span>name<span class="hl opt">} .</span> <span class="hl str">&quot;=&quot;</span> <span class="hl opt">.</span> <span class="hl kwb">$userinputs</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> setasdefault <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
<span class="hl slc">#    $in-&gt;set_help(&apos;setupAsDefault&apos;) if $::isInstall;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;&apos;</span> <span class="hl opt">||</span> <span class="hl slc"># We have no default printer,</span>
	                             <span class="hl slc"># so set the current one as default</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Do you want to set this printer (</span><span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">)</span><span class="hl esc">\n</span>as the <span class="hl kwa">default</span> printer?<span class="hl str">&quot;,</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE}), 0)) { # Ask the user</span>
<span class="hl str"></span>	<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE};</span>
<span class="hl str">        printer::default::set_printer(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">    }</span>
<span class="hl str">}</span>
<span class="hl str">	</span>
<span class="hl str">sub print_testpages {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$upNetwork</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;printTestPages&apos;) if $::isInstall;</span>
<span class="hl str">    # print test pages</span>
<span class="hl str">    my</span> <span class="hl ipl">$res2</span> <span class="hl str">= 0;</span>
<span class="hl str">    my</span> <span class="hl ipl">%options</span> <span class="hl str">= (alta4 =&gt; 0, altletter =&gt; 0, ascii =&gt; 0, photo =&gt; 0, standard =&gt; 1);</span>
<span class="hl str">    my</span> <span class="hl ipl">%old_options</span> <span class="hl str">= (alta4 =&gt; 0, altletter =&gt; 0, ascii =&gt; 0, photo =&gt; 0, standard =&gt; 1);</span>
<span class="hl str">    my</span> <span class="hl ipl">$oldres2</span> <span class="hl str">= 0;</span>
<span class="hl str">    my</span> <span class="hl ipl">$res1</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_(</span>
<span class="hl str">	 { title =&gt; N(&quot;</span>Test pages<span class="hl str">&quot;),</span>
<span class="hl str">	   messages =&gt; N(&quot;</span>Please <span class="hl kwc">select</span> the test pages you want to <span class="hl kwc">print</span><span class="hl opt">.</span>
Note<span class="hl opt">:</span> the photo test page can <span class="hl kwa">take</span> a rather long <span class="hl kwc">time</span> to get printed <span class="hl kwc">and</span> on laser printers with too low memory it can even <span class="hl kwc">not</span> come out<span class="hl opt">.</span> In most cases it <span class="hl kwa">is</span> enough to <span class="hl kwc">print</span> the standard test page<span class="hl opt">.</span><span class="hl str">&quot;),</span>
<span class="hl str">	   cancel =&gt; (!</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{NEW} ?</span>
<span class="hl str">		       N(&quot;</span>Cancel<span class="hl str">&quot;) : ($::isWizard ? N(&quot;</span>Previous<span class="hl str">&quot;) : </span>
<span class="hl str">				      N(&quot;</span>No test pages<span class="hl str">&quot;))),</span>
<span class="hl str">	   ok =&gt; ($::isWizard ? N(&quot;</span>Next<span class="hl str">&quot;) : N(&quot;</span>Print<span class="hl str">&quot;)),</span>
<span class="hl str">	   callbacks =&gt; {</span>
<span class="hl str">	       changed =&gt; sub {</span>
<span class="hl str">		   if (</span><span class="hl ipl">$oldres2</span> <span class="hl str">ne</span> <span class="hl ipl">$res2</span><span class="hl str">) {</span>
<span class="hl str">		       if (</span><span class="hl ipl">$res2</span><span class="hl str">) {</span>
<span class="hl str">				 foreach my</span> <span class="hl ipl">$opt</span> <span class="hl str">(keys</span> <span class="hl ipl">%options</span><span class="hl str">) {</span>
<span class="hl str"></span>					<span class="hl ipl">$options</span><span class="hl str">{</span><span class="hl ipl">$opt</span><span class="hl str">} = 0;</span>
<span class="hl str"></span>					<span class="hl ipl">$old_options</span><span class="hl str">{</span><span class="hl ipl">$opt</span><span class="hl str">} = 0;</span>
<span class="hl str">				 }</span>
<span class="hl str">		       }</span>
<span class="hl str"></span>		       <span class="hl ipl">$oldres2</span> <span class="hl str">=</span> <span class="hl ipl">$res2</span><span class="hl str">;</span>
<span class="hl str">		   }</span>
<span class="hl str">		   foreach my</span> <span class="hl ipl">$opt</span> <span class="hl str">(keys</span> <span class="hl ipl">%options</span><span class="hl str">) {</span>
<span class="hl str">			  if (</span><span class="hl ipl">$old_options</span><span class="hl str">{</span><span class="hl ipl">$opt</span><span class="hl str">} ne</span> <span class="hl ipl">$options</span><span class="hl str">{</span><span class="hl ipl">$opt</span><span class="hl str">}) {</span>
<span class="hl str">				 if (</span><span class="hl ipl">$options</span><span class="hl str">{</span><span class="hl ipl">$opt</span><span class="hl str">}) {</span>
<span class="hl str"></span>					<span class="hl ipl">$res2</span> <span class="hl str">= 0;</span>
<span class="hl str"></span>					<span class="hl ipl">$oldres2</span> <span class="hl str">= 0;</span>
<span class="hl str">				 }</span>
<span class="hl str"></span>				 <span class="hl ipl">$old_options</span><span class="hl str">{standard} =</span> <span class="hl ipl">$options</span><span class="hl str">{standard};</span>
<span class="hl str">			  }</span>
<span class="hl str">		   }</span>
<span class="hl str">		   return 0;</span>
<span class="hl str">	       }</span>
<span class="hl str">	   } },</span>
<span class="hl str">	 [</span>
<span class="hl str">	  { text =&gt; N(&quot;</span>Standard test page<span class="hl str">&quot;), type =&gt; &apos;bool&apos;,</span>
<span class="hl str">	    val =&gt; \</span><span class="hl ipl">$options</span><span class="hl str">{standard} },</span>
<span class="hl str">	  if_(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert},</span>
<span class="hl str">	   { text =&gt; N(&quot;</span>Alternative test page <span class="hl opt">(</span>Letter<span class="hl opt">)</span><span class="hl str">&quot;), type =&gt; &apos;bool&apos;, </span>
<span class="hl str">	     val =&gt; \</span><span class="hl ipl">$options</span><span class="hl str">{altletter} }),</span>
<span class="hl str">	  if_(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{expert},</span>
<span class="hl str">	   { text =&gt; N(&quot;</span>Alternative test page <span class="hl opt">(</span>A4<span class="hl opt">)</span><span class="hl str">&quot;), type =&gt; &apos;bool&apos;, </span>
<span class="hl str">	     val =&gt; \</span><span class="hl ipl">$options</span><span class="hl str">{alta4} }), </span>
<span class="hl str">	  { text =&gt; N(&quot;</span>Photo test page<span class="hl str">&quot;), type =&gt; &apos;bool&apos;, val =&gt; \</span><span class="hl ipl">$options</span><span class="hl str">{photo} },</span>
<span class="hl str">	  #{ text =&gt; N(&quot;</span>Plain text test page<span class="hl str">&quot;), type =&gt; &apos;bool&apos;,</span>
<span class="hl str">	  #  val =&gt; \</span><span class="hl ipl">$options</span><span class="hl str">{ascii} }</span>
<span class="hl str">	  if_($::isWizard,</span>
<span class="hl str">	   { text =&gt; N(&quot;</span>Do <span class="hl kwc">not print</span> any test page<span class="hl str">&quot;), type =&gt; &apos;bool&apos;, </span>
<span class="hl str">	     val =&gt; \</span><span class="hl ipl">$res2</span> <span class="hl str">})</span>
<span class="hl str">	  ]);</span>
<span class="hl str"></span>    <span class="hl ipl">$res2</span> <span class="hl str">= 1 if !(</span><span class="hl ipl">$options</span><span class="hl str">{standard} ||</span> <span class="hl ipl">$options</span><span class="hl str">{altletter} ||</span> <span class="hl ipl">$options</span><span class="hl str">{alta4} ||</span> <span class="hl ipl">$options</span><span class="hl str">{photo} ||</span> <span class="hl ipl">$options</span><span class="hl str">{ascii});</span>
<span class="hl str">    if (</span><span class="hl ipl">$res1</span> <span class="hl str">&amp;&amp; !</span><span class="hl ipl">$res2</span><span class="hl str">) {</span>
<span class="hl str">	my</span> <span class="hl ipl">&#64;lpq_output</span><span class="hl str">;</span>
<span class="hl str">	{</span>
<span class="hl str">	    my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span>
<span class="hl str">				      N(&quot;</span>Printing test page<span class="hl opt">(</span>s<span class="hl opt">)...</span><span class="hl str">&quot;));</span>
<span class="hl str">	    </span>
<span class="hl str"></span>	    <span class="hl ipl">$upNetwork</span> <span class="hl str">and do { &amp;</span><span class="hl ipl">$upNetwork</span><span class="hl str">(); undef</span> <span class="hl ipl">$upNetwork</span><span class="hl str">; sleep(1) };</span>
<span class="hl str">	    my</span> <span class="hl ipl">$stdtestpage</span> <span class="hl str">= &quot;</span><span class="hl kwd">/usr/s</span>hare<span class="hl kwd">/printer-testpages/</span>testprint<span class="hl opt">.</span>ps<span class="hl str">&quot;;</span>
<span class="hl str">	    my</span> <span class="hl ipl">$altlttestpage</span> <span class="hl str">= &quot;</span><span class="hl kwd">/usr/s</span>hare<span class="hl kwd">/printer-testpages/</span>testpage<span class="hl opt">.</span>ps<span class="hl str">&quot;;</span>
<span class="hl str">	    my</span> <span class="hl ipl">$alta4testpage</span> <span class="hl str">= &quot;</span><span class="hl kwd">/usr/s</span>hare<span class="hl kwd">/printer-testpages/</span>testpage-a4<span class="hl opt">.</span>ps<span class="hl str">&quot;;</span>
<span class="hl str">	    my</span> <span class="hl ipl">$phototestpage</span> <span class="hl str">= &quot;</span><span class="hl kwd">/usr/s</span>hare<span class="hl kwd">/printer-testpages/p</span>hoto<span class="hl opt">-</span>testpage<span class="hl opt">.</span>jpg<span class="hl str">&quot;;</span>
<span class="hl str">	    my</span> <span class="hl ipl">$asciitestpage</span> <span class="hl str">= &quot;</span><span class="hl kwd">/usr/s</span>hare<span class="hl kwd">/printer-testpages/</span>testpage<span class="hl opt">.</span>asc<span class="hl str">&quot;;</span>
<span class="hl str">	    my</span> <span class="hl ipl">&#64;testpages</span><span class="hl str">;</span>
<span class="hl str">	    # Install the filter to convert the photo test page to PS</span>
<span class="hl str">	    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER} ne &quot;</span>cups<span class="hl str">&quot; &amp;&amp;</span> <span class="hl ipl">$options</span><span class="hl str">{photo} &amp;&amp; !$::testing &amp;&amp;</span>
<span class="hl str">		!files_exist(&apos;/usr/bin/convert&apos;)) {</span>
<span class="hl str"></span>		<span class="hl ipl">$in</span><span class="hl str">-&gt;do_pkgs-&gt;install(&apos;ImageMagick&apos;)</span>
<span class="hl str">		    or do {</span>
<span class="hl str">			# Do not embed this message in the add-printer</span>
<span class="hl str">			# wizard.</span>
<span class="hl str">			local $::isWizard = 0;</span>
<span class="hl str"></span>			<span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Warning<span class="hl str">&quot;),</span>
<span class="hl str">				      N(&quot;</span>Could <span class="hl kwc">not</span> install the <span class="hl kwb">%s</span> <span class="hl kwa">package</span><span class="hl opt">!</span><span class="hl str">&quot;,</span>
<span class="hl str">					&quot;</span>ImageMagick<span class="hl str">&quot;) . &quot;</span> <span class="hl str">&quot; .</span>
<span class="hl str">				      N(&quot;</span>Skipping photo test page<span class="hl opt">.</span><span class="hl str">&quot;));</span>
<span class="hl str"></span>			<span class="hl ipl">$options</span><span class="hl str">{photo} = 0;</span>
<span class="hl str">		    };</span>
<span class="hl str">	    }</span>
<span class="hl str">	    # set up list of pages to print</span>
<span class="hl str"></span>	    <span class="hl ipl">$options</span><span class="hl str">{standard} and push</span> <span class="hl ipl">&#64;testpages,</span> <span class="hl str"></span><span class="hl ipl">$stdtestpage</span><span class="hl str">;</span>
<span class="hl str"></span>	    <span class="hl ipl">$options</span><span class="hl str">{altletter} and push</span> <span class="hl ipl">&#64;testpages,</span> <span class="hl str"></span><span class="hl ipl">$altlttestpage</span><span class="hl str">;</span>
<span class="hl str"></span>	    <span class="hl ipl">$options</span><span class="hl str">{alta4} and push</span> <span class="hl ipl">&#64;testpages,</span> <span class="hl str"></span><span class="hl ipl">$alta4testpage</span><span class="hl str">;</span>
<span class="hl str"></span>	    <span class="hl ipl">$options</span><span class="hl str">{photo} and push</span> <span class="hl ipl">&#64;testpages,</span> <span class="hl str"></span><span class="hl ipl">$phototestpage</span><span class="hl str">;</span>
<span class="hl str"></span>	    <span class="hl ipl">$options</span><span class="hl str">{ascii} and push</span> <span class="hl ipl">&#64;testpages,</span> <span class="hl str"></span><span class="hl ipl">$asciitestpage</span><span class="hl str">;</span>
<span class="hl str">	    # Nothing to print</span>
<span class="hl str">	    return 1 if</span> <span class="hl ipl">$#testpages</span> <span class="hl str">&lt; 0;</span>
<span class="hl str">	    # print the stuff</span>
<span class="hl str"></span>	    <span class="hl ipl">&#64;lpq_output</span> <span class="hl str">= printer::main::print_pages(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">&#64;testpages</span><span class="hl str">);</span>
<span class="hl str">	}</span>
<span class="hl str">	my</span> <span class="hl ipl">$dialogtext</span><span class="hl str">;</span>
<span class="hl str">	if (</span><span class="hl ipl">&#64;lpq_output</span><span class="hl str">) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$dialogtext</span> <span class="hl str">= N(&quot;</span>Test page<span class="hl opt">(</span>s<span class="hl opt">)</span> have been sent to the printer<span class="hl opt">.</span>
It may <span class="hl kwa">take</span> some <span class="hl kwc">time</span> before the printer starts<span class="hl opt">.</span>
Printing status<span class="hl opt">:</span><span class="hl esc">\n</span><span class="hl kwb">%s\n\n</span><span class="hl str">&quot;,</span> <span class="hl ipl">&#64;lpq_output</span><span class="hl str">);</span>
<span class="hl str">	} else {</span>
<span class="hl str"></span>	    <span class="hl ipl">$dialogtext</span> <span class="hl str">= N(&quot;</span>Test page<span class="hl opt">(</span>s<span class="hl opt">)</span> have been sent to the printer<span class="hl opt">.</span>
It may <span class="hl kwa">take</span> some <span class="hl kwc">time</span> before the printer starts<span class="hl opt">.</span><span class="hl esc">\n</span><span class="hl str">&quot;);</span>
<span class="hl str">	}</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{NEW} == 0) {</span>
<span class="hl str">	    # Do not embed the following messages in the add-printer</span>
<span class="hl str">	    # wizard.</span>
<span class="hl str">	    local $::isWizard = 0;</span>
<span class="hl str"></span>	    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span><span class="hl ipl">$dialogtext</span><span class="hl str">);</span>
<span class="hl str">	    return 1;</span>
<span class="hl str">	} else {</span>
<span class="hl str"></span>	    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_yesorno(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span> <span class="hl ipl">$dialogtext</span> <span class="hl str">. N(&quot;</span>Did it work properly?<span class="hl str">&quot;), 1) </span>
<span class="hl str">		and return 1;</span>
<span class="hl str">	}</span>
<span class="hl str">    } else {</span>
<span class="hl str">	return($::isWizard ?</span> <span class="hl ipl">$res1</span> <span class="hl str">: 1);</span>
<span class="hl str">    }</span>
<span class="hl str">    return 2;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub printer_help {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$spooler</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER};</span>
<span class="hl str"></span>    <span class="hl ipl">$spooler</span> <span class="hl str">= &quot;</span>cups<span class="hl str">&quot; if</span> <span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;</span>rcups<span class="hl str">&quot;;</span>
<span class="hl str">    my</span> <span class="hl ipl">$queue</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE};</span>
<span class="hl str">    my</span> <span class="hl ipl">$default</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT};</span>
<span class="hl str">    my</span> <span class="hl ipl">$raw</span> <span class="hl str">= 0;</span>
<span class="hl str">    my</span> <span class="hl ipl">$cupsremote</span> <span class="hl str">= 0;</span>
<span class="hl str">    my</span> <span class="hl ipl">$scanning</span> <span class="hl str">= &quot;</span><span class="hl str">&quot;;</span>
<span class="hl str">    my</span> <span class="hl ipl">$photocard</span> <span class="hl str">= &quot;</span><span class="hl str">&quot;;</span>
<span class="hl str">    my</span> <span class="hl ipl">$hp11000fw</span> <span class="hl str">= &quot;</span><span class="hl str">&quot;;</span>
<span class="hl str">    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}) {</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{model} eq &quot;</span>Unknown model<span class="hl str">&quot; ||</span>
<span class="hl str"></span>	    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{model} eq N(&quot;</span>Raw printer<span class="hl str">&quot;)) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$raw</span> <span class="hl str">= 1;</span>
<span class="hl str">	}</span>
<span class="hl str">	# Information about scanning with HP&apos;s multi-function devices</span>
<span class="hl str"></span>	<span class="hl ipl">$scanning</span> <span class="hl str">= scanner_help(</span>
<span class="hl str"></span>	     <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{make} . &quot;</span> <span class="hl str">&quot; .</span>
<span class="hl str"></span>	     <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{model}, </span>
<span class="hl str"></span>	     <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{connect});</span>
<span class="hl str">	if (</span><span class="hl ipl">$scanning</span><span class="hl str">) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$scanning</span> <span class="hl str">= &quot;</span><span class="hl esc">\n\n</span><span class="hl kwb">$scanning\n\n</span><span class="hl str">&quot;;</span>
<span class="hl str">	}</span>
<span class="hl str">	# Information about photo card access with HP&apos;s multi-function devices</span>
<span class="hl str"></span>	<span class="hl ipl">$photocard</span> <span class="hl str">= photocard_help(</span>
<span class="hl str"></span>	     <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{make} . &quot;</span> <span class="hl str">&quot; .</span>
<span class="hl str"></span>	     <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{model}, </span>
<span class="hl str"></span>	     <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{connect});</span>
<span class="hl str">	if (</span><span class="hl ipl">$photocard</span><span class="hl str">) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$photocard</span> <span class="hl str">= &quot;</span><span class="hl esc">\n\n</span><span class="hl kwb">$photocard\n\n</span><span class="hl str">&quot;;</span>
<span class="hl str">	}</span>
<span class="hl str">	if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{printer} eq</span>
<span class="hl str">	    &apos;HP-LaserJet_1000&apos;) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$hp11000fw</span> <span class="hl str">= &quot;</span><span class="hl esc">\n\n</span><span class="hl kwb">$hp1000fwtext\n</span><span class="hl str">&quot;;</span>
<span class="hl str">	}</span>
<span class="hl str">    } else {</span>
<span class="hl str"></span>	<span class="hl ipl">$cupsremote</span> <span class="hl str">= 1;</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    my</span> <span class="hl ipl">$dialogtext</span><span class="hl str">;</span>
<span class="hl str">    if (</span><span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;</span>cups<span class="hl str">&quot;) {</span>
<span class="hl str"></span>	<span class="hl ipl">$dialogtext</span> <span class="hl str">=</span>
<span class="hl str">N(&quot;</span>To <span class="hl kwc">print</span> a file from the command line <span class="hl opt">(</span>terminal window<span class="hl opt">)</span> you can either <span class="hl kwa">use</span> the command <span class="hl esc">\&quot;</span><span class="hl kwb">%s</span> <span class="hl opt">&lt;</span>file<span class="hl opt">&gt;</span><span class="hl esc">\&quot;</span> <span class="hl kwc">or</span> a graphical printing tool<span class="hl opt">:</span> <span class="hl esc">\&quot;</span>xpp <span class="hl opt">&lt;</span>file<span class="hl opt">&gt;</span><span class="hl esc">\&quot;</span> <span class="hl kwc">or</span> <span class="hl esc">\&quot;</span>kprinter <span class="hl opt">&lt;</span>file<span class="hl opt">&gt;</span><span class="hl esc">\&quot;</span><span class="hl opt">.</span> The graphical tools allow you to choose the printer <span class="hl kwc">and</span> to modify the option settings easily<span class="hl opt">.</span>
<span class="hl str">&quot;, (</span><span class="hl ipl">$queue</span> <span class="hl str">ne</span> <span class="hl ipl">$default</span> <span class="hl str">? &quot;</span>lpr <span class="hl opt">-</span>P <span class="hl kwb">$queue</span><span class="hl str">&quot; : &quot;</span>lpr<span class="hl str">&quot;)) .</span>
<span class="hl str">N(&quot;</span>These commands you can also <span class="hl kwa">use in</span> the <span class="hl esc">\&quot;</span>Printing command<span class="hl esc">\&quot;</span> field of the printing dialogs of many applications<span class="hl opt">,</span> but here <span class="hl kwa">do</span> <span class="hl kwc">not</span> supply the file name because the file to <span class="hl kwc">print</span> <span class="hl kwa">is</span> provided by the application<span class="hl opt">.</span>
<span class="hl str">&quot;) .</span>
<span class="hl str">(!</span><span class="hl ipl">$raw</span> <span class="hl str">?</span>
<span class="hl str">N(&quot;</span>
The <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; command also allows to modify the option settings for a particular printing job. Simply add the desired settings to the command line, e. g.</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s</span> <span class="hl str">&lt;file&gt;</span><span class="hl esc">\&quot;</span><span class="hl str">. &quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;lpr&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> ? <span class="hl str">&quot;lpr -P</span> <span class="hl ipl">$queue</span> <span class="hl str">-o option=setting -o switch&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;lpr -o option=setting -o switch&quot;</span><span class="hl opt">)) .</span>
<span class="hl opt">(!</span><span class="hl kwb">$cupsremote</span> ?
 N<span class="hl opt">(</span><span class="hl str">&quot;To know about the options available for the current printer read either the list shown below or click on the</span> <span class="hl esc">\&quot;</span><span class="hl str">Print option list</span><span class="hl esc">\&quot;</span> <span class="hl str">button.</span><span class="hl ipl">%s%s%s</span>
<span class="hl str"></span>
<span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$scanning, $photocard, $hp11000fw</span><span class="hl opt">) .</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>help_output<span class="hl opt">(</span><span class="hl kwb">$printer,</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">) :</span> 
 <span class="hl kwb">$scanning</span> <span class="hl opt">.</span> <span class="hl kwb">$photocard</span> <span class="hl opt">.</span> <span class="hl kwb">$hp11000fw</span> <span class="hl opt">.</span>
 N<span class="hl opt">(</span><span class="hl str">&quot;Here is a list of the available printing options for the current printer:</span>
<span class="hl str"></span>
<span class="hl str">&quot;</span><span class="hl opt">) .</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>help_output<span class="hl opt">(</span><span class="hl kwb">$printer,</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">)) :</span> <span class="hl kwb">$scanning</span> <span class="hl opt">.</span> <span class="hl kwb">$photocard</span> <span class="hl opt">.</span> <span class="hl kwb">$hp11000fw</span><span class="hl opt">);</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$spooler</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;lprng&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$dialogtext</span> <span class="hl opt">=</span>
N<span class="hl opt">(</span><span class="hl str">&quot;To print a file from the command line (terminal window) use the command</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s</span> <span class="hl str">&lt;file&gt;</span><span class="hl esc">\&quot;</span><span class="hl str">.</span>
<span class="hl str">&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> ? <span class="hl str">&quot;lpr -P</span> <span class="hl ipl">$queue</span><span class="hl str">&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;lpr&quot;</span><span class="hl opt">)) .</span> 
N<span class="hl opt">(</span><span class="hl str">&quot;This command you can also use in the</span> <span class="hl esc">\&quot;</span><span class="hl str">Printing command</span><span class="hl esc">\&quot;</span> <span class="hl str">field of the printing dialogs of many applications. But here do not supply the file name because the file to print is provided by the application.</span>
<span class="hl str">&quot;</span><span class="hl opt">) .</span>
<span class="hl opt">(!</span><span class="hl kwb">$raw</span> ?
N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">The</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> command also allows to modify the option settings <span class="hl kwa">for</span> a particular printing job<span class="hl opt">.</span> Simply add the desired settings to the command line<span class="hl opt">,</span> e<span class="hl opt">.</span> g<span class="hl opt">.</span> <span class="hl esc">\&quot;</span><span class="hl kwb">%s</span> <span class="hl opt">&lt;</span>file<span class="hl opt">&gt;</span><span class="hl esc">\&quot;</span><span class="hl opt">.</span> <span class="hl str">&quot;, &quot;</span>lpr<span class="hl str">&quot;, (</span><span class="hl ipl">$queue</span> <span class="hl str">ne</span> <span class="hl ipl">$default</span> <span class="hl str">? &quot;</span>lpr <span class="hl opt">-</span>P <span class="hl kwb">$queue</span> <span class="hl opt">-</span>Z option<span class="hl opt">=</span>setting <span class="hl opt">-</span>Z switch<span class="hl str">&quot; : &quot;</span>lpr <span class="hl opt">-</span>Z option<span class="hl opt">=</span>setting <span class="hl opt">-</span>Z switch<span class="hl str">&quot;)) .</span>
<span class="hl str">N(&quot;</span>To get a list of the options available <span class="hl kwa">for</span> the current printer click on the <span class="hl esc">\&quot;</span>Print option list<span class="hl esc">\&quot;</span> button<span class="hl opt">.</span><span class="hl str">&quot;) .</span> <span class="hl ipl">$scanning</span> <span class="hl str">.</span> <span class="hl ipl">$photocard</span> <span class="hl str">.</span> <span class="hl ipl">$hp11000fw</span> <span class="hl str">:</span> <span class="hl ipl">$scanning</span> <span class="hl str">.</span> <span class="hl ipl">$photocard</span> <span class="hl str">.</span> <span class="hl ipl">$hp11000fw</span><span class="hl str">);</span>
<span class="hl str">    } elsif (</span><span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;</span>lpd<span class="hl str">&quot;) {</span>
<span class="hl str"></span>	<span class="hl ipl">$dialogtext</span> <span class="hl str">=</span>
<span class="hl str">N(&quot;</span>To <span class="hl kwc">print</span> a file from the command line <span class="hl opt">(</span>terminal window<span class="hl opt">)</span> <span class="hl kwa">use</span> the command <span class="hl esc">\&quot;</span><span class="hl kwb">%s</span> <span class="hl opt">&lt;</span>file<span class="hl opt">&gt;</span><span class="hl esc">\&quot;</span><span class="hl opt">.</span>
<span class="hl str">&quot;, (</span><span class="hl ipl">$queue</span> <span class="hl str">ne</span> <span class="hl ipl">$default</span> <span class="hl str">? &quot;</span>lpr <span class="hl opt">-</span>P <span class="hl kwb">$queue</span><span class="hl str">&quot; : &quot;</span>lpr<span class="hl str">&quot;)) .</span>
<span class="hl str">N(&quot;</span>This command you can also <span class="hl kwa">use in</span> the <span class="hl esc">\&quot;</span>Printing command<span class="hl esc">\&quot;</span> field of the printing dialogs of many applications<span class="hl opt">.</span> But here <span class="hl kwa">do</span> <span class="hl kwc">not</span> supply the file name because the file to <span class="hl kwc">print</span> <span class="hl kwa">is</span> provided by the application<span class="hl opt">.</span>
<span class="hl str">&quot;) .</span>
<span class="hl str">(!</span><span class="hl ipl">$raw</span> <span class="hl str">?</span>
<span class="hl str">N(&quot;</span>
The <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; command also allows to modify the option settings for a particular printing job. Simply add the desired settings to the command line, e. g.</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s</span> <span class="hl str">&lt;file&gt;</span><span class="hl esc">\&quot;</span><span class="hl str">. &quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;lpr&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> ? <span class="hl str">&quot;lpr -P</span> <span class="hl ipl">$queue</span> <span class="hl str">-o option=setting -o switch&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;lpr -o option=setting -o switch&quot;</span><span class="hl opt">)) .</span>
N<span class="hl opt">(</span><span class="hl str">&quot;To get a list of the options available for the current printer click on the</span> <span class="hl esc">\&quot;</span><span class="hl str">Print option list</span><span class="hl esc">\&quot;</span> <span class="hl str">button.&quot;</span><span class="hl opt">) .</span> <span class="hl kwb">$scanning</span> <span class="hl opt">.</span> <span class="hl kwb">$photocard</span> <span class="hl opt">.</span> <span class="hl kwb">$hp11000fw</span> <span class="hl opt">:</span> <span class="hl kwb">$scanning</span> <span class="hl opt">.</span> <span class="hl kwb">$photocard</span> <span class="hl opt">.</span> <span class="hl kwb">$hp11000fw</span><span class="hl opt">);</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$spooler</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;pdq&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$dialogtext</span> <span class="hl opt">=</span>
N<span class="hl opt">(</span><span class="hl str">&quot;To print a file from the command line (terminal window) use the command</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s</span> <span class="hl str">&lt;file&gt;</span><span class="hl esc">\&quot;</span> <span class="hl str">or</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s</span> <span class="hl str">&lt;file&gt;</span><span class="hl esc">\&quot;</span><span class="hl str">.</span>
<span class="hl str">&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> ? <span class="hl str">&quot;pdq -P</span> <span class="hl ipl">$queue</span><span class="hl str">&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;pdq&quot;</span><span class="hl opt">), (</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> ? <span class="hl str">&quot;lpr -P</span> <span class="hl ipl">$queue</span><span class="hl str">&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;lpr&quot;</span><span class="hl opt">)) .</span>
N<span class="hl opt">(</span><span class="hl str">&quot;This command you can also use in the</span> <span class="hl esc">\&quot;</span><span class="hl str">Printing command</span><span class="hl esc">\&quot;</span> <span class="hl str">field of the printing dialogs of many applications. But here do not supply the file name because the file to print is provided by the application.</span>
<span class="hl str">&quot;</span><span class="hl opt">) .</span>
N<span class="hl opt">(</span><span class="hl str">&quot;You can also use the graphical interface</span> <span class="hl esc">\&quot;</span><span class="hl str">xpdq</span><span class="hl esc">\&quot;</span> <span class="hl str">for setting options and handling printing jobs.</span>
<span class="hl str">If you are using KDE as desktop environment you have a</span> <span class="hl esc">\&quot;</span><span class="hl str">panic button</span><span class="hl esc">\&quot;</span><span class="hl str">, an icon on the desktop, labeled with</span> <span class="hl esc">\&quot;</span><span class="hl str">STOP Printer!</span><span class="hl esc">\&quot;</span><span class="hl str">, which stops all print jobs immediately when you click it. This is for example useful for paper jams.</span>
<span class="hl str">&quot;</span><span class="hl opt">) .</span>
<span class="hl opt">(!</span><span class="hl kwb">$raw</span> ?
N<span class="hl opt">(</span><span class="hl str">&quot;</span>
<span class="hl str">The</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> <span class="hl kwc">and</span> <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; commands also allow to modify the option settings for a particular printing job. Simply add the desired settings to the command line, e. g.</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s</span> <span class="hl str">&lt;file&gt;</span><span class="hl esc">\&quot;</span><span class="hl str">.</span>
<span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;pdq&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;lpr&quot;</span><span class="hl opt">, (</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$default</span> ? <span class="hl str">&quot;pdq -P</span> <span class="hl ipl">$queue</span> <span class="hl str">-aoption=setting -oswitch&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;pdq -aoption=setting -oswitch&quot;</span><span class="hl opt">)) .</span>
N<span class="hl opt">(</span><span class="hl str">&quot;To know about the options available for the current printer read either the list shown below or click on the</span> <span class="hl esc">\&quot;</span><span class="hl str">Print option list</span><span class="hl esc">\&quot;</span> <span class="hl str">button.</span><span class="hl ipl">%s%s%s</span>
<span class="hl str"></span>
<span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$scanning, $photocard, $hp11000fw</span><span class="hl opt">) .</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>help_output<span class="hl opt">(</span><span class="hl kwb">$printer,</span> <span class="hl str">&apos;pdq&apos;</span><span class="hl opt">) :</span>
 <span class="hl kwb">$scanning</span> <span class="hl opt">.</span> <span class="hl kwb">$photocard</span> <span class="hl opt">.</span> <span class="hl kwb">$hp11000fw</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$windowtitle</span> <span class="hl opt">= (</span><span class="hl kwb">$scanning</span> ?
                       <span class="hl opt">(</span><span class="hl kwb">$photocard</span> ?
			N<span class="hl opt">(</span><span class="hl str">&quot;Printing/Scanning/Photo Cards on</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl str">&quot;,</span> <span class="hl ipl">$queue</span><span class="hl str">) :</span>
<span class="hl str">			N(&quot;</span>Printing<span class="hl opt">/</span>Scanning on <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$queue</span><span class="hl opt">)) :</span>
                       <span class="hl opt">(</span><span class="hl kwb">$photocard</span> ?
			N<span class="hl opt">(</span><span class="hl str">&quot;Printing/Photo Card Access on</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl str">&quot;,</span> <span class="hl ipl">$queue</span><span class="hl str">) :</span>
<span class="hl str">			N(&quot;</span>Printing on the printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$queue</span><span class="hl opt">)));</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$raw</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$cupsremote</span><span class="hl opt">) {</span>
        <span class="hl kwc">my</span> <span class="hl kwb">$choice</span><span class="hl opt">;</span>
        <span class="hl kwa">while</span> <span class="hl opt">(</span><span class="hl kwb">$choice</span> <span class="hl kwc">ne</span> N<span class="hl opt">(</span><span class="hl str">&quot;Close&quot;</span><span class="hl opt">)) {</span>
	    <span class="hl kwb">$choice</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>
	         <span class="hl kwb">$windowtitle, $dialogtext,</span>
		 <span class="hl opt">[</span> N<span class="hl opt">(</span><span class="hl str">&quot;Print option list&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;Close&quot;</span><span class="hl opt">) ],</span>
		 N<span class="hl opt">(</span><span class="hl str">&quot;Close&quot;</span><span class="hl opt">));</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$choice</span> <span class="hl kwc">ne</span> N<span class="hl opt">(</span><span class="hl str">&quot;Close&quot;</span><span class="hl opt">)) {</span>
		<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
					  N<span class="hl opt">(</span><span class="hl str">&quot;Printing test page(s)...&quot;</span><span class="hl opt">));</span>
	        printer<span class="hl opt">::</span>main<span class="hl opt">::</span>print_optionlist<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl kwb">$windowtitle, $dialogtext</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> scanner_help <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$makemodel, $deviceuri</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$deviceuri</span> <span class="hl opt">=~</span> <span class="hl kwd">m!^ptal://?(.*?)$!</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$ptaldevice</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+PhotoSmart/i</span> <span class="hl opt">&amp;&amp;</span>
	    <span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+LaserJet\s+2200/i</span> <span class="hl opt">&amp;&amp;</span>
	    <span class="hl kwb">$makemodel</span> <span class="hl opt">!~</span> <span class="hl kwd">/HP\s+(DeskJet|dj)\s*450/i</span><span class="hl opt">) {</span>
	    <span class="hl slc"># Models with built-in scanner</span>
	    <span class="hl kwa">return</span> N<span class="hl opt">(</span><span class="hl str">&quot;Your multi-function device was configured automatically to be able to scan. Now you can scan with</span> <span class="hl esc">\&quot;</span><span class="hl str">scanimage</span><span class="hl esc">\&quot;</span> <span class="hl str">(</span><span class="hl esc">\&quot;</span><span class="hl str">scanimage -d hp:</span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> to specify the scanner <span class="hl kwa">when</span> you have more than one<span class="hl opt">)</span> from the command line <span class="hl kwc">or</span> with the graphical interfaces <span class="hl esc">\&quot;</span>xscanimage<span class="hl esc">\&quot;</span> <span class="hl kwc">or</span> <span class="hl esc">\&quot;</span>xsane<span class="hl esc">\&quot;</span><span class="hl opt">.</span> If you are using the GIMP<span class="hl opt">,</span> you can also scan by choosing the appropriate point <span class="hl kwa">in</span> the <span class="hl esc">\&quot;</span>File<span class="hl esc">\&quot;</span><span class="hl opt">/</span><span class="hl esc">\&quot;</span>Acquire<span class="hl esc">\&quot;</span> menu<span class="hl opt">.</span> Call also <span class="hl esc">\&quot;</span>man scanimage<span class="hl esc">\&quot;</span> on the command line to get more information<span class="hl opt">.</span>

You <span class="hl kwa">do</span> <span class="hl kwc">not</span> need to run <span class="hl esc">\&quot;</span>scannerdrake<span class="hl esc">\&quot;</span> <span class="hl kwa">for</span> setting up scanning on this device<span class="hl opt">,</span> you only need to <span class="hl kwa">use</span> <span class="hl esc">\&quot;</span>scannerdrake<span class="hl esc">\&quot;</span> <span class="hl kwa">if</span> you want to share the scanner on the network<span class="hl opt">.</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>		     <span class="hl ipl">$ptaldevice</span><span class="hl str">);</span>
<span class="hl str">	} else {</span>
<span class="hl str">	    # Scanner-less models</span>
<span class="hl str">	    return &quot;</span><span class="hl str">&quot;;</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub photocard_help {</span>
<span class="hl str">    my (</span><span class="hl ipl">$makemodel,</span> <span class="hl str"></span><span class="hl ipl">$deviceuri</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    if (</span><span class="hl ipl">$deviceuri</span> <span class="hl str">=~ m!^ptal://?(.*?)$!) {</span>
<span class="hl str">	my</span> <span class="hl ipl">$ptaldevice</span> <span class="hl str">=</span> <span class="hl ipl">$1</span><span class="hl str">;</span>
<span class="hl str">	if ((</span><span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+PhotoSmart/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+PSC\s*9[05]0/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+PSC\s*135\d/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+PSC\s*21[57]\d/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+PSC\s*22\d\d/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+PSC\s*2[45]\d\d/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+OfficeJet\s+D\s*1[45]5/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+OfficeJet\s+71[34]0/i ||</span>
<span class="hl str"></span>	     <span class="hl ipl">$makemodel</span> <span class="hl str">=~ /HP\s+(DeskJet|dj)\s*450/i) &amp;&amp;</span>
<span class="hl str"></span>	    <span class="hl ipl">$makemodel</span> <span class="hl str">!~ /HP\s+PhotoSmart\s+7150/i) {</span>
<span class="hl str">	    # Models with built-in photo card drives</span>
<span class="hl str">	    return N(&quot;</span>Your printer was configured automatically to give you access to the photo card drives from your PC<span class="hl opt">.</span> Now you can access your photo cards using the graphical program <span class="hl esc">\&quot;</span>MtoolsFM<span class="hl esc">\&quot;</span> <span class="hl opt">(</span>Menu<span class="hl opt">:</span> <span class="hl esc">\&quot;</span>Applications<span class="hl esc">\&quot;</span> <span class="hl opt">-&gt;</span> <span class="hl esc">\&quot;</span>File tools<span class="hl esc">\&quot;</span> <span class="hl opt">-&gt;</span> <span class="hl esc">\&quot;</span>MTools File Manager<span class="hl esc">\&quot;</span><span class="hl opt">)</span> <span class="hl kwc">or</span> the command line utilities <span class="hl esc">\&quot;</span>mtools<span class="hl esc">\&quot;</span> <span class="hl opt">(</span>enter <span class="hl esc">\&quot;</span>man mtools<span class="hl esc">\&quot;</span> on the command line <span class="hl kwa">for</span> more info<span class="hl opt">).</span> You find the card<span class="hl str">&apos;s file system under the drive letter</span> <span class="hl esc">\&quot;</span><span class="hl str">p:</span><span class="hl esc">\&quot;</span><span class="hl str">, or subsequent drive letters when you have more than one HP printer with photo card drives. In</span> <span class="hl esc">\&quot;</span><span class="hl str">MtoolsFM</span><span class="hl esc">\&quot;</span> <span class="hl str">you can switch between drive letters with the field at the upper-right corners of the file lists.&quot;,</span>
<span class="hl str"></span>		     <span class="hl ipl">$ptaldevice</span><span class="hl str">);</span>
<span class="hl str">	} else {</span>
<span class="hl str">	    # Photo-card-drive-less models</span>
<span class="hl str">	    return &quot;&quot;;</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub copy_queues_from {</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$oldspooler</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;</span>copyQueues<span class="hl str">&apos;) if $::isInstall;</span>
<span class="hl str">    my</span> <span class="hl ipl">$newspooler</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER};</span>
<span class="hl str">    my</span> <span class="hl ipl">&#64;oldqueues</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">&#64;queueentries</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">&#64;queuesselected</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$newspoolerstr</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$oldspoolerstr</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$noninteractive</span> <span class="hl str">= 0;</span>
<span class="hl str">    {</span>
<span class="hl str">	my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;),</span>
<span class="hl str">				  N(&quot;Reading printer data...&quot;));</span>
<span class="hl str"></span>	<span class="hl ipl">&#64;oldqueues</span> <span class="hl str">= printer::main::get_copiable_queues(</span><span class="hl ipl">$oldspooler,</span> <span class="hl str"></span><span class="hl ipl">$newspooler</span><span class="hl str">);</span>
<span class="hl str"></span>	<span class="hl ipl">&#64;oldqueues</span> <span class="hl str">= sort(</span><span class="hl ipl">&#64;oldqueues</span><span class="hl str">);</span>
<span class="hl str"></span>	<span class="hl ipl">$newspoolerstr</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">::data::spoolers{</span><span class="hl ipl">$newspooler</span><span class="hl str">}{short_name};</span>
<span class="hl str"></span>	<span class="hl ipl">$oldspoolerstr</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">::data::spoolers{</span><span class="hl ipl">$oldspooler</span><span class="hl str">}{short_name};</span>
<span class="hl str">	foreach (</span><span class="hl ipl">&#64;oldqueues</span><span class="hl str">) {</span>
<span class="hl str">	    push</span> <span class="hl ipl">&#64;queuesselected,</span> <span class="hl str">1;</span>
<span class="hl str">	    push</span> <span class="hl ipl">&#64;queueentries,</span> <span class="hl str">{ text =&gt;</span> <span class="hl ipl">$_,</span> <span class="hl str">type =&gt; &apos;</span>bool<span class="hl str">&apos;, </span>
<span class="hl str">				   val =&gt; \</span><span class="hl ipl">$queuesselected</span><span class="hl str">[-1] };</span>
<span class="hl str">	}</span>
<span class="hl str">	# LPRng and LPD use the same config files, therefore one sees the </span>
<span class="hl str">	# queues of LPD when one uses LPRng and vice versa, but these queues</span>
<span class="hl str">	# do not work. So automatically transfer all queues when switching</span>
<span class="hl str">	# between LPD and LPRng.</span>
<span class="hl str">	if (</span><span class="hl ipl">$oldspooler</span> <span class="hl str">=~ /^lp/ &amp;&amp;</span> <span class="hl ipl">$newspooler</span> <span class="hl str">=~ /^lp/) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$noninteractive</span> <span class="hl str">= 1;</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str">    if (</span><span class="hl ipl">$noninteractive</span> <span class="hl str">||</span>
<span class="hl str"></span>	<span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_(</span>
<span class="hl str">	 { title =&gt; N(&quot;Transfer printer configuration&quot;),</span>
<span class="hl str">	   messages =&gt; N(&quot;You can copy the printer configuration which you have done for the spooler</span> <span class="hl ipl">%s</span> <span class="hl str">to</span> <span class="hl ipl">%s,</span> <span class="hl str">your current spooler. All the configuration data (printer name, description, location, connection type, and default option settings) is overtaken, but jobs will not be transferred.</span>
<span class="hl str">Not all queues can be transferred due to the following reasons:</span>
<span class="hl str">&quot;,</span> <span class="hl ipl">$oldspoolerstr,</span> <span class="hl str"></span><span class="hl ipl">$newspoolerstr</span><span class="hl str">) .</span>
<span class="hl str">(</span><span class="hl ipl">$newspooler</span> <span class="hl str">eq &quot;cups&quot; ? N(&quot;CUPS does not support printers on Novell servers or printers sending the data into a free-formed command.</span>
<span class="hl str">&quot;) :</span>
<span class="hl str"> (</span><span class="hl ipl">$newspooler</span> <span class="hl str">eq &quot;pdq&quot; ? N(&quot;PDQ only supports local printers, remote LPD printers, and Socket/TCP printers.</span>
<span class="hl str">&quot;) :</span>
<span class="hl str">  N(&quot;LPD and LPRng do not support IPP printers.</span>
<span class="hl str">&quot;))) .</span>
<span class="hl str">N(&quot;In addition, queues not created with this program or</span> <span class="hl esc">\&quot;</span><span class="hl str">foomatic-configure</span><span class="hl esc">\&quot;</span> <span class="hl str">cannot be transferred.&quot;) .</span>
<span class="hl str">if_(</span><span class="hl ipl">$oldspooler</span> <span class="hl str">eq &quot;cups&quot;, N(&quot;</span>
<span class="hl str">Also printers configured with the PPD files provided by their manufacturers or with native CUPS drivers cannot be transferred.&quot;)) . N(&quot;</span>
<span class="hl str">Mark the printers which you want to transfer and click </span>
<span class="hl str"></span><span class="hl esc">\&quot;</span><span class="hl str">Transfer</span><span class="hl esc">\&quot;</span><span class="hl str">.&quot;),</span>
<span class="hl str">	   cancel =&gt; N(&quot;Do not transfer printers&quot;),</span>
<span class="hl str">           ok =&gt; N(&quot;Transfer&quot;)</span>
<span class="hl str">	 },</span>
<span class="hl str">         \</span><span class="hl ipl">&#64;queueentries</span>
<span class="hl str">      )) {</span>
<span class="hl str">	my</span> <span class="hl ipl">$queuecopied</span> <span class="hl str">= 0;</span>
<span class="hl str">	foreach (</span><span class="hl ipl">&#64;oldqueues</span><span class="hl str">) {</span>
<span class="hl str">	    if (shift(</span><span class="hl ipl">&#64;queuesselected</span><span class="hl str">)) {</span>
<span class="hl str">                my</span> <span class="hl ipl">$oldqueue</span> <span class="hl str">=</span> <span class="hl ipl">$_</span><span class="hl str">;</span>
<span class="hl str">                my</span> <span class="hl ipl">$newqueue</span> <span class="hl str">=</span> <span class="hl ipl">$_</span><span class="hl str">;</span>
<span class="hl str">                if (!</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$newqueue</span><span class="hl str">} ||</span> <span class="hl ipl">$noninteractive</span> <span class="hl str">||</span>
<span class="hl str"></span>		    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from_(</span>
<span class="hl str">	              { title =&gt; N(&quot;Transfer printer configuration&quot;),</span>
<span class="hl str">	                messages =&gt; N(&quot;A printer named</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot; already exists under</span> <span class="hl ipl">%s</span><span class="hl str">. </span>
<span class="hl str">Click</span> <span class="hl esc">\&quot;</span><span class="hl str">Transfer</span><span class="hl esc">\&quot;</span> <span class="hl str">to overwrite it.</span>
<span class="hl str">You can also type a new name or skip this printer.&quot;, </span>
<span class="hl str"></span>				      <span class="hl ipl">$newqueue,</span> <span class="hl str"></span><span class="hl ipl">$newspoolerstr</span><span class="hl str">),</span>
<span class="hl str">                        ok =&gt; N(&quot;Transfer&quot;),</span>
<span class="hl str">                        cancel =&gt; N(&quot;Skip&quot;),</span>
<span class="hl str">		        callbacks =&gt; { complete =&gt; sub {</span>
<span class="hl str">	                    unless (</span><span class="hl ipl">$newqueue</span> <span class="hl str">=~ /^\w+</span><span class="hl ipl">$/</span><span class="hl str">) {</span>
<span class="hl str"></span>				<span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;Error&quot;), N(&quot;Name of printer should contain only letters, numbers and the underscore&quot;));</span>
<span class="hl str">				return 1, 0;</span>
<span class="hl str">			    }</span>
<span class="hl str">			    if (</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$newqueue</span><span class="hl str">}</span>
<span class="hl str">				&amp;&amp;</span> <span class="hl ipl">$newqueue</span> <span class="hl str">ne</span> <span class="hl ipl">$oldqueue</span> <span class="hl str">&amp;&amp; </span>
<span class="hl str">				!</span><span class="hl ipl">$in</span><span class="hl str">-&gt;ask_yesorno(N(&quot;Warning&quot;), N(&quot;The printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot; already exists,</span><span class="hl esc">\n</span><span class="hl str">do you really want to overwrite its configuration?&quot;,</span>
<span class="hl str"></span>							 <span class="hl ipl">$newqueue</span><span class="hl str">),</span>
<span class="hl str">						   0)) {</span>
<span class="hl str">				return 1, 0; # Let the user correct the name</span>
<span class="hl str">			    }</span>
<span class="hl str">			    return 0;</span>
<span class="hl str">			} }</span>
<span class="hl str">		    },</span>
<span class="hl str">		      [{label =&gt; N(&quot;New printer name&quot;),val =&gt; \</span><span class="hl ipl">$newqueue</span> <span class="hl str">}])) {</span>
<span class="hl str">		    {</span>
<span class="hl str">			my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;), </span>
<span class="hl str">			   N(&quot;Transferring</span> <span class="hl ipl">%s</span><span class="hl str">...&quot;,</span> <span class="hl ipl">$oldqueue</span><span class="hl str">));</span>
<span class="hl str">		        printer::main::copy_foomatic_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$oldqueue,</span>
<span class="hl str"></span>						   <span class="hl ipl">$oldspooler,</span> <span class="hl str"></span><span class="hl ipl">$newqueue</span><span class="hl str">) and</span>
<span class="hl str"></span>							 <span class="hl ipl">$queuecopied</span> <span class="hl str">= 1;</span>
<span class="hl str">		    }</span>
<span class="hl str">		    if (</span><span class="hl ipl">$oldqueue</span> <span class="hl str">eq</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT}) {</span>
<span class="hl str">			# Make the former default printer the new default</span>
<span class="hl str">			# printer if the user does not reject</span>
<span class="hl str">			if (</span><span class="hl ipl">$noninteractive</span> <span class="hl str">||</span>
<span class="hl str"></span>			    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_yesorno(</span>
<span class="hl str">			      N(&quot;Transfer printer configuration&quot;),</span>
<span class="hl str">			      N(&quot;You have transferred your former default printer (</span><span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;), Should it be also the default printer under the new printing system</span> <span class="hl ipl">%s?</span><span class="hl str">&quot;,</span> <span class="hl ipl">$oldqueue,</span> <span class="hl str"></span><span class="hl ipl">$newspoolerstr</span><span class="hl str">), 1)) {</span>
<span class="hl str"></span>			    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT} =</span> <span class="hl ipl">$newqueue</span><span class="hl str">;</span>
<span class="hl str">			    printer::default::set_printer(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">			}</span>
<span class="hl str">		    }</span>
<span class="hl str">		}</span>
<span class="hl str">            }</span>
<span class="hl str">	}</span>
<span class="hl str">        if (</span><span class="hl ipl">$queuecopied</span><span class="hl str">) {</span>
<span class="hl str">	    my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;),</span>
<span class="hl str">                                      N(&quot;Refreshing printer data...&quot;));</span>
<span class="hl str">	    printer::main::read_configured_queues(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">        }</span>
<span class="hl str">    }</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub start_network {</span>
<span class="hl str">    my (</span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$upNetwork</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;), </span>
<span class="hl str">			      N(&quot;Starting network...&quot;));</span>
<span class="hl str">    if ($::isInstall) {</span>
<span class="hl str">	my</span> <span class="hl ipl">$ret</span><span class="hl str">;</span>
<span class="hl str">	if (</span><span class="hl ipl">$upNetwork</span><span class="hl str">) {</span>
<span class="hl str"></span>            <span class="hl ipl">$ret</span> <span class="hl str">= &amp;</span><span class="hl ipl">$upNetwork</span><span class="hl str">();</span>
<span class="hl str">            undef</span> <span class="hl ipl">$upNetwork</span><span class="hl str">;</span>
<span class="hl str">            sleep(1);</span>
<span class="hl str">        }</span>
<span class="hl str">        return</span> <span class="hl ipl">$ret</span><span class="hl str">;</span>
<span class="hl str">    } else { return printer::services::start(&quot;network&quot;) }</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub network_configured() {</span>
<span class="hl str">    # Do configured networks (/etc/sysconfig/network-scripts/ifcfg*) exist?</span>
<span class="hl str">    my</span> <span class="hl ipl">&#64;netscripts</span> <span class="hl str">=</span>
<span class="hl str">	cat_(&quot;ls -1 $::prefix/etc/sysconfig/network-scripts/ |&quot;);</span>
<span class="hl str">    my</span> <span class="hl ipl">$netconfigured</span> <span class="hl str">= 0;</span>
<span class="hl str">    (/ifcfg-/ and !/(ifcfg-lo|:|rpmsave|rpmorig|rpmnew)/ and</span>
<span class="hl str">      !/(~|\.bak)</span><span class="hl ipl">$/</span> <span class="hl str">and</span> <span class="hl ipl">$netconfigured</span> <span class="hl str">= 1) foreach</span> <span class="hl ipl">&#64;netscripts</span><span class="hl str">;</span>
<span class="hl str">    return</span> <span class="hl ipl">$netconfigured</span><span class="hl str">;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub check_network {</span>
<span class="hl str"></span>
<span class="hl str">    # This routine is called whenever the user tries to configure a remote</span>
<span class="hl str">    # printer. It checks the state of the network functionality to assure</span>
<span class="hl str">    # that the network is up and running so that the remote printer is</span>
<span class="hl str">    # reachable.</span>
<span class="hl str"></span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$upNetwork,</span> <span class="hl str"></span><span class="hl ipl">$b_dontconfigure</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Any additional dialogs caused by this subroutine should appear as</span>
<span class="hl str">    # extra windows and not embedded in the &quot;Add printer&quot; wizard.</span>
<span class="hl str">    local $::isWizard = 0;</span>
<span class="hl str"></span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;</span>checkNetwork<span class="hl str">&apos;) if $::isInstall;</span>
<span class="hl str"></span>
<span class="hl str">    # First check: Do configured networks</span>
<span class="hl str">    # (/etc/sysconfig/network-scripts/ifcfg*) exist?</span>
<span class="hl str"></span>
<span class="hl str">    if (!</span><span class="hl ipl">$b_dontconfigure</span> <span class="hl str">&amp;&amp; !network_configured()) {</span>
<span class="hl str">	my</span> <span class="hl ipl">$go_on</span> <span class="hl str">= 0;</span>
<span class="hl str">	while (!</span><span class="hl ipl">$go_on</span><span class="hl str">) {</span>
<span class="hl str">	    my</span> <span class="hl ipl">$choice</span> <span class="hl str">= N(&quot;Configure the network now&quot;);</span>
<span class="hl str">	    if (</span><span class="hl ipl">$in</span><span class="hl str">-&gt;ask_from(N(&quot;Network functionality not configured&quot;),</span>
<span class="hl str">			      N(&quot;You are going to configure a remote printer. This needs working network access, but your network is not configured yet. If you go on without network configuration, you will not be able to use the printer which you are configuring now. How do you want to proceed?&quot;),</span>
<span class="hl str">			      [ { val =&gt; \</span><span class="hl ipl">$choice,</span> <span class="hl str">type =&gt; &apos;</span>list<span class="hl str">&apos;,</span>
<span class="hl str">				  list =&gt; [ N(&quot;Configure the network now&quot;),</span>
<span class="hl str">					    N(&quot;Go on without configuring the network&quot;) ] } ])) {</span>
<span class="hl str">		if (</span><span class="hl ipl">$choice</span> <span class="hl str">eq N(&quot;Configure the network now&quot;)) {</span>
<span class="hl str">		    if ($::isInstall) {</span>
<span class="hl str">			my</span> <span class="hl ipl">$o</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">;</span>
<span class="hl str">			require network::netconnect;</span>
<span class="hl str">		        network::netconnect::main(</span>
<span class="hl str"></span>			     <span class="hl ipl">$o</span><span class="hl str">-&gt;{netcnx} ||= {}, </span>
<span class="hl str"></span>			     <span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$o</span><span class="hl str">-&gt;{modules_conf},</span> <span class="hl ipl">$o</span><span class="hl str">-&gt;{netc},</span> <span class="hl ipl">$o</span><span class="hl str">-&gt;{mouse}, </span>
<span class="hl str"></span>			     <span class="hl ipl">$o</span><span class="hl str">-&gt;{intf});</span>
<span class="hl str">#    my (</span><span class="hl ipl">$prefix,</span> <span class="hl str"></span><span class="hl ipl">$netcnx,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$o_netc,</span> <span class="hl str"></span><span class="hl ipl">$o_mouse,</span> <span class="hl str"></span><span class="hl ipl">$o_intf,</span> <span class="hl str"></span><span class="hl ipl">$o_first_time,</span> <span class="hl str"></span><span class="hl ipl">$o_noauto</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">		    } else {</span>
<span class="hl str">			system(&quot;/usr/sbin/drakconnect&quot;);</span>
<span class="hl str">		    }</span>
<span class="hl str"></span>		    <span class="hl ipl">$go_on</span> <span class="hl str">= network_configured();</span>
<span class="hl str">		} else {</span>
<span class="hl str">		    return 1;</span>
<span class="hl str">		}</span>
<span class="hl str">	    } else {</span>
<span class="hl str">		return 0;</span>
<span class="hl str">	    }</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    # Do not try to start the network if it is not configured</span>
<span class="hl str">    if (!network_configured()) { return 0 }</span>
<span class="hl str"></span>
<span class="hl str">    # Second check: Is the network running?</span>
<span class="hl str"></span>
<span class="hl str">    if (printer::detect::network_running()) { return 1 }</span>
<span class="hl str"></span>
<span class="hl str">    # The network is configured now, start it.</span>
<span class="hl str">    if (!start_network(</span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$upNetwork</span><span class="hl str">) &amp;&amp; </span>
<span class="hl str">	(!</span><span class="hl ipl">$b_dontconfigure</span> <span class="hl str">|| $::isInstall)) {</span>
<span class="hl str"></span>	<span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;Warning&quot;), </span>
<span class="hl str">($::isInstall ?</span>
<span class="hl str">N(&quot;The network configuration done during the installation cannot be started now. Please check whether the network is accessible after booting your system and correct the configuration using the</span> <span class="hl ipl">%s</span> <span class="hl str">Control Center, section</span> <span class="hl esc">\&quot;</span><span class="hl str">Network &amp; Internet</span><span class="hl esc">\&quot;</span><span class="hl str">/</span><span class="hl esc">\&quot;</span><span class="hl str">Connection</span><span class="hl esc">\&quot;</span><span class="hl str">, and afterwards set up the printer, also using the</span> <span class="hl ipl">%s</span> <span class="hl str">Control Center, section</span> <span class="hl esc">\&quot;</span><span class="hl str">Hardware</span><span class="hl esc">\&quot;</span><span class="hl str">/</span><span class="hl esc">\&quot;</span><span class="hl str">Printer</span><span class="hl esc">\&quot;</span><span class="hl str">&quot;,</span> <span class="hl ipl">$shortdistroname,</span> <span class="hl str"></span><span class="hl ipl">$shortdistroname</span><span class="hl str">) :</span>
<span class="hl str">N(&quot;The network access was not running and could not be started. Please check your configuration and your hardware. Then try to configure your remote printer again.&quot;)));</span>
<span class="hl str">	return 0;</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    # Give a SIGHUP to the daemon and in case of CUPS do also the</span>
<span class="hl str">    # automatic configuration of broadcasting/access permissions</span>
<span class="hl str">    # The daemon is not really restarted but only SIGHUPped to not</span>
<span class="hl str">    # interrupt print jobs.</span>
<span class="hl str"></span>
<span class="hl str">    my</span> <span class="hl ipl">$_w</span> <span class="hl str">=</span> <span class="hl ipl">$in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;), </span>
<span class="hl str">                               N(&quot;Restarting printing system...&quot;));</span>
<span class="hl str"></span>
<span class="hl str">    return printer::main::SIGHUP_daemon(</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER});</span>
<span class="hl str"></span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub security_check {</span>
<span class="hl str">    # Check the security mode and when in &quot;high&quot; or &quot;paranoid&quot; mode ask the</span>
<span class="hl str">    # user whether he really wants to configure printing.</span>
<span class="hl str">    my (</span><span class="hl ipl">$spooler,</span> <span class="hl str"></span><span class="hl ipl">$security,</span> <span class="hl str"></span><span class="hl ipl">$o_in</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Any additional dialogs caused by this subroutine should appear as</span>
<span class="hl str">    # extra windows and not embedded in the &quot;Add printer&quot; wizard.</span>
<span class="hl str">    local $::isWizard = 0;</span>
<span class="hl str"></span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;</span>securityCheck<span class="hl str">&apos;) if $::isInstall;</span>
<span class="hl str"></span>
<span class="hl str">    # Exit silently if the spooler is PDQ</span>
<span class="hl str">    if (</span><span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;pdq&quot;) { return 1 }</span>
<span class="hl str"></span>
<span class="hl str">    # Exit silently in medium or lower security levels</span>
<span class="hl str">    if (!</span><span class="hl ipl">$security</span> <span class="hl str">||</span> <span class="hl ipl">$security</span> <span class="hl str">&lt; 4) { return 1 }</span>
<span class="hl str">    </span>
<span class="hl str">    # Exit silently if the current spooler is already activated for the current</span>
<span class="hl str">    # security level</span>
<span class="hl str">    if (printer::main::spooler_in_security_level(</span><span class="hl ipl">$spooler,</span> <span class="hl str"></span><span class="hl ipl">$security</span><span class="hl str">)) { return 1 }</span>
<span class="hl str"></span>
<span class="hl str">    # Tell user in which security mode he is and ask him whether he really</span>
<span class="hl str">    # wants to activate the spooler in the given security mode. Stop the</span>
<span class="hl str">    # operation of installing the spooler if he disagrees.</span>
<span class="hl str">    my</span> <span class="hl ipl">$securitystr</span> <span class="hl str">= (</span><span class="hl ipl">$security</span> <span class="hl str">== 4 ? N(&quot;high&quot;) : N(&quot;paranoid&quot;));</span>
<span class="hl str">    if (</span><span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span>
<span class="hl str"></span>	<span class="hl ipl">$o_in</span><span class="hl str">-&gt;ask_yesorno(N(&quot;Installing a printing system in the</span> <span class="hl ipl">%s</span> <span class="hl str">security level&quot;,</span> <span class="hl ipl">$securitystr</span><span class="hl str">),</span>
<span class="hl str">			 N(&quot;You are about to install the printing system</span> <span class="hl ipl">%s</span> <span class="hl str">on a system running in the</span> <span class="hl ipl">%s</span> <span class="hl str">security level.</span>
<span class="hl str"></span>
<span class="hl str">This printing system runs a daemon (background process) which waits for print jobs and handles them. This daemon is also accessible by remote machines through the network and so it is a possible point for attacks. Therefore only a few selected daemons are started by default in this security level.</span>
<span class="hl str"></span>
<span class="hl str">Do you really want to configure printing on this machine?&quot;,</span>
<span class="hl str"></span>			   <span class="hl ipl">$printer</span><span class="hl str">::data::spoolers{</span><span class="hl ipl">$spooler</span><span class="hl str">}{short_name},</span>
<span class="hl str"></span>			   <span class="hl ipl">$securitystr</span><span class="hl str">))) {</span>
<span class="hl str">        printer::main::add_spooler_to_security_level(</span><span class="hl ipl">$spooler,</span> <span class="hl str"></span><span class="hl ipl">$security</span><span class="hl str">);</span>
<span class="hl str">	my</span> <span class="hl ipl">$service</span><span class="hl str">;</span>
<span class="hl str">	if (</span><span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;lpr&quot; ||</span> <span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;lprng&quot;) {</span>
<span class="hl str"></span>	    <span class="hl ipl">$service</span> <span class="hl str">= &quot;lpd&quot;;</span>
<span class="hl str">	} else {</span>
<span class="hl str"></span>	    <span class="hl ipl">$service</span> <span class="hl str">=</span> <span class="hl ipl">$spooler</span><span class="hl str">;</span>
<span class="hl str">	}</span>
<span class="hl str">        services::start_service_on_boot(</span><span class="hl ipl">$service</span><span class="hl str">); #TV</span>
<span class="hl str">	return 1;</span>
<span class="hl str">    } else {</span>
<span class="hl str">	return 0;</span>
<span class="hl str">    }</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub start_spooler_on_boot {</span>
<span class="hl str">    # Checks whether the spooler will be started at boot time and if not,</span>
<span class="hl str">    # ask the user whether he wants to start the spooler at boot time.</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$o_in,</span> <span class="hl str"></span><span class="hl ipl">$b_service,</span> <span class="hl str"></span><span class="hl ipl">$b_silentspooleronboot</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    # PDQ has no daemon, so nothing needs to be started :</span>
<span class="hl str">    return unless</span> <span class="hl ipl">$b_service</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Any additional dialogs caused by this subroutine should appear as</span>
<span class="hl str">    # extra windows and not embedded in the &quot;Add printer&quot; wizard.</span>
<span class="hl str">    local $::isWizard = 0;</span>
<span class="hl str"></span>
<span class="hl str">#</span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;set_help(&apos;</span>startSpoolerOnBoot<span class="hl str">&apos;) if $::isInstall;</span>
<span class="hl str">    if (!services::starts_on_boot(</span><span class="hl ipl">$b_service</span><span class="hl str">)) {</span>
<span class="hl str">	if (</span><span class="hl ipl">$b_silentspooleronboot</span> <span class="hl str">||</span>
<span class="hl str"></span>	    <span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$o_in</span><span class="hl str">-&gt;ask_yesorno(N(&quot;Starting the printing system at boot time&quot;),</span>
<span class="hl str">			     N(&quot;The printing system (</span><span class="hl ipl">%s</span><span class="hl str">) will not be started automatically when the machine is booted.</span>
<span class="hl str"></span>
<span class="hl str">It is possible that the automatic starting was turned off by changing to a higher security level, because the printing system is a potential point for attacks.</span>
<span class="hl str"></span>
<span class="hl str">Do you want to have the automatic starting of the printing system turned on again?&quot;,</span>
<span class="hl str"></span>		       <span class="hl ipl">$printer</span><span class="hl str">::data::spoolers{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER}}{short_name}))) {</span>
<span class="hl str">	    services::start_service_on_boot(</span><span class="hl ipl">$b_service</span><span class="hl str">);</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str">    1;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub install_spooler {</span>
<span class="hl str">    # installs the default spooler and start its daemon</span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$security,</span> <span class="hl str"></span><span class="hl ipl">$do_pkgs,</span> <span class="hl str"></span><span class="hl ipl">$o_in,</span> <span class="hl str"></span><span class="hl ipl">$o_upNetwork,</span> <span class="hl str"></span><span class="hl ipl">$b_silentspooleronboot</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str">    return 1 if $::testing;</span>
<span class="hl str">    my</span> <span class="hl ipl">$spooler</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{SPOOLER};</span>
<span class="hl str">    # If the user refuses to install the spooler in high or paranoid</span>
<span class="hl str">    # security level, exit.</span>
<span class="hl str">    return 0 unless security_check(</span><span class="hl ipl">$spooler,</span> <span class="hl str"></span><span class="hl ipl">$security,</span> <span class="hl str"></span><span class="hl ipl">$o_in</span><span class="hl str">);</span>
<span class="hl str">    # should not happen</span>
<span class="hl str">    return 0 if</span> <span class="hl ipl">$spooler</span> <span class="hl str">!~ /^(rcups|cups|lpd|lprng|pqd)</span><span class="hl ipl">$/</span><span class="hl str">;</span>
<span class="hl str">    my</span> <span class="hl ipl">$w</span> <span class="hl str">=</span> <span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$o_in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;), N(&quot;Checking installed software...&quot;));</span>
<span class="hl str"></span>
<span class="hl str">    # &quot;lpr&quot; conflicts with &quot;LPRng&quot;, remove either &quot;LPRng&quot; or remove &quot;lpr&quot;</span>
<span class="hl str">    my</span> <span class="hl ipl">$packages</span> <span class="hl str">=</span> <span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{packages2rm};</span>
<span class="hl str">    if (</span><span class="hl ipl">$packages</span> <span class="hl str">&amp;&amp; files_exist(</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[1])) {</span>
<span class="hl str">	undef</span> <span class="hl ipl">$w</span><span class="hl str">;</span>
<span class="hl str"></span>        <span class="hl ipl">$w</span> <span class="hl str">=</span> <span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$o_in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;), N(&quot;Removing</span> <span class="hl ipl">%s</span><span class="hl str">...&quot;),</span> <span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0]}{short_name});</span>
<span class="hl str"></span>        <span class="hl ipl">$do_pkgs</span><span class="hl str">-&gt;remove_nodeps(</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0])</span>
<span class="hl str">	    or do {</span>
<span class="hl str"></span>		<span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$o_in</span><span class="hl str">-&gt;ask_warn(N(&quot;Error&quot;),</span>
<span class="hl str">			      N(&quot;Could not remove the</span> <span class="hl ipl">%s</span> <span class="hl str">printing system!&quot;,</span>
<span class="hl str"></span>				<span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0]}{short_name}));</span>
<span class="hl str">		return 0;</span>
<span class="hl str">	    };</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    # Install all packages needed to run printerdrake and the chosen spooler</span>
<span class="hl str"></span>    <span class="hl ipl">$packages</span> <span class="hl str">=</span> <span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{packages2add};</span>
<span class="hl str">    push (&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0]}, &#64;{</span><span class="hl ipl">$commonpackages</span><span class="hl str">-&gt;[0]});</span>
<span class="hl str">    push (&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0]}, &#64;{</span><span class="hl ipl">$localqueuepackages</span><span class="hl str">-&gt;[0]}) if</span>
<span class="hl str"></span>	<span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{local_queues};</span>
<span class="hl str">    push (&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[1]}, &#64;{</span><span class="hl ipl">$commonpackages</span><span class="hl str">-&gt;[1]});</span>
<span class="hl str">    push (&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[1]}, &#64;{</span><span class="hl ipl">$localqueuepackages</span><span class="hl str">-&gt;[1]}) if</span>
<span class="hl str"></span>	<span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{local_queues};</span>
<span class="hl str">    if (&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0]} &amp;&amp; !files_exist(&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[1]})) {</span>
<span class="hl str">	undef</span> <span class="hl ipl">$w</span><span class="hl str">;</span>
<span class="hl str"></span>        <span class="hl ipl">$w</span> <span class="hl str">=</span> <span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$o_in</span><span class="hl str">-&gt;wait_message(N(&quot;Printerdrake&quot;), N(&quot;Installing</span> <span class="hl ipl">%s</span><span class="hl str">...&quot;),</span> <span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{short_name});</span>
<span class="hl str"></span>        <span class="hl ipl">$do_pkgs</span><span class="hl str">-&gt;install(&#64;{</span><span class="hl ipl">$packages</span><span class="hl str">-&gt;[0]})</span>
<span class="hl str">	    or do {</span>
<span class="hl str"></span>		<span class="hl ipl">$o_in</span> <span class="hl str">&amp;&amp;</span> <span class="hl ipl">$o_in</span><span class="hl str">-&gt;ask_warn(N(&quot;Error&quot;),</span>
<span class="hl str">			      N(&quot;Could not install the</span> <span class="hl ipl">%s</span> <span class="hl str">printing system!&quot;,</span>
<span class="hl str"></span>				<span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{short_name}));</span>
<span class="hl str">		return 0;</span>
<span class="hl str">	    };</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    undef</span> <span class="hl ipl">$w</span><span class="hl str">;</span>
<span class="hl str">    </span>
<span class="hl str">    # Start the network (especially during installation), so the</span>
<span class="hl str">    # user can set up queues to remote printers.</span>
<span class="hl str"></span>
<span class="hl str"></span>    <span class="hl ipl">$o_upNetwork</span> <span class="hl str">and do {</span>
<span class="hl str">        &amp;</span><span class="hl ipl">$o_upNetwork</span><span class="hl str">(); </span>
<span class="hl str">        undef</span> <span class="hl ipl">$o_upNetwork</span><span class="hl str">; </span>
<span class="hl str">        sleep(1);</span>
<span class="hl str">    };</span>
<span class="hl str"></span>
<span class="hl str">    # Start daemon</span>
<span class="hl str">    if (</span><span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;cups&quot;) {</span>
<span class="hl str">        # Start daemon</span>
<span class="hl str">        # Avoid unnecessary restarting of CUPS, this blocks the</span>
<span class="hl str">        # startup of printerdrake for several seconds.</span>
<span class="hl str">        printer::services::start_not_running_service(&quot;cups&quot;);</span>
<span class="hl str">	# Remove a remote CUPS server setting from the client.conf</span>
<span class="hl str">	# file, otherwise the local CUPS daemon gets overridden.</span>
<span class="hl str">	my (</span><span class="hl ipl">$daemonless_cups,</span> <span class="hl str"></span><span class="hl ipl">$remote_cups_server</span><span class="hl str">) =</span>
<span class="hl str">	    printer::main::read_client_conf();</span>
<span class="hl str">	if (</span><span class="hl ipl">$daemonless_cups</span><span class="hl str">) {</span>
<span class="hl str">	    printer::main::write_client_conf(0,</span> <span class="hl ipl">$remote_cups_server</span><span class="hl str">);</span>
<span class="hl str">	}</span>
<span class="hl str">    } elsif (</span><span class="hl ipl">$spooler</span> <span class="hl str">eq &quot;rcups&quot;) {</span>
<span class="hl str">	# Stop CUPS daemon, we want to run daemon-less</span>
<span class="hl str">	services::stop(&quot;cups&quot;) if services::is_service_running(&quot;cups&quot;);</span>
<span class="hl str">	# Do not start CUPS daemon during boot</span>
<span class="hl str">	services::do_not_start_service_on_boot(&quot;cups&quot;);</span>
<span class="hl str">    } elsif (</span><span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{service}) {</span>
<span class="hl str">        printer::services::restart(</span><span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{service});</span>
<span class="hl str">    }</span>
<span class="hl str">    </span>
<span class="hl str">    # Set the choosen spooler tools as defaults for &quot;lpr&quot;, &quot;lpq&quot;,</span>
<span class="hl str">    # &quot;lprm&quot;, ...</span>
<span class="hl str">    foreach (&#64;{</span><span class="hl ipl">$spoolers</span><span class="hl str">{</span><span class="hl ipl">$spooler</span><span class="hl str">}{alternatives}}) {</span>
<span class="hl str">        set_alternative(</span><span class="hl ipl">$_</span><span class="hl str">-&gt;[0],</span> <span class="hl ipl">$_</span><span class="hl str">-&gt;[1]);</span>
<span class="hl str">    }</span>
<span class="hl str"></span>
<span class="hl str">    # Remove/add PDQ panic buttons from the user&apos;</span>s KDE Desktops
    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>pdq_panic_button<span class="hl opt">(</span><span class="hl kwb">$spooler</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;pdq&apos;</span> ? <span class="hl str">&quot;add&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;remove&quot;</span><span class="hl opt">);</span>

    <span class="hl slc"># Should it be started at boot time?</span>
    start_spooler_on_boot<span class="hl opt">(</span><span class="hl kwb">$printer, $o_in, $spoolers</span><span class="hl opt">{</span><span class="hl kwb">$spooler</span><span class="hl opt">}{</span>boot_spooler<span class="hl opt">},</span>
			  <span class="hl kwb">$b_silentspooleronboot</span><span class="hl opt">);</span>

    <span class="hl slc"># Give a SIGHUP to the devfsd daemon to correct the permissions</span>
    <span class="hl slc"># for the /dev/... files according to the spooler</span>
    <span class="hl slc">#printer::main::SIGHUP_daemon(&quot;devfs&quot;);</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> assure_remote_server_is_set <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># Check if a remote CUPS server is specified</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">}) {</span>
	<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups, $remote_cups_server</span><span class="hl opt">) =</span>
	    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_client_conf<span class="hl opt">();</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$daemonless_cups</span><span class="hl opt">) {</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span>
		<span class="hl opt">({</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote CUPS server and no local CUPS daemon&quot;</span><span class="hl opt">),</span>
		   messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;In this mode there is no local printing system, all printing requests go directly to the server specified below. Note that it is not possible to define local print queues then and if the specified server is down it cannot be printed at all from this machine.&quot;</span><span class="hl opt">) .</span>
		       <span class="hl str">&quot;</span><span class="hl esc">\n\n</span><span class="hl str">&quot;</span><span class="hl opt">.</span> 
		       N<span class="hl opt">(</span><span class="hl str">&quot;Enter the host name or IP of your CUPS server and click OK if you want to use this mode, click</span> <span class="hl esc">\&quot;</span><span class="hl str">Quit</span><span class="hl esc">\&quot;</span> <span class="hl str">otherwise.&quot;</span><span class="hl opt">),</span>
		   cancel <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Quit&quot;</span><span class="hl opt">),</span>
		   callbacks <span class="hl opt">=&gt; {</span>
		       complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			   <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$remote_cups_server</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*$/</span><span class="hl opt">) {</span>
			       
			       <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;CUPS server name or IP address missing.&quot;</span><span class="hl opt">));</span>
			       <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
			   <span class="hl opt">}</span>
			   <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
		       <span class="hl opt">},</span>
		   <span class="hl opt">},</span>
	       <span class="hl opt">},</span>
		 <span class="hl slc"># Show the widgets</span>
		 <span class="hl opt">[ {</span> label <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Name or IP of remote server:&quot;</span><span class="hl opt">),</span>
		     val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$remote_cups_server,</span> 
		 <span class="hl opt">} ],</span>
		 <span class="hl opt">)) {</span>
		<span class="hl slc"># Cancel was clicked</span>
		<span class="hl kwa">exit</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>write_client_conf<span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">$remote_cups_server</span><span class="hl opt">);</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">} =</span> <span class="hl kwb">$remote_cups_server</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> assure_default_printer_is_set <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}) &amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} &amp;&amp;</span>
	<span class="hl opt">(!</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}) || !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">})) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">= $::</span>noX <span class="hl opt">||</span> 
	    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Setting Default Printer...&quot;</span><span class="hl opt">));</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">} =</span> printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>get_printer<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}) {</span>
	    <span class="hl slc"># If a CUPS system has only remote printers and no default</span>
	    <span class="hl slc"># printer defined, it defines the first printer whose</span>
	    <span class="hl slc"># broadcast signal appeared after the start of the CUPS</span>
	    <span class="hl slc"># daemon, so on every start another printer gets the default</span>
	    <span class="hl slc"># printer. To avoid this, make sure that the default printer</span>
	    <span class="hl slc"># is defined.</span>
	    printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>set_printer<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">} =</span> <span class="hl str">&apos;&apos;</span> <span class="hl opt">}</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> set_cups_daemon_mode <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$modechoice, $daemonless_cups, $remote_cups_server</span><span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span>
	<span class="hl opt">({</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Local CUPS printing system or remote CUPS server?&quot;</span><span class="hl opt">),</span>
	   messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;The CUPS printing system can be used in two ways: &quot;</span><span class="hl opt">) .</span>
	       <span class="hl str">&quot;</span><span class="hl esc">\n\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;1. The CUPS printing system can run locally. &quot;</span><span class="hl opt">) .</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;Then locally connected printers can be used and remote printers on other CUPS servers in the same network are automatically discovered. &quot;</span><span class="hl opt">) .</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;Disadvantage of this approach is, that more resources on the local machine are needed: Additional software packages need to be installed, the CUPS daemon has to run in the background and needs some memory, and the IPP port (port 631) is opened. &quot;</span><span class="hl opt">) .</span>
	       <span class="hl str">&quot;</span><span class="hl esc">\n\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;2. All printing requests are immediately sent to a remote CUPS server. &quot;</span><span class="hl opt">) .</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;Here local resource occupation is reduced to a minimum. No CUPS daemon is started or port opened, no software infrastructure for setting up local print queues is installed, so less memory and disk space is used. &quot;</span><span class="hl opt">) .</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;Disadvantage is that it is not possible to define local printers then and if the specified server is down it cannot be printed at all from this machine. &quot;</span><span class="hl opt">) .</span>
	       <span class="hl str">&quot;</span><span class="hl esc">\n\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span>
	       N<span class="hl opt">(</span><span class="hl str">&quot;How should CUPS be set up on your machine?&quot;</span><span class="hl opt">),</span>
	   callbacks <span class="hl opt">=&gt; {</span>
	       complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		   <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$modechoice</span> <span class="hl kwc">eq</span> 
		       N<span class="hl opt">(</span><span class="hl str">&quot;Remote server, specify Name or IP here:&quot;</span><span class="hl opt">) &amp;&amp;</span>
		       <span class="hl kwb">$remote_cups_server</span> <span class="hl opt">=~</span> <span class="hl kwd">/^\s*$/</span><span class="hl opt">) {</span>
		       
		       <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span> N<span class="hl opt">(</span><span class="hl str">&quot;CUPS server name or IP address missing.&quot;</span><span class="hl opt">));</span>
		       <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">;</span>
		   <span class="hl opt">}</span>
		   <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	       <span class="hl opt">},</span>
	   <span class="hl opt">},</span>
       <span class="hl opt">},</span>
	 <span class="hl slc"># Show the widgets</span>
	 <span class="hl opt">[ {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$modechoice,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span>
	     type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;list&apos;</span><span class="hl opt">,</span>
	     <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
	     list <span class="hl opt">=&gt; [</span> N<span class="hl opt">(</span><span class="hl str">&quot;Local CUPS printing system&quot;</span><span class="hl opt">),</span>
		       N<span class="hl opt">(</span><span class="hl str">&quot;Remote server, specify Name or IP here:&quot;</span><span class="hl opt">) ]},</span>
	   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$remote_cups_server,</span> 
	     disabled <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		 <span class="hl kwb">$modechoice</span> <span class="hl kwc">ne</span> 
		     N<span class="hl opt">(</span><span class="hl str">&quot;Remote server, specify Name or IP here:&quot;</span><span class="hl opt">);</span>
	     <span class="hl opt">} },</span>
	   <span class="hl opt">],</span>
	 <span class="hl opt">)) {</span>
	<span class="hl slc"># OK was clicked, update the data</span>
	<span class="hl kwb">$daemonless_cups</span> <span class="hl opt">=</span> 
	    <span class="hl opt">(</span><span class="hl kwb">$modechoice</span> <span class="hl kwc">eq</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remote server, specify Name or IP here:&quot;</span><span class="hl opt">));</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$daemonless_cups</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">} =</span> <span class="hl kwb">$remote_cups_server</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">;</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>remote_cups_server<span class="hl opt">};</span>
	<span class="hl opt">}</span>
	printer<span class="hl opt">::</span>main<span class="hl opt">::</span>write_client_conf<span class="hl opt">(</span><span class="hl kwb">$daemonless_cups,</span>
					 <span class="hl kwb">$remote_cups_server</span><span class="hl opt">);</span>
	<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl slc"># Cancel was clicked</span>
	<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>


<span class="hl kwa">sub</span> setup_default_spooler <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$oldspooler</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">};</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} ||=</span> <span class="hl str">&apos;cups&apos;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;spoolerlist</span> <span class="hl opt">=</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>spooler<span class="hl opt">();</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$#spoolerlist</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span>
	set_cups_daemon_mode<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$str_spooler</span> <span class="hl opt">=</span> 
	    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_listf_raw</span><span class="hl opt">({</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Select Printer Spooler&quot;</span><span class="hl opt">),</span>
				      messages <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Which printing system (spooler) do you want to use?&quot;</span><span class="hl opt">),</span>
				      interactive_help_id <span class="hl opt">=&gt;</span> <span class="hl str">&apos;setupDefaultSpooler&apos;</span><span class="hl opt">,</span>
				  <span class="hl opt">},</span>
				    <span class="hl kwa">sub</span> <span class="hl opt">{</span> translate<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]) },</span>
				    \<span class="hl kwb">&#64;spoolerlist,</span>
				    <span class="hl kwb">$spoolers</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}}{</span>long_name<span class="hl opt">},</span>
				    <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> <span class="hl kwb">$spooler_inv</span><span class="hl opt">{</span><span class="hl kwb">$str_spooler</span><span class="hl opt">};</span>
    <span class="hl opt">}</span>
    <span class="hl slc"># Install the spooler if not done yet</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span>install_spooler<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">,</span> <span class="hl kwb">$in, $upNetwork</span><span class="hl opt">)) {</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> <span class="hl kwb">$oldspooler</span><span class="hl opt">;</span>
	<span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    assure_remote_server_is_set<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">);</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl kwb">$oldspooler</span><span class="hl opt">) {</span>
	<span class="hl slc"># Get the queues of this spooler</span>
	<span class="hl opt">{</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
				      N<span class="hl opt">(</span><span class="hl str">&quot;Reading printer data...&quot;</span><span class="hl opt">));</span>
	    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_configured_queues<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Copy queues from former spooler</span>
	copy_queues_from<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $oldspooler</span><span class="hl opt">)</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$oldspooler</span> <span class="hl opt">&amp;&amp; (</span><span class="hl kwb">$oldspooler</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">));</span>
	<span class="hl slc"># Re-read the printer database (CUPS has additional drivers, PDQ</span>
	<span class="hl slc"># has no raw queue)</span>
	<span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb <span class="hl opt">= ();</span>
	assure_default_printer_is_set<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl slc"># Save spooler choice</span>
    printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>set_spooler<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    <span class="hl kwa">return</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">};</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> configure_queue <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			       N<span class="hl opt">(</span><span class="hl str">&quot;Configuring printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">...</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>				 <span class="hl ipl">$printer</span><span class="hl str">-&gt;{currentqueue}{queue}))</span>
<span class="hl str">	if !</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{noninteractive};</span>
<span class="hl str"></span>    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{complete} = 1;</span>
<span class="hl str">    my</span> <span class="hl ipl">$retval</span> <span class="hl str">= printer::main::configure_queue(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str"></span>    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{complete} = 0;</span>
<span class="hl str">    if (!</span><span class="hl ipl">$retval</span><span class="hl str">) {</span>
<span class="hl str">	local $::isWizard = 0;</span>
<span class="hl str"></span>	<span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Printerdrake<span class="hl str">&quot;),</span>
<span class="hl str">		      N(&quot;</span>Failed to configure printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;!&quot;</span><span class="hl opt">,</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span>queue<span class="hl opt">}));</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">return</span> <span class="hl kwb">$retval</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> install_foomatic <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>testing <span class="hl opt">&amp;&amp;</span>
	<span class="hl opt">!</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/bin/foomatic-configure </span>
<span class="hl str">			/usr/bin/foomatic-rip</span>
<span class="hl str">			/usr/share/foomatic/db/source/driver/ljet4.xml)</span><span class="hl opt">)) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
				   N<span class="hl opt">(</span><span class="hl str">&quot;Installing Foomatic...&quot;</span><span class="hl opt">));</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">-&gt;</span><span class="hl kwd">install</span><span class="hl opt">(</span><span class="hl str">&apos;foomatic-db-engine&apos;</span><span class="hl opt">,</span>
			      <span class="hl str">&apos;foomatic-filters&apos;</span><span class="hl opt">,</span>
			      <span class="hl str">&apos;foomatic-db&apos;</span><span class="hl opt">)</span> 
	    <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
		<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">),</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Could not install</span> <span class="hl ipl">%s</span> <span class="hl str">packages,</span> <span class="hl ipl">%s</span> <span class="hl str">cannot be started!&quot;</span><span class="hl opt">,</span>
				<span class="hl str">&quot;Foomatic&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;printerdrake&quot;</span><span class="hl opt">));</span>
		<span class="hl kwa">exit</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl opt">};</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> wizard_close <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$in, $mode</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># Leave wizard mode with congratulations screen if $mode = 1</span>
    <span class="hl opt">$::</span>Wizard_no_previous <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">$::</span>Wizard_no_cancel <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">$::</span>Wizard_finished <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    wizard_congratulations<span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$mode</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl kwc">undef</span> <span class="hl opt">$::</span>isWizard<span class="hl opt">;</span>
    <span class="hl opt">$::</span>WizardWindow-<span class="hl opt">&gt;</span><span class="hl kwd">destroy</span> <span class="hl kwa">if</span> <span class="hl kwc">defined</span> <span class="hl opt">$::</span>WizardWindow<span class="hl opt">;</span>
    <span class="hl kwc">undef</span> <span class="hl opt">$::</span>WizardWindow<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl slc">#- Program entry point for configuration of the printing system.</span>
<span class="hl kwa">sub</span> main <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $install_step, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># $install_step is only made use of during the installation. It is</span>
    <span class="hl slc"># 0 when this function is called during the preparation of the &quot;Summary&quot;</span>
    <span class="hl slc"># screen and 1 when the user clicks on &quot;Configure&quot; on the &quot;Summary&quot; </span>
    <span class="hl slc"># screen</span>

    <span class="hl slc"># Initialization of Printerdrake and queue auto-installation:</span>
    <span class="hl slc"># During installation we do this step only once, when we prepare</span>
    <span class="hl slc"># the &quot;Summary&quot; screen in case of detected local printers or when</span>
    <span class="hl slc"># the &quot;Configure&quot; button in the &quot;Printer&quot; entry of the &quot;Summary&quot;</span>
    <span class="hl slc"># screen is clicked. If the button is clicked after an automatic</span>
    <span class="hl slc"># installation of local printers or if it is clicked for the</span>
    <span class="hl slc"># second time, these steps are not repeated.</span>

    <span class="hl slc"># Set the spooler to CUPS if we arrive here during the preparation</span>
    <span class="hl slc"># of the &quot;Summary&quot; screen of the installation, as we have local</span>
    <span class="hl slc"># printers then (if we do not have local printers, this function</span>
    <span class="hl slc"># is not called during the preparation of the &quot;Summary&quot; screen).</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>isInstall <span class="hl opt">|| !$::</span>printerdrake_initialized<span class="hl opt">) {</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} ||=</span> <span class="hl str">&apos;cups&apos;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">($::</span>isInstall <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$install_step</span> <span class="hl opt">==</span> <span class="hl num">0</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">});</span>
	init<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Main loop: During installation we only enter it when the user has</span>
    <span class="hl slc"># clicked on the &quot;Configure&quot; button in the &quot;Summary&quot; step. We do not</span>
    <span class="hl slc"># call it during the preparation of the &quot;Summary&quot; screen.</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>isInstall <span class="hl opt">||</span> <span class="hl kwb">$install_step</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl slc"># Ask for a spooler when none is defined yet</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} ||=</span> 
	    setup_default_spooler<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    
	<span class="hl slc"># Save the default spooler</span>
	printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>set_spooler<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>

	mainwindow_interactive<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl slc"># In the installation we call the clean-up manually when we leave </span>
    <span class="hl slc"># the &quot;Summary&quot; step</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>isInstall<span class="hl opt">) {</span>
	final_cleanup<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> init <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># Initialization of Printerdrake and queue auto-installation</span>

    <span class="hl slc"># This subroutine is called on every start of printerdrake</span>
    <span class="hl slc"># directly, from mcc, during installation, or for automatic print</span>
    <span class="hl slc"># queue setup in the background, triggered when</span>
    <span class="hl slc"># hotplug/udev/dynamic (script /etc/dynamic/script/lp.script)</span>
    <span class="hl slc"># discovers a new printer being connected and turned on.</span>

    <span class="hl slc"># In the latter case (background queue installation) only this</span>
    <span class="hl slc"># subroutine is called as only the automatic, non-interactive</span>
    <span class="hl slc"># print queue creation is needed. This must be totally</span>
    <span class="hl slc"># non-interactive and cannot open any window on the X desktop,</span>
    <span class="hl slc"># also packages cannot be installed, as the background process</span>
    <span class="hl slc"># cannot ask the user to insert CDs. To reach this state of</span>
    <span class="hl slc"># absolute silence, there is the global variable $::noX. If it is</span>
    <span class="hl slc"># set, all interactivity or wait message is suppressed. If</span>
    <span class="hl slc"># interactivity is required, the operation requiring interactivity</span>
    <span class="hl slc"># will be skipped.</span>

    <span class="hl slc"># Save the user mode, so that the same one is used on the next start</span>
    <span class="hl slc"># of Printerdrake</span>
    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>set_usermode<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">});</span>
    
    <span class="hl slc"># only experts should be asked for the spooler also for background</span>
    <span class="hl slc"># installation of print it should not be asked for the spooler,</span>
    <span class="hl slc"># as this feature is only supported for CUPS.</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} ||=</span> <span class="hl str">&apos;cups&apos;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} || $::</span>noX<span class="hl opt">) &amp;&amp; !$::</span>isInstall<span class="hl opt">;</span>
    
    <span class="hl slc"># If we have chosen a spooler, install it and mark it as default </span>
    <span class="hl slc"># spooler. Spooler installation is ommitted on background queue</span>
    <span class="hl slc"># installation, because this only works when CUPS is already running</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}) {</span>
	<span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">unless</span> <span class="hl opt">($::</span>noX <span class="hl opt">||</span> 
			 install_spooler<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in</span><span class="hl opt">-&gt;</span><span class="hl kwd">do_pkgs</span><span class="hl opt">,</span> <span class="hl kwb">$in, $upNetwork</span><span class="hl opt">));</span>
	assure_remote_server_is_set<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">) &amp;&amp; !$::</span>noX<span class="hl opt">;</span>
	printer<span class="hl opt">::</span>main<span class="hl opt">::</span>read_configured_queues<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">)</span>
	    <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">) &amp;&amp;</span>
		<span class="hl opt">(</span><span class="hl kwc">keys</span><span class="hl opt">(%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}}) ==</span> <span class="hl num">0</span><span class="hl opt">));</span>
	printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>set_spooler<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
    
	<span class="hl slc"># Get the default printer (Done before non-interactive queue setup,</span>
	<span class="hl slc"># so that former default is not lost)</span>
	assure_default_printer_is_set<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$nodefault</span> <span class="hl opt">= !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">};</span>

	<span class="hl slc"># Non-interactive setup of newly detected printers (This is done</span>
	<span class="hl slc"># only when not in expert mode, so we always have a spooler defined</span>
	<span class="hl slc"># here)</span>
	configure_new_printers<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span>
	    <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">;</span>
    
	<span class="hl slc"># Make sure that default printer is registered</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$nodefault</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}) {</span>
	    printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>set_printer<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl slc"># Turn on printer autodetection by default</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECT<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTLOCAL<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTNETWORK<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>AUTODETECTSMB<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
    
    <span class="hl slc"># Mark this part as done, it should not be done a second time.</span>
    <span class="hl kwa">if</span> <span class="hl opt">($::</span>isInstall<span class="hl opt">) {</span>
	<span class="hl opt">$::</span>printerdrake_initialized <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> mainwindow_interactive <span class="hl opt">{</span>

    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># Control variables for the main loop</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice, $cursorpos</span><span class="hl opt">) = (</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;::&apos;</span><span class="hl opt">);</span>

    <span class="hl kwa">while</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$queue, $newcursorpos</span><span class="hl opt">) = (</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
	<span class="hl slc"># If networking is configured, start it, but do not ask the</span>
	<span class="hl slc"># user to configure networking. We want to know whether we</span>
	<span class="hl slc"># have a local network to suppress some buttons when there is</span>
	<span class="hl slc"># no network</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$havelocalnetworks</span> <span class="hl opt">=</span>
	    check_network<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork,</span> <span class="hl num">1</span><span class="hl opt">) &amp;&amp;</span> 
	    printer<span class="hl opt">::</span>detect<span class="hl opt">::</span>getIPsInLocalNetworks<span class="hl opt">() != ();</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$havelocalnetworks_or_expert</span> <span class="hl opt">=</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$havelocalnetworks</span><span class="hl opt">;</span>
<span class="hl slc">#	$in-&gt;set_help(&apos;mainMenu&apos;) if $::isInstall;</span>
	<span class="hl slc"># Initialize the cursor position</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$cursorpos</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;::&quot;</span> <span class="hl opt">&amp;&amp;</span> 
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">} &amp;&amp;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) {</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}})) {</span>
		<span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> 
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">} .</span> N<span class="hl opt">(</span><span class="hl str">&quot; (Default)&quot;</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">) ||</span>
		     <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">)){</span>
		<span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> find <span class="hl opt">{</span> <span class="hl kwd">/!$printer-&gt;{DEFAULT}:[^!]*$/</span> <span class="hl opt">}</span> printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>get_formatted_remote_queues<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Generate the list of available printers</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;printerlist</span> <span class="hl opt">=</span> 
	    <span class="hl opt">(</span><span class="hl kwc">sort</span><span class="hl opt">(</span><span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">}</span> 
			<span class="hl opt">. (</span><span class="hl kwb">$_</span> <span class="hl kwc">eq</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}</span> ?
			   N<span class="hl opt">(</span><span class="hl str">&quot; (Default)&quot;</span><span class="hl opt">) :</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">) }</span>
		  <span class="hl kwc">keys</span><span class="hl opt">(%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}</span>
			 <span class="hl opt">|| {}})),</span>
	     <span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">) ||</span>
	      <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">)</span> ?
	      <span class="hl kwc">sort</span><span class="hl opt">(</span>printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>get_formatted_remote_queues<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">)) :</span>
	      <span class="hl opt">()));</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$noprinters</span> <span class="hl opt">=</span> <span class="hl kwb">$#printerlist</span> <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl slc"># Position the cursor where it was before (in case</span>
	<span class="hl slc"># a button was pressed).</span>
	<span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl kwb">$cursorpos</span><span class="hl opt">;</span>
	<span class="hl slc"># Show the main dialog</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">({</span> 
	    title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
	    messages <span class="hl opt">=&gt;</span> if_<span class="hl opt">(!</span><span class="hl kwb">$noprinters,</span> N<span class="hl opt">(</span><span class="hl str">&quot;The following printers are configured. Double-click on a printer to change its settings; to make it the default printer; or to view information about it. &quot;</span><span class="hl opt">)) .</span>
		        if_<span class="hl opt">(!</span><span class="hl kwb">$havelocalnetworks,</span> N<span class="hl opt">(</span><span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">WARNING: No local network connection active, remote printers can neither be detected nor tested!&quot;</span><span class="hl opt">)),</span>
	    cancel <span class="hl opt">=&gt; (</span><span class="hl str">&quot;&quot;</span><span class="hl opt">),</span>
	    ok <span class="hl opt">=&gt; (</span><span class="hl str">&quot;&quot;</span><span class="hl opt">) },</span>
	    <span class="hl slc"># List the queues</span>
	    <span class="hl opt">[</span> if_<span class="hl opt">(!</span><span class="hl kwb">$noprinters,</span>
		  <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$menuchoice,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span>
		    <span class="hl kwc">sort</span> <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span> separator <span class="hl opt">=&gt;</span> <span class="hl str">&quot;!&quot;</span><span class="hl opt">,</span> tree_expanded <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
		    quit_if_double_click <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span> allow_empty_list <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">,</span>
		    list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;printerlist</span> <span class="hl opt">}),</span>
	      <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;rcups&quot;</span> ?
	       <span class="hl opt">{</span> clicked_may_quit <span class="hl opt">=&gt;</span>
		     <span class="hl kwa">sub</span> <span class="hl opt">{</span> 
			 <span class="hl slc"># Save the cursor position</span>
			 <span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
			 <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;addprinter</span><span class="hl str">&apos;</span><span class="hl opt">;</span>
			 <span class="hl num">1</span><span class="hl opt">;</span> 
		     <span class="hl opt">},</span>
		 val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Add a new printer&quot;</span><span class="hl opt">) } : ()),</span>
	      <span class="hl opt">(((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">) ||</span>
		<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">)) &amp;&amp;</span>
	       <span class="hl kwb">$havelocalnetworks</span> ?
	       <span class="hl opt">{</span> clicked_may_quit <span class="hl opt">=&gt;</span>
		     <span class="hl kwa">sub</span> <span class="hl opt">{</span> 
			 <span class="hl slc"># Save the cursor position</span>
			 <span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
			 <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;refresh</span><span class="hl str">&apos;</span><span class="hl opt">;</span>
			 <span class="hl num">1</span><span class="hl opt">;</span>
		     <span class="hl opt">},</span>
		 val <span class="hl opt">=&gt; (</span><span class="hl kwb">$noprinters</span> ?
			 N<span class="hl opt">(</span><span class="hl str">&quot;Display all available remote CUPS printers&quot;</span><span class="hl opt">) :</span>
			 N<span class="hl opt">(</span><span class="hl str">&quot;Refresh printer list (to display all available remote CUPS printers)&quot;</span><span class="hl opt">)) } : ()),</span>
	      <span class="hl opt">(((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;cups&quot;</span><span class="hl opt">) ||</span>
		<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;rcups&quot;</span><span class="hl opt">)) &amp;&amp;</span>
	       <span class="hl kwb">$havelocalnetworks_or_expert</span> ?
	       <span class="hl opt">{</span> clicked_may_quit <span class="hl opt">=&gt;</span>
		      <span class="hl kwa">sub</span> <span class="hl opt">{</span> 
			  <span class="hl slc"># Save the cursor position</span>
			  <span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
			  <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;cupsconfig</span><span class="hl str">&apos;</span><span class="hl opt">;</span>
			  <span class="hl num">1</span><span class="hl opt">;</span>
		      <span class="hl opt">},</span>
		  val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;CUPS configuration&quot;</span><span class="hl opt">) } : ()),</span>
	      <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} &amp;&amp;</span> 
	       <span class="hl opt">(</span>files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/bin/pdq)</span><span class="hl opt">) ||</span>
		files_exist<span class="hl opt">(</span><span class="hl str">qw(/usr/lib/filters/lpf </span>
<span class="hl str">			       /usr/sbin/lpd)</span><span class="hl opt">))</span> ?
	       <span class="hl opt">{</span> clicked_may_quit <span class="hl opt">=&gt;</span>
		     <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			 <span class="hl slc"># Save the cursor position</span>
			 <span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
			 <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;spooler</span><span class="hl str">&apos;</span><span class="hl opt">;</span>
			 <span class="hl num">1</span><span class="hl opt">;</span>
		     <span class="hl opt">},</span>
		 val <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Change the printing system&quot;</span><span class="hl opt">) } :</span>
	       <span class="hl opt">()),</span>
	      <span class="hl opt">{</span> clicked_may_quit <span class="hl opt">=&gt;</span>
		    <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			<span class="hl slc"># Save the cursor position</span>
			<span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
			<span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;usermode</span><span class="hl str">&apos;</span><span class="hl opt">;</span>
			<span class="hl num">1</span> 
			<span class="hl opt">},</span>
			    val <span class="hl opt">=&gt; (</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> ? N<span class="hl opt">(</span><span class="hl str">&quot;Normal Mode&quot;</span><span class="hl opt">) :</span>
				    N<span class="hl opt">(</span><span class="hl str">&quot;Expert Mode&quot;</span><span class="hl opt">)) },</span>
	      <span class="hl opt">{</span> clicked_may_quit <span class="hl opt">=&gt;</span>
		    <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$menuchoice</span> <span class="hl opt">=</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;quit</span><span class="hl str">&apos;</span><span class="hl opt">;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
		    val <span class="hl opt">=&gt; ($::</span>isEmbedded <span class="hl opt">|| $::</span>isInstall ?
			    N<span class="hl opt">(</span><span class="hl str">&quot;Done&quot;</span><span class="hl opt">) :</span> N<span class="hl opt">(</span><span class="hl str">&quot;Quit&quot;</span><span class="hl opt">)) },</span>
	      <span class="hl opt">]);</span>
	<span class="hl slc"># Toggle expert mode and standard mode</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;usermode</span><span class="hl str">&apos;</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} =</span> printer<span class="hl opt">::</span>main<span class="hl opt">::</span>set_usermode<span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">});</span>
	    <span class="hl slc"># Read printer database for the new user mode</span>
	    <span class="hl kwb">%printer</span><span class="hl opt">::</span>main<span class="hl opt">::</span>thedb <span class="hl opt">= ();</span>
	    <span class="hl slc"># Modify menu entries to switch the tree</span>
	    <span class="hl slc"># structure between expert/normal mode.</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$spooler</span> <span class="hl opt">=</span>
		<span class="hl kwb">$spoolers</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}}{</span>short_name<span class="hl opt">};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}) {</span>
		<span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwc">keys</span><span class="hl opt">(%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}})) {</span> 
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">} =~</span> 
			<span class="hl kwd">s/^/$spooler!/</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl kwb">$cursorpos</span> <span class="hl opt">=~</span> <span class="hl kwd">s/^/$spooler!/</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwc">keys</span><span class="hl opt">(%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}})) {</span> 
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">} =~</span> 
			<span class="hl kwd">s/^$spooler!//</span><span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl kwb">$cursorpos</span> <span class="hl opt">=~</span> <span class="hl kwd">s/^$spooler!//</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwa">next</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Refresh printer list</span>
	<span class="hl kwa">next if</span> <span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;refresh</span><span class="hl str">&apos;</span><span class="hl opt">;</span>
	<span class="hl slc"># Configure CUPS</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;cupsconfig</span><span class="hl str">&apos;</span><span class="hl opt">) {</span>
	    config_cups<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">);</span>
	    <span class="hl kwa">next</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Call function to switch to another spooler</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;spooler</span><span class="hl str">&apos;</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =</span> setup_default_spooler<span class="hl opt">(</span><span class="hl kwb">$printer, $security, $in, $upNetwork</span><span class="hl opt">) ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">};</span>
	    <span class="hl kwa">next</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Add a new print queue</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;addprinter</span><span class="hl str">&apos;</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$newcursorpos</span> <span class="hl opt">=</span> add_printer<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Edit an existing print queue</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$menuchoice</span> <span class="hl opt">=~</span> <span class="hl kwd">/!([^\s!:]+):[^!]*$/</span><span class="hl opt">) {</span>
	    <span class="hl slc"># Rip the queue name out of the chosen menu entry</span>
	    <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span><span class="hl opt">;</span>
	    <span class="hl slc"># Save the cursor position</span>
	    <span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl kwb">$menuchoice</span><span class="hl opt">;</span>
	    <span class="hl slc"># Edit the queue</span>
	    edit_printer<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork, $queue</span><span class="hl opt">);</span>
	    <span class="hl kwb">$newcursorpos</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc">#- Close printerdrake</span>
	<span class="hl kwb">$menuchoice</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;</span><span class="hl ipl">&#64;quit</span><span class="hl str">&apos;</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>

	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$newcursorpos</span><span class="hl opt">) {</span>
	    <span class="hl slc"># Set the cursor onto the current menu entry</span>
	    <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$queue</span><span class="hl opt">) {</span>
		<span class="hl slc"># Make sure that the cursor is still at the same position</span>
		<span class="hl slc"># in the main menu when one has modified something on the</span>
		<span class="hl slc"># current printer</span>
		<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">}}) {</span>
		    <span class="hl kwc">my</span> <span class="hl kwb">$s1</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot; (Default)&quot;</span><span class="hl opt">);</span>
		    <span class="hl kwc">my</span> <span class="hl kwb">$s2</span> <span class="hl opt">=</span> <span class="hl kwb">$s1</span><span class="hl opt">;</span>
		    <span class="hl kwb">$s2</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\(/\\(/</span><span class="hl opt">;</span>
		    <span class="hl kwb">$s2</span> <span class="hl opt">=~</span> <span class="hl kwd">s/\)/\\)/</span><span class="hl opt">;</span>
		    <span class="hl kwb">$cursorpos</span> <span class="hl opt">.=</span> <span class="hl kwb">$s1</span>
			<span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">}</span> <span class="hl kwc">eq</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">} &amp;&amp;</span> <span class="hl kwb">$cursorpos</span> <span class="hl opt">!~</span> <span class="hl kwd">/$s2/</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span>
			<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">} .</span>
			<span class="hl opt">(</span><span class="hl kwb">$queue</span> <span class="hl kwc">eq</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}</span> ?
			 N<span class="hl opt">(</span><span class="hl str">&quot; (Default)&quot;</span><span class="hl opt">) :</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">);</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$cursorpos</span> <span class="hl opt">=</span> <span class="hl str">&quot;::&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwc">delete</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">});</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> add_printer <span class="hl opt">{</span>

    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># The add-printer wizard of printerdrake, adds a queue for a local</span>
    <span class="hl slc"># or remote printer interactively</span>

    <span class="hl slc"># Tell subroutines that we add a new printer</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>

    <span class="hl slc"># Printer queue name</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>

    <span class="hl slc">#- Set default values for a new queue</span>
    <span class="hl kwb">$printer_type_inv</span><span class="hl opt">{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">}}</span> <span class="hl kwc">or</span> 
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> printer<span class="hl opt">::</span><span class="hl kwa">default</span><span class="hl opt">::</span>printer_type<span class="hl opt">();</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">} = {</span> queue    <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 foomatic <span class="hl opt">=&gt;</span> <span class="hl num">0</span><span class="hl opt">,</span>
				 desc     <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 loc      <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 make     <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 model    <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 printer  <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 driver   <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 <span class="hl kwc">connect</span>  <span class="hl opt">=&gt;</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">,</span>
				 spooler  <span class="hl opt">=&gt;</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">},</span>
			     <span class="hl opt">};</span>
    <span class="hl slc">#- Do all the configuration steps for a new queue</span>
  step_0<span class="hl opt">:</span>
    <span class="hl slc">#if (!$::isEmbedded &amp;&amp; !$::isInstall &amp;&amp;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>isInstall <span class="hl opt">&amp;&amp;</span>
	<span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">isa</span><span class="hl opt">(</span><span class="hl str">&apos;interactive::gtk&apos;</span><span class="hl opt">)) {</span>
	<span class="hl slc"># Enter wizard mode (only after installation)</span>
	<span class="hl opt">$::</span>Wizard_pix_up <span class="hl opt">=</span> <span class="hl str">&quot;printerdrake.png&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">$::</span>Wizard_title <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Add a new printer&quot;</span><span class="hl opt">);</span>
	<span class="hl opt">$::</span>isWizard <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl slc"># Wizard welcome screen</span>
	<span class="hl opt">$::</span>Wizard_no_previous <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl kwc">undef</span> <span class="hl opt">$::</span>Wizard_no_cancel<span class="hl opt">;</span> <span class="hl kwc">undef</span> <span class="hl opt">$::</span>Wizard_finished<span class="hl opt">;</span>
	wizard_welcome<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
	    wizard_close<span class="hl opt">(</span><span class="hl kwb">$in,</span> <span class="hl num">0</span><span class="hl opt">);</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">};</span>
	<span class="hl kwc">undef</span> <span class="hl opt">$::</span>Wizard_no_previous<span class="hl opt">;</span>
	<span class="hl kwc">eval</span> <span class="hl opt">{</span>
	    <span class="hl slc">#do {</span>
	    <span class="hl slc"># eval to catch wizard cancel. The wizard stuff </span>
	    <span class="hl slc"># should be in a separate function with steps. see </span>
	    <span class="hl slc"># drakgw.</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> <span class="hl str">&quot;LOCAL&quot;</span><span class="hl opt">;</span>
	  step_1<span class="hl opt">:</span>
	    <span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> <span class="hl kwc">or</span> choose_printer_type<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span>
		<span class="hl kwa">goto</span> step_0<span class="hl opt">;</span>
	  step_2<span class="hl opt">:</span>
	    setup_printer_connection<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span> 
		<span class="hl kwa">do</span> <span class="hl opt">{</span>
		    <span class="hl kwa">goto</span> step_1 <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">};</span>
		    <span class="hl kwa">goto</span> step_0<span class="hl opt">;</span>
		<span class="hl opt">};</span>
	    get_db_entry<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	  step_3_9<span class="hl opt">:</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} &amp;&amp; !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">}) {</span>
		is_model_correct<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> step_2<span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	  step_4<span class="hl opt">:</span>
	    <span class="hl slc"># Remember DB entry for &quot;Previous&quot; button in wizard</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$dbentry</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} ||</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUALMODEL<span class="hl opt">}) {</span> 
		choose_model<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
		    <span class="hl slc"># Restore DB entry</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwb">$dbentry</span><span class="hl opt">;</span>
		    <span class="hl kwa">goto</span> step_3_9 <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUALMODEL<span class="hl opt">};</span>
		    <span class="hl kwa">goto</span> step_2<span class="hl opt">;</span>
		<span class="hl opt">};</span>
	    <span class="hl opt">}</span>
	    get_printer_info<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
		<span class="hl kwa">goto</span> step_4 <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} ||</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUALMODEL<span class="hl opt">};</span>
		<span class="hl kwa">goto</span> step_3_9<span class="hl opt">;</span>
	    <span class="hl opt">};</span>
	    <span class="hl kwb">$queue</span> <span class="hl opt">=</span> generate_queuename<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	  step_5<span class="hl opt">:</span>
	    setup_options<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span>
		<span class="hl kwa">goto</span> step_4<span class="hl opt">;</span>
	  step_6<span class="hl opt">:</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} ||</span>
		<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MORETHANONE<span class="hl opt">}) {</span>
		choose_printer_name<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
		    <span class="hl kwa">goto</span> step_5 <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">};</span>
		    <span class="hl kwa">goto</span> step_4 <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUALMODEL<span class="hl opt">};</span>
		    <span class="hl kwa">goto</span> step_3_9<span class="hl opt">;</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>
	    configure_queue<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or die</span> <span class="hl str">&apos;wizcancel&apos;</span><span class="hl opt">;</span>
	    <span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">}</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">};</span>
	  step_7<span class="hl opt">:</span>
	    <span class="hl opt">$::</span>Wizard_no_previous <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    setasdefault<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$testpages</span> <span class="hl opt">=</span> print_testpages<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} !~</span> <span class="hl kwd">/LOCAL/</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$upNetwork</span><span class="hl opt">);</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$testpages</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span>
		<span class="hl slc"># User was content with test pages</span>
		<span class="hl slc"># Leave wizard mode with congratulations screen</span>
		wizard_close<span class="hl opt">(</span><span class="hl kwb">$in,</span> <span class="hl num">1</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$testpages</span> <span class="hl opt">==</span> <span class="hl num">2</span><span class="hl opt">) {</span>
		<span class="hl slc"># User was not content with test pages</span>
		<span class="hl slc"># Leave wizard mode without congratulations</span>
		<span class="hl slc"># screen</span>
		wizard_close<span class="hl opt">(</span><span class="hl kwb">$in,</span> <span class="hl num">0</span><span class="hl opt">);</span>
		<span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">};</span>
		edit_printer<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork, $queue</span><span class="hl opt">);</span>
		<span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl slc"># &quot;Previous&quot; button clicked in test page dialog</span>
		<span class="hl kwa">goto</span> step_7<span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">};</span>
	<span class="hl kwc">die</span> <span class="hl kwa">if</span> <span class="hl kwb">$&#64;</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$&#64;</span> <span class="hl opt">!~</span> <span class="hl kwd">/^wizcancel/</span><span class="hl opt">;</span>
	wizard_close<span class="hl opt">(</span><span class="hl kwb">$in,</span> <span class="hl num">0</span><span class="hl opt">);</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl slc"># Print queue setup without wizard (for installation)</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> <span class="hl str">&quot;LOCAL&quot;</span><span class="hl opt">;</span>
	wizard_welcome<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> <span class="hl kwc">or</span> choose_printer_type<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	setup_printer_connection<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	get_db_entry<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} &amp;&amp; !</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">}) {</span>
	    is_model_correct<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} ||</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUALMODEL<span class="hl opt">}) {</span> 
	    choose_model<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	get_printer_info<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwb">$queue</span> <span class="hl opt">=</span> generate_queuename<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	setup_options<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">} ||</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">} ||</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MORETHANONE<span class="hl opt">}) {</span>
	    choose_printer_name<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	configure_queue<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwc">undef</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">}</span> <span class="hl kwa">if</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>MANUAL<span class="hl opt">};</span>
	setasdefault<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$testpages</span> <span class="hl opt">=</span> print_testpages<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} !~</span> <span class="hl kwd">/LOCAL/</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$upNetwork</span><span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$testpages</span> <span class="hl opt">==</span> <span class="hl num">2</span><span class="hl opt">) {</span>
	    <span class="hl slc"># User was not content with test pages</span>
	    <span class="hl kwb">$queue</span> <span class="hl opt">=</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">};</span>
	    edit_printer<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork, $queue</span><span class="hl opt">);</span>
	    <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">};</span>

    <span class="hl slc"># Delete some variables</span>
    cleanup<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>

    <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> edit_printer <span class="hl opt">{</span>

    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork, $queue</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl slc"># The menu for doing modifications on an existing print queue</span>

    <span class="hl slc"># Cursor position in queue modification window</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$modify</span> <span class="hl opt">=</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer options&quot;</span><span class="hl opt">);</span>

    <span class="hl slc"># Tell subroutines that we modify the printer</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>NEW<span class="hl opt">} =</span> <span class="hl num">0</span><span class="hl opt">;</span>

    <span class="hl kwa">while</span> <span class="hl opt">(</span><span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">}) ||</span> 
	   <span class="hl kwc">defined</span><span class="hl opt">(</span><span class="hl kwb">$queue</span><span class="hl opt">)) {</span>  <span class="hl slc"># Do not when current queue</span>
	                       <span class="hl slc"># is deleted</span>
	<span class="hl slc"># Modify a queue, ask which part should be modified</span>
<span class="hl slc">#	$in-&gt;set_help(&apos;modifyPrinterMenu&apos;) if $::isInstall;</span>
	<span class="hl slc"># Get some info to display</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$infoline</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}) {</span>
	    <span class="hl slc"># Here we must regenerate the menu entry, because the</span>
	    <span class="hl slc"># parameters can be changed.</span>
	    printer<span class="hl opt">::</span>main<span class="hl opt">::</span>make_menuentry<span class="hl opt">(</span><span class="hl kwb">$printer,$queue</span><span class="hl opt">);</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">} =~</span>
		<span class="hl kwd">/!([^!]+)$/</span><span class="hl opt">) {</span>
		<span class="hl kwb">$infoline</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl opt">.</span>
		    <span class="hl opt">(</span><span class="hl kwb">$queue</span> <span class="hl kwc">eq</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">}</span> ? N<span class="hl opt">(</span><span class="hl str">&quot; (Default)&quot;</span><span class="hl opt">) :</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">) .</span>
		    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>desc<span class="hl opt">}</span> ?
		     <span class="hl str">&quot;, Descr.:</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{desc}&quot;</span> <span class="hl opt">:</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">) .</span>
		     <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>loc<span class="hl opt">}</span> ?
		      <span class="hl str">&quot;, Loc.:</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{loc}&quot;</span> <span class="hl opt">:</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">) .</span>
		      <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> ?
		       <span class="hl str">&quot;, Driver:</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}{</span><span class="hl ipl">$queue</span><span class="hl str">}{queuedata}{driver}&quot;</span> <span class="hl opt">:</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl slc"># Extract the entry for a remote CUPS queue from the menu entry</span>
	    <span class="hl slc"># for it.</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$menuentry</span> <span class="hl opt">=</span> find <span class="hl opt">{</span> <span class="hl kwd">/!$queue:[^!]*$/</span> <span class="hl opt">}</span> printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>get_formatted_remote_queues<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">);</span>
	    <span class="hl kwb">$infoline</span> <span class="hl opt">=</span> <span class="hl kwb">$1</span> <span class="hl kwa">if</span> <span class="hl kwb">$menuentry</span> <span class="hl opt">=~</span> <span class="hl kwd">/!([^!]+)$/</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc"># Mark the printer queue which we edit</span>
	<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">} =</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_</span><span class="hl opt">(</span>
	    <span class="hl opt">{</span> title <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Modify printer configuration&quot;</span><span class="hl opt">),</span>
	      messages <span class="hl opt">=&gt;</span> 
		  N<span class="hl opt">(</span><span class="hl str">&quot;Printer</span> <span class="hl ipl">%s%s</span>
<span class="hl str">What do you want to modify on this printer?&quot;</span><span class="hl opt">,</span>
		    <span class="hl kwb">$infoline,</span>
		    if_<span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} =~</span> <span class="hl kwd">/cups/</span><span class="hl opt">) &amp;&amp;</span>
			<span class="hl opt">!</span>printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>queue_enabled<span class="hl opt">(</span><span class="hl kwb">$queue</span><span class="hl opt">),</span>
			<span class="hl str">&quot;</span><span class="hl esc">\n</span><span class="hl str">&quot;</span> <span class="hl opt">.</span> N<span class="hl opt">(</span><span class="hl str">&quot;This printer is disabled&quot;</span><span class="hl opt">))),</span>
		  cancel <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Close&quot;</span><span class="hl opt">),</span>
		  ok <span class="hl opt">=&gt;</span> N<span class="hl opt">(</span><span class="hl str">&quot;Do it!&quot;</span><span class="hl opt">)</span>
	      <span class="hl opt">},</span>
	    <span class="hl opt">[ {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$modify,</span> format <span class="hl opt">=&gt;</span> \<span class="hl opt">&amp;</span>translate<span class="hl opt">,</span> 
		type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;list&apos;</span><span class="hl opt">,</span> separator <span class="hl opt">=&gt;</span> <span class="hl str">&apos;|&apos;</span><span class="hl opt">,</span>
		list <span class="hl opt">=&gt; [ (</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}</span> ?
			   <span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Printer connection type&quot;</span><span class="hl opt">),</span>
			    N<span class="hl opt">(</span><span class="hl str">&quot;Printer name, description, location&quot;</span><span class="hl opt">),</span>
			    <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>expert<span class="hl opt">}</span> ?
			     N<span class="hl opt">(</span><span class="hl str">&quot;Printer manufacturer, model, driver&quot;</span><span class="hl opt">) :</span>
			     N<span class="hl opt">(</span><span class="hl str">&quot;Printer manufacturer, model&quot;</span><span class="hl opt">)),</span>
			    if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>make<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;&quot;</span> <span class="hl opt">&amp;&amp;</span>
				<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>model<span class="hl opt">}</span> <span class="hl kwc">ne</span> N<span class="hl opt">(</span><span class="hl str">&quot;Unknown model&quot;</span><span class="hl opt">) &amp;&amp;</span>
				<span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>model<span class="hl opt">}</span> <span class="hl kwc">ne</span> N<span class="hl opt">(</span><span class="hl str">&quot;Raw printer&quot;</span><span class="hl opt">),</span>
				N<span class="hl opt">(</span><span class="hl str">&quot;Printer options&quot;</span><span class="hl opt">))) : ()),</span>
			  if_<span class="hl opt">(</span><span class="hl kwb">$queue</span> <span class="hl kwc">ne</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DEFAULT<span class="hl opt">},</span>
			      N<span class="hl opt">(</span><span class="hl str">&quot;Set this printer as the default&quot;</span><span class="hl opt">)),</span>
			  if_<span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;pdq&quot;</span><span class="hl opt">) &amp;&amp;</span>
			      <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">},</span>
			      if_<span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} !~</span> <span class="hl kwd">/cups/</span><span class="hl opt">) ||</span>
				  <span class="hl opt">!</span>printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>queue_enabled<span class="hl opt">(</span><span class="hl kwb">$queue</span><span class="hl opt">),</span>
				  N<span class="hl opt">(</span><span class="hl str">&quot;Enable Printer&quot;</span><span class="hl opt">)),</span>
			      if_<span class="hl opt">((</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>SPOOLER<span class="hl opt">} !~</span> <span class="hl kwd">/cups/</span><span class="hl opt">) ||</span>
				  printer<span class="hl opt">::</span>cups<span class="hl opt">::</span>queue_enabled<span class="hl opt">(</span><span class="hl kwb">$queue</span><span class="hl opt">),</span>
				  N<span class="hl opt">(</span><span class="hl str">&quot;Disable Printer&quot;</span><span class="hl opt">))),</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;Print test pages&quot;</span><span class="hl opt">),</span>
			  N<span class="hl opt">(</span><span class="hl str">&quot;Learn how to use this printer&quot;</span><span class="hl opt">),</span>
			  if_<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">},</span> N<span class="hl opt">(</span><span class="hl str">&quot;Remove printer&quot;</span><span class="hl opt">)) ] } ])) {</span>

	    <span class="hl slc">#- Copy the queue data and work on the copy</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">} = {};</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}) {</span>
		printer<span class="hl opt">::</span>main<span class="hl opt">::</span>copy_printer_params<span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">},</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">});</span>
	    <span class="hl opt">}</span>
	    <span class="hl slc">#- keep in mind old name of queue (in case of changing)</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">} =</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">} =</span> <span class="hl kwb">$queue</span><span class="hl opt">;</span>
	    <span class="hl slc">#- Reset some variables</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_CHOICE<span class="hl opt">} =</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
	    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>DBENTRY<span class="hl opt">} =</span> <span class="hl kwc">undef</span><span class="hl opt">;</span>
	    <span class="hl slc">#- Which printer type did we have before (check </span>
	    <span class="hl slc">#- beginning of URI)</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}) {</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span> <span class="hl kwd">m!^ptal://?hpjd!</span><span class="hl opt">) {</span>
		    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> <span class="hl str">&quot;socket&quot;</span><span class="hl opt">;</span>
		<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		    <span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$type</span> <span class="hl opt">(</span><span class="hl str">qw(file parallel serial usb ptal</span>
<span class="hl str">					 mtink lpd socket smb ncp</span>
<span class="hl str">					 postpipe)</span><span class="hl opt">) {</span>
			<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">}{</span><span class="hl kwc">connect</span><span class="hl opt">} =~</span>
			    <span class="hl kwd">/^$type:/</span><span class="hl opt">) {</span>
			    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>TYPE<span class="hl opt">} =</span> 
				<span class="hl opt">(</span><span class="hl kwb">$type</span> <span class="hl opt">=~</span> 
				 <span class="hl kwd">/(file|parallel|serial|usb|ptal|mtink)/</span> ? 
				 <span class="hl str">&apos;LOCAL&apos;</span> <span class="hl opt">:</span> <span class="hl kwc">uc</span><span class="hl opt">(</span><span class="hl kwb">$type</span><span class="hl opt">));</span>
			    <span class="hl kwa">last</span><span class="hl opt">;</span>
			<span class="hl opt">}</span>
		    <span class="hl opt">}</span>
		<span class="hl opt">}</span>
	    <span class="hl opt">}</span>

	    <span class="hl slc"># Do the chosen task</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$modify</span> <span class="hl kwc">eq</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer connection type&quot;</span><span class="hl opt">)) {</span>
		choose_printer_type<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) &amp;&amp;</span>
		    setup_printer_connection<span class="hl opt">(</span><span class="hl kwb">$printer, $in, $upNetwork</span><span class="hl opt">) &amp;&amp;</span>
		    <span class="hl slc">#get_db_entry($printer, $in) &amp;&amp;</span>
		    <span class="hl slc">#get_printer_info($printer, $in) &amp;&amp;</span>
		    configure_queue<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$modify</span> <span class="hl kwc">eq</span> N<span class="hl opt">(</span><span class="hl str">&quot;Printer name, description, location&quot;</span><span class="hl opt">)) {</span>
		choose_printer_name<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">)</span> <span class="hl kwc">and</span>
		    configure_queue<span class="hl opt">(</span><span class="hl kwb">$printer, $in</span><span class="hl opt">);</span>
		<span class="hl slc"># Delete old queue when it was renamed</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwc">lc</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>QUEUE<span class="hl opt">})</span> <span class="hl kwc">ne lc</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>OLD_QUEUE<span class="hl opt">})) {</span>
		    <span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
			 N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
			 N<span class="hl opt">(</span><span class="hl str">&quot;Removing old printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">...</span><span class="hl str">&quot;,</span>
<span class="hl str"></span>			   <span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_QUEUE}));</span>
<span class="hl str">		    printer::main::remove_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{OLD_QUEUE});</span>
<span class="hl str">		    # If the default printer was renamed, correct the</span>
<span class="hl str">		    # the default printer setting of the spooler</span>
<span class="hl str">		    if (</span><span class="hl ipl">$queue</span> <span class="hl str">eq</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT}) {</span>
<span class="hl str"></span>			<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT} =</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE};</span>
<span class="hl str">			printer::default::set_printer(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">		    }</span>
<span class="hl str"></span>		    <span class="hl ipl">$queue</span> <span class="hl str">=</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE};</span>
<span class="hl str">		}</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Printer manufacturer<span class="hl opt">,</span> model<span class="hl opt">,</span> driver<span class="hl str">&quot;) ||</span>
<span class="hl str"></span>		     <span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Printer manufacturer<span class="hl opt">,</span> model<span class="hl str">&quot;)) {</span>
<span class="hl str">		get_db_entry(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">);</span>
<span class="hl str">		choose_model(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) &amp;&amp;</span>
<span class="hl str">		    get_printer_info(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) &amp;&amp;</span>
<span class="hl str">		    setup_options(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) &amp;&amp;</span>
<span class="hl str">		    configure_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">);</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Printer options<span class="hl str">&quot;)) {</span>
<span class="hl str">		get_printer_info(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) &amp;&amp;</span>
<span class="hl str">		    setup_options(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">) &amp;&amp;</span>
<span class="hl str">		    configure_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">);</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Set this printer as the <span class="hl kwa">default</span><span class="hl str">&quot;)) {</span>
<span class="hl str">		default_printer(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$queue</span><span class="hl str">);</span>
<span class="hl str">		# The &quot;</span>Set this printer as the <span class="hl kwa">default</span><span class="hl str">&quot; menu entry will</span>
<span class="hl str">		# disappear if the printer is the default, so go back to the</span>
<span class="hl str">		# default entry</span>
<span class="hl str"></span>		<span class="hl ipl">$modify</span> <span class="hl str">= N(&quot;</span>Printer options<span class="hl str">&quot;);</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Enable Printer<span class="hl str">&quot;)) {</span>
<span class="hl str">		printer::main::enable_disable_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$queue,</span> <span class="hl str">1) &amp;&amp;</span>
<span class="hl str"></span>		    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Enable Printer<span class="hl str">&quot;),</span>
<span class="hl str">				  N(&quot;</span>Printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; is now enabled.&quot;</span><span class="hl opt">,</span> 
				    <span class="hl kwb">$queue</span><span class="hl opt">));</span>
	    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$modify</span> <span class="hl kwc">eq</span> N<span class="hl opt">(</span><span class="hl str">&quot;Disable Printer&quot;</span><span class="hl opt">)) {</span>
		printer<span class="hl opt">::</span>main<span class="hl opt">::</span>enable_disable_queue<span class="hl opt">(</span><span class="hl kwb">$printer, $queue,</span> <span class="hl num">0</span><span class="hl opt">) &amp;&amp;</span>
		    <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>N<span class="hl opt">(</span><span class="hl str">&quot;Disable Printer&quot;</span><span class="hl opt">),</span>
				  N<span class="hl opt">(</span><span class="hl str">&quot;Printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span> <span class="hl kwa">is</span> now disabled<span class="hl opt">.</span><span class="hl str">&quot;, </span>
<span class="hl str"></span>				    <span class="hl ipl">$queue</span><span class="hl str">));</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Print test pages<span class="hl str">&quot;)) {</span>
<span class="hl str">		print_testpages(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$upNetwork</span><span class="hl str">);</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Learn how to <span class="hl kwa">use</span> this printer<span class="hl str">&quot;)) {</span>
<span class="hl str">		printer_help(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in</span><span class="hl str">);</span>
<span class="hl str">	    } elsif (</span><span class="hl ipl">$modify</span> <span class="hl str">eq N(&quot;</span>Remove printer<span class="hl str">&quot;)) {</span>
<span class="hl str">		if (remove_printer(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$queue</span><span class="hl str">)) {</span>
<span class="hl str">		    # Let the main menu cursor go to the default</span>
<span class="hl str">		    # position</span>
<span class="hl str">		    delete</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{QUEUE};</span>
<span class="hl str">		    undef</span> <span class="hl ipl">$queue</span><span class="hl str">;</span>
<span class="hl str">		}</span>
<span class="hl str">	    }</span>
<span class="hl str"></span>
<span class="hl str">	    # Delete some variables</span>
<span class="hl str">	    cleanup(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str">	} else {</span>
<span class="hl str">	    # User closed the dialog</span>
<span class="hl str"></span>
<span class="hl str">	    # Delete some variables</span>
<span class="hl str">	    cleanup(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str"></span>
<span class="hl str">	    last;</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub remove_printer {</span>
<span class="hl str"></span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$queue</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Asks the user whether he really wants to remove the selected printer</span>
<span class="hl str">    # and, if yes, removes it. The default printer will be reassigned if</span>
<span class="hl str">    # needed.</span>
<span class="hl str"></span>
<span class="hl str">    if (</span><span class="hl ipl">$in</span><span class="hl str">-&gt;ask_yesorno(</span>
<span class="hl str">	 N(&quot;</span>Warning<span class="hl str">&quot;), N(&quot;</span>Do you really want to remove the printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot;?&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$queue</span><span class="hl opt">),</span>
	 <span class="hl num">1</span><span class="hl opt">)) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$_w</span> <span class="hl opt">=</span> <span class="hl kwb">$in</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>
	     N<span class="hl opt">(</span><span class="hl str">&quot;Printerdrake&quot;</span><span class="hl opt">),</span>
	     N<span class="hl opt">(</span><span class="hl str">&quot;Removing printer</span> <span class="hl esc">\&quot;</span><span class="hl str"></span><span class="hl ipl">%s\</span><span class="hl str">&quot;</span><span class="hl opt">...</span><span class="hl str">&quot;,</span> <span class="hl ipl">$queue</span><span class="hl str">));</span>
<span class="hl str">	if (printer::main::remove_queue(</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$queue</span><span class="hl str">)) { </span>
<span class="hl str">	    # Define a new default printer if we have</span>
<span class="hl str">	    # removed the default one</span>
<span class="hl str">	    if (</span><span class="hl ipl">$queue</span> <span class="hl str">eq</span> <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT}) {</span>
<span class="hl str">		my</span> <span class="hl ipl">&#64;k</span> <span class="hl str">= sort(keys %{</span><span class="hl ipl">$printer</span><span class="hl str">-&gt;{configured}});</span>
<span class="hl str"></span>		<span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT} =</span> <span class="hl ipl">$k</span><span class="hl str">[0];</span>
<span class="hl str">		printer::default::set_printer(</span><span class="hl ipl">$printer</span><span class="hl str">) if</span> <span class="hl ipl">&#64;k</span><span class="hl str">;</span>
<span class="hl str">	    }</span>
<span class="hl str">	    return 1;</span>
<span class="hl str">	}</span>
<span class="hl str">    }</span>
<span class="hl str">    return 0;</span>
<span class="hl str">}</span>
<span class="hl str"></span>
<span class="hl str">sub default_printer {</span>
<span class="hl str"></span>
<span class="hl str">    my (</span><span class="hl ipl">$printer,</span> <span class="hl str"></span><span class="hl ipl">$in,</span> <span class="hl str"></span><span class="hl ipl">$queue</span><span class="hl str">) =</span> <span class="hl ipl">&#64;_</span><span class="hl str">;</span>
<span class="hl str"></span>
<span class="hl str">    # Makes the given queue the default queue and gives an information</span>
<span class="hl str">    # message</span>
<span class="hl str"></span>
<span class="hl str"></span>    <span class="hl ipl">$printer</span><span class="hl str">-&gt;{DEFAULT} =</span> <span class="hl ipl">$queue</span><span class="hl str">;</span>
<span class="hl str">    printer::default::set_printer(</span><span class="hl ipl">$printer</span><span class="hl str">);</span>
<span class="hl str"></span>    <span class="hl ipl">$in</span><span class="hl str">-&gt;ask_warn(N(&quot;</span>Default printer<span class="hl str">&quot;),</span>
<span class="hl str">		  N(&quot;</span>The printer <span class="hl esc">\&quot;</span><span class="hl kwb">%s\</span><span class="hl str">&quot; is set as the default printer now.&quot;</span><span class="hl opt">,</span>
		    <span class="hl kwb">$queue</span><span class="hl opt">));</span>
    <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> cleanup <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># Clean up the $printer data structure after printer manipulations</span>
    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl str">qw(OLD_QUEUE TYPE str_type DBENTRY ARGS </span>
<span class="hl str">		OLD_CHOICE MANUAL)</span><span class="hl opt">) {</span>
	<span class="hl kwc">delete</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">});</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>currentqueue<span class="hl opt">} = {};</span>
    <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>complete<span class="hl opt">} =</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> final_cleanup <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl slc"># Clean up the $printer data structure for auto-install log</span>
    <span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$queue</span> <span class="hl opt">(</span><span class="hl kwc">keys</span> <span class="hl opt">%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}}) {</span>
	<span class="hl kwa">foreach</span> <span class="hl kwc">my</span> <span class="hl kwb">$item</span> <span class="hl opt">(</span><span class="hl kwc">keys</span> <span class="hl opt">%{</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}}) {</span>
	    <span class="hl kwc">delete</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span><span class="hl kwb">$item</span><span class="hl opt">})</span> <span class="hl kwa">if</span> <span class="hl kwb">$item</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;queuedata&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwc">delete</span><span class="hl opt">(</span><span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span>configured<span class="hl opt">}{</span><span class="hl kwb">$queue</span><span class="hl opt">}{</span>queuedata<span class="hl opt">}{</span>menuentry<span class="hl opt">});</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl str">qw(Old_queue OLD_QUEUE QUEUE TYPE str_type currentqueue DBENTRY ARGS complete OLD_CHOICE NEW MORETHANONE MANUALMODEL AUTODETECT AUTODETECTLOCAL AUTODETECTNETWORK AUTODETECTSMB noninteractive expert)</span><span class="hl opt">)</span>
    <span class="hl opt">{</span> <span class="hl kwc">delete</span> <span class="hl kwb">$printer</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">} };</span>
<span class="hl opt">}</span>

</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.1</a> (<a href='https://git-scm.com/'>git 2.21.0</a>) at 2025-02-18 15:01:10 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>