19780544fSAndrew Rist#**************************************************************
29780544fSAndrew Rist#
39780544fSAndrew Rist#  Licensed to the Apache Software Foundation (ASF) under one
49780544fSAndrew Rist#  or more contributor license agreements.  See the NOTICE file
59780544fSAndrew Rist#  distributed with this work for additional information
69780544fSAndrew Rist#  regarding copyright ownership.  The ASF licenses this file
79780544fSAndrew Rist#  to you under the Apache License, Version 2.0 (the
89780544fSAndrew Rist#  "License"); you may not use this file except in compliance
99780544fSAndrew Rist#  with the License.  You may obtain a copy of the License at
109780544fSAndrew Rist#
119780544fSAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
129780544fSAndrew Rist#
139780544fSAndrew Rist#  Unless required by applicable law or agreed to in writing,
149780544fSAndrew Rist#  software distributed under the License is distributed on an
159780544fSAndrew Rist#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169780544fSAndrew Rist#  KIND, either express or implied.  See the License for the
179780544fSAndrew Rist#  specific language governing permissions and limitations
189780544fSAndrew Rist#  under the License.
199780544fSAndrew Rist#
209780544fSAndrew Rist#**************************************************************
219780544fSAndrew Rist
229780544fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweirpackage installer::languages;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::converter;
27cdf0e10cSrcweiruse installer::existence;
28cdf0e10cSrcweiruse installer::exiter;
29cdf0e10cSrcweiruse installer::globals;
30cdf0e10cSrcweiruse installer::remover;
31cdf0e10cSrcweiruse installer::ziplist;
32cdf0e10cSrcweir
33*01a01bd6SAndre Fischer=head2 analyze_languagelist()
34*01a01bd6SAndre Fischer
35*01a01bd6SAndre Fischer    Convert $installer::globals::languagelist into $installer::globals::languageproduct.
36*01a01bd6SAndre Fischer
37*01a01bd6SAndre Fischer    That is now just a replacement of '_' with ','.
38*01a01bd6SAndre Fischer
39*01a01bd6SAndre Fischer    $installer::globals::languageproduct (specified by the -l option
40*01a01bd6SAndre Fischer    on the command line) can contain multiple languages separated by
41*01a01bd6SAndre Fischer    '_' to specify multilingual builds.
42*01a01bd6SAndre Fischer
43*01a01bd6SAndre Fischer    Separation by '#' to build multiple languages (single or
44*01a01bd6SAndre Fischer    multilingual) in one make_installer.pl run is not supported
45*01a01bd6SAndre Fischer    anymore.  Call make_installer.pl with all languages separately instead:
46*01a01bd6SAndre Fischer    make_installer.pl -l L1#L2
47*01a01bd6SAndre Fischer    ->
48*01a01bd6SAndre Fischer    make_installer.pl -l L1
49*01a01bd6SAndre Fischer    make_installer.pl -l L2
50*01a01bd6SAndre Fischer
51*01a01bd6SAndre Fischer=cut
52*01a01bd6SAndre Fischersub analyze_languagelist()
53*01a01bd6SAndre Fischer{
54*01a01bd6SAndre Fischer    my $languageproduct = $installer::globals::languagelist;
55*01a01bd6SAndre Fischer
56*01a01bd6SAndre Fischer    $languageproduct =~ s/\_/\,/g;  # substituting "_" by ",", in case of dmake definition 01_49
57*01a01bd6SAndre Fischer
58*01a01bd6SAndre Fischer    if ($languageproduct =~ /\#/)
59*01a01bd6SAndre Fischer    {
60*01a01bd6SAndre Fischer        installer::exiter::exit_program(
61*01a01bd6SAndre Fischer            "building more than one language (or language set) is not supported anymore\n"
62*01a01bd6SAndre Fischer            ."please replace one call of 'make_installer.pl -l language1#language2'\n"
63*01a01bd6SAndre Fischer            ."with two calls 'make_installer.pl -l language1' and 'make_installer.pl -l language2'",
64*01a01bd6SAndre Fischer            "installer::language::analyze_languagelist");
65*01a01bd6SAndre Fischer    }
66*01a01bd6SAndre Fischer
67*01a01bd6SAndre Fischer    $installer::globals::languageproduct = $languageproduct;
68cdf0e10cSrcweir}
69cdf0e10cSrcweir
70*01a01bd6SAndre Fischer
71*01a01bd6SAndre Fischer
72*01a01bd6SAndre Fischer
73cdf0e10cSrcweir####################################################
74cdf0e10cSrcweir# Reading languages from zip list file
75cdf0e10cSrcweir####################################################
76cdf0e10cSrcweir
77cdf0e10cSrcweirsub get_info_about_languages
78cdf0e10cSrcweir{
79cdf0e10cSrcweir	my ( $allsettingsarrayref ) = @_;
80cdf0e10cSrcweir
81cdf0e10cSrcweir	my $languagelistref;
82cdf0e10cSrcweir
83cdf0e10cSrcweir	$languagelistref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "languages");
84cdf0e10cSrcweir	$installer::globals::languagelist = $$languagelistref;
85cdf0e10cSrcweir
86cdf0e10cSrcweir	if ( $installer::globals::languagelist eq "" )	# not defined on command line and not in product list
87cdf0e10cSrcweir	{
88cdf0e10cSrcweir		installer::exiter::exit_program("ERROR: Languages not defined on command line (-l) and not in product list!", "get_info_about_languages");
89cdf0e10cSrcweir	}
90cdf0e10cSrcweir
91cdf0e10cSrcweir	# Adapting the separator format from zip list.
92cdf0e10cSrcweir	# | means new product, , (comma) means more than one language in one product
93cdf0e10cSrcweir	# On the command line, | is difficult to use. Therefore this script uses hashes
94cdf0e10cSrcweir
95cdf0e10cSrcweir	$installer::globals::languagelist =~ s/\|/\#/g;
96cdf0e10cSrcweir
97cdf0e10cSrcweir	analyze_languagelist();
98cdf0e10cSrcweir}
99cdf0e10cSrcweir
100cdf0e10cSrcweir#############################################################################
101cdf0e10cSrcweir# Checking whether all elements of an array A are also member of array B
102cdf0e10cSrcweir#############################################################################
103cdf0e10cSrcweir
104cdf0e10cSrcweirsub all_elements_of_array1_in_array2
105cdf0e10cSrcweir{
106cdf0e10cSrcweir	my ($array1, $array2) = @_;
107cdf0e10cSrcweir
108cdf0e10cSrcweir	my $array2_contains_all_elements_of_array1 = 1;
109cdf0e10cSrcweir
110cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$array1}; $i++ )
111cdf0e10cSrcweir	{
112cdf0e10cSrcweir		if (! installer::existence::exists_in_array(${$array1}[$i], $array2))
113cdf0e10cSrcweir		{
114cdf0e10cSrcweir			$array2_contains_all_elements_of_array1 = 0;
115cdf0e10cSrcweir			last;
116cdf0e10cSrcweir		}
117cdf0e10cSrcweir	}
118cdf0e10cSrcweir
119cdf0e10cSrcweir	return $array2_contains_all_elements_of_array1;
120cdf0e10cSrcweir}
121cdf0e10cSrcweir
122cdf0e10cSrcweir#############################################
123cdf0e10cSrcweir# All languages defined for one product
124cdf0e10cSrcweir#############################################
125cdf0e10cSrcweir
126cdf0e10cSrcweirsub get_all_languages_for_one_product
127cdf0e10cSrcweir{
128cdf0e10cSrcweir	my ( $languagestring, $allvariables ) = @_;
129cdf0e10cSrcweir
130cdf0e10cSrcweir	my @languagearray = ();
131cdf0e10cSrcweir
132cdf0e10cSrcweir	my $last = $languagestring;
133cdf0e10cSrcweir
134cdf0e10cSrcweir	$installer::globals::ismultilingual = 0;		# setting the global variable $ismultilingual !
135cdf0e10cSrcweir	if ( $languagestring =~ /\,/ ) { $installer::globals::ismultilingual = 1; }
136cdf0e10cSrcweir
137cdf0e10cSrcweir	while ( $last =~ /^\s*(.+?)\,(.+)\s*$/)	# "$" for minimal matching, comma separated list
138cdf0e10cSrcweir	{
139cdf0e10cSrcweir		my $first = $1;
140cdf0e10cSrcweir		$last = $2;
141cdf0e10cSrcweir		installer::remover::remove_leading_and_ending_whitespaces(\$first);
142cdf0e10cSrcweir		push(@languagearray, "$first");
143cdf0e10cSrcweir	}
144cdf0e10cSrcweir
145cdf0e10cSrcweir	installer::remover::remove_leading_and_ending_whitespaces(\$last);
146cdf0e10cSrcweir	push(@languagearray, "$last");
147cdf0e10cSrcweir
148cdf0e10cSrcweir	if ( $installer::globals::iswindowsbuild )
149cdf0e10cSrcweir	{
150cdf0e10cSrcweir		my $furthercheck = 1;
151cdf0e10cSrcweir
152cdf0e10cSrcweir		# For some languages (that are not supported by Windows, english needs to be added to the installation set
153cdf0e10cSrcweir		# Languages saved in "@installer::globals::noMSLocaleLangs"
154cdf0e10cSrcweir
155cdf0e10cSrcweir		if ( all_elements_of_array1_in_array2(\@languagearray, \@installer::globals::noMSLocaleLangs) )
156cdf0e10cSrcweir		{
157cdf0e10cSrcweir			my $officestartlanguage = $languagearray[0];
158cdf0e10cSrcweir			unshift(@languagearray, "en-US");	# am Anfang einf�gen!
159cdf0e10cSrcweir			$installer::globals::ismultilingual = 1;
160cdf0e10cSrcweir			$installer::globals::added_english  = 1;
161cdf0e10cSrcweir			$installer::globals::set_office_start_language  = 1;
162cdf0e10cSrcweir			# setting the variable PRODUCTLANGUAGE, needed for Linguistic-ForceDefaultLanguage.xcu
163cdf0e10cSrcweir			$allvariables->{'PRODUCTLANGUAGE'} = $officestartlanguage;
164cdf0e10cSrcweir			$furthercheck = 0;
165cdf0e10cSrcweir		}
166cdf0e10cSrcweir
167cdf0e10cSrcweir		# In bilingual installation sets, in which english is the first language,
168cdf0e10cSrcweir		# the Office start language shall be the second language.
169cdf0e10cSrcweir
170cdf0e10cSrcweir		if ( $furthercheck )
171cdf0e10cSrcweir		{
172cdf0e10cSrcweir			if (( $#languagearray == 1 ) && ( $languagearray[0] eq "en-US" ))
173cdf0e10cSrcweir			{
174cdf0e10cSrcweir				my $officestartlanguage = $languagearray[1];
175cdf0e10cSrcweir				$installer::globals::set_office_start_language  = 1;
176cdf0e10cSrcweir				# setting the variable PRODUCTLANGUAGE, needed for Linguistic-ForceDefaultLanguage.xcu
177cdf0e10cSrcweir				$allvariables->{'PRODUCTLANGUAGE'} = $officestartlanguage;
178cdf0e10cSrcweir			}
179cdf0e10cSrcweir		}
180cdf0e10cSrcweir	}
181cdf0e10cSrcweir
182cdf0e10cSrcweir	return \@languagearray;
183cdf0e10cSrcweir}
184cdf0e10cSrcweir
185cdf0e10cSrcweir####################################################################################
186cdf0e10cSrcweir# FAKE: The languages string may contain only "de", "en-US", instead of "01", ...
187cdf0e10cSrcweir# But this has to be removed as soon as possible.
188cdf0e10cSrcweir# In the future the languages are determined with "en-US" instead "01"
189cdf0e10cSrcweir# already on the command line and in the zip list file.
190cdf0e10cSrcweir####################################################################################
191cdf0e10cSrcweir
192cdf0e10cSrcweirsub fake_languagesstring
193cdf0e10cSrcweir{
194cdf0e10cSrcweir	my ($stringref) = @_;
195cdf0e10cSrcweir
196cdf0e10cSrcweir	# ATTENTION: This function has to be removed as soon as possible!
197cdf0e10cSrcweir
198cdf0e10cSrcweir	$$stringref =~ s/01/en-US/;
199cdf0e10cSrcweir	$$stringref =~ s/03/pt/;
200cdf0e10cSrcweir	$$stringref =~ s/07/ru/;
201cdf0e10cSrcweir	$$stringref =~ s/30/el/;
202cdf0e10cSrcweir	$$stringref =~ s/31/nl/;
203cdf0e10cSrcweir	$$stringref =~ s/33/fr/;
204cdf0e10cSrcweir	$$stringref =~ s/34/es/;
205cdf0e10cSrcweir	$$stringref =~ s/35/fi/;
206cdf0e10cSrcweir	$$stringref =~ s/36/hu/;
207cdf0e10cSrcweir	$$stringref =~ s/37/ca/;
208cdf0e10cSrcweir	$$stringref =~ s/39/it/;
209cdf0e10cSrcweir	$$stringref =~ s/42/cs/;
210cdf0e10cSrcweir	$$stringref =~ s/43/sk/;
211cdf0e10cSrcweir	$$stringref =~ s/44/en-GB/;
212cdf0e10cSrcweir	$$stringref =~ s/45/da/;
213cdf0e10cSrcweir	$$stringref =~ s/46/sv/;
214cdf0e10cSrcweir	$$stringref =~ s/47/no/;
215cdf0e10cSrcweir	$$stringref =~ s/48/pl/;
216cdf0e10cSrcweir	$$stringref =~ s/49/de/;
217cdf0e10cSrcweir	$$stringref =~ s/55/pt-BR/;
218cdf0e10cSrcweir	$$stringref =~ s/66/th/;
219cdf0e10cSrcweir	$$stringref =~ s/77/et/;
220cdf0e10cSrcweir	$$stringref =~ s/81/ja/;
221cdf0e10cSrcweir	$$stringref =~ s/82/ko/;
222cdf0e10cSrcweir	$$stringref =~ s/86/zh-CN/;
223cdf0e10cSrcweir	$$stringref =~ s/88/zh-TW/;
224cdf0e10cSrcweir	$$stringref =~ s/90/tr/;
225cdf0e10cSrcweir	$$stringref =~ s/91/hi-IN/;
226cdf0e10cSrcweir	$$stringref =~ s/96/ar/;
227cdf0e10cSrcweir	$$stringref =~ s/97/he/;
228cdf0e10cSrcweir}
229cdf0e10cSrcweir
230cdf0e10cSrcweir##########################################################
231cdf0e10cSrcweir# Converting the language array into a string for output
232cdf0e10cSrcweir##########################################################
233cdf0e10cSrcweir
234cdf0e10cSrcweirsub get_language_string
235cdf0e10cSrcweir{
236cdf0e10cSrcweir	my ($languagesref) = @_;
237cdf0e10cSrcweir
238cdf0e10cSrcweir	my $newstring = "";
239cdf0e10cSrcweir
240cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$languagesref}; $i++ )
241cdf0e10cSrcweir	{
242cdf0e10cSrcweir		$newstring = $newstring . ${$languagesref}[$i] . "_";
243cdf0e10cSrcweir	}
244cdf0e10cSrcweir
245cdf0e10cSrcweir	# remove ending underline
246cdf0e10cSrcweir
247cdf0e10cSrcweir	$newstring =~ s/\_\s*$//;
248cdf0e10cSrcweir
249cdf0e10cSrcweir	return \$newstring;
250cdf0e10cSrcweir}
251cdf0e10cSrcweir
252cdf0e10cSrcweir##########################################################
253cdf0e10cSrcweir# Analyzing the languages in the languages array and
254cdf0e10cSrcweir# returning the most important language
255cdf0e10cSrcweir##########################################################
256cdf0e10cSrcweir
257cdf0e10cSrcweirsub get_default_language
258cdf0e10cSrcweir{
259cdf0e10cSrcweir	my ($languagesref) = @_;
260cdf0e10cSrcweir
261cdf0e10cSrcweir	return ${$languagesref}[0];		# ToDo, only returning the first language
262cdf0e10cSrcweir}
263cdf0e10cSrcweir
264cdf0e10cSrcweir#############################################################
265cdf0e10cSrcweir# Contains the installation set one of the asian languages?
266cdf0e10cSrcweir#############################################################
267cdf0e10cSrcweir
268cdf0e10cSrcweirsub detect_asian_language
269cdf0e10cSrcweir{
270cdf0e10cSrcweir	my ($languagesref) = @_;
271cdf0e10cSrcweir
272cdf0e10cSrcweir	my $containsasia = 0;
273cdf0e10cSrcweir
274cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$languagesref}; $i++ )
275cdf0e10cSrcweir	{
276cdf0e10cSrcweir		my $onelang = ${$languagesref}[$i];
277cdf0e10cSrcweir		$onelang =~ s/\s*$//;
278cdf0e10cSrcweir
279cdf0e10cSrcweir		for ( my $j = 0; $j <= $#installer::globals::asianlanguages; $j++ )
280cdf0e10cSrcweir		{
281cdf0e10cSrcweir			my $asialang = $installer::globals::asianlanguages[$j];
282cdf0e10cSrcweir			$asialang =~ s/\s*$//;
283cdf0e10cSrcweir
284cdf0e10cSrcweir			if ( $onelang eq $asialang )
285cdf0e10cSrcweir			{
286cdf0e10cSrcweir				$containsasia = 1;
287cdf0e10cSrcweir				last;
288cdf0e10cSrcweir			}
289cdf0e10cSrcweir		}
290cdf0e10cSrcweir
291cdf0e10cSrcweir		if ( $containsasia ) { last; }
292cdf0e10cSrcweir	}
293cdf0e10cSrcweir
294cdf0e10cSrcweir	return $containsasia;
295cdf0e10cSrcweir}
296cdf0e10cSrcweir
297cdf0e10cSrcweir#############################################################
298cdf0e10cSrcweir# Contains the installation set only asian languages?
299cdf0e10cSrcweir#############################################################
300cdf0e10cSrcweir
301cdf0e10cSrcweirsub contains_only_asian_languages
302cdf0e10cSrcweir{
303cdf0e10cSrcweir	my ($languagesref) = @_;
304cdf0e10cSrcweir
305cdf0e10cSrcweir	my $onlyasian = 1;
306cdf0e10cSrcweir
307cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$languagesref}; $i++ )
308cdf0e10cSrcweir	{
309cdf0e10cSrcweir		my $onelang = ${$languagesref}[$i];
310cdf0e10cSrcweir		$onelang =~ s/\s*$//;
311cdf0e10cSrcweir
312cdf0e10cSrcweir		if (! installer::existence::exists_in_array($onelang, \@installer::globals::asianlanguages))
313cdf0e10cSrcweir		{
314cdf0e10cSrcweir			$onlyasian = 0;
315cdf0e10cSrcweir			last;
316cdf0e10cSrcweir		}
317cdf0e10cSrcweir	}
318cdf0e10cSrcweir
319cdf0e10cSrcweir	return $onlyasian;
320cdf0e10cSrcweir}
321cdf0e10cSrcweir
322cdf0e10cSrcweir################################################################
323cdf0e10cSrcweir# Contains the installation set one of the western languages
324cdf0e10cSrcweir################################################################
325cdf0e10cSrcweir
326cdf0e10cSrcweirsub detect_western_language
327cdf0e10cSrcweir{
328cdf0e10cSrcweir	my ($languagesref) = @_;
329cdf0e10cSrcweir
330cdf0e10cSrcweir	my $containswestern = 1;
331cdf0e10cSrcweir
332cdf0e10cSrcweir	if ( contains_only_asian_languages($languagesref) ) { $containswestern = 0; }
333cdf0e10cSrcweir
334cdf0e10cSrcweir	return $containswestern;
335cdf0e10cSrcweir}
336cdf0e10cSrcweir
337cdf0e10cSrcweir################################################################
338cdf0e10cSrcweir# Determining the language used by the Java installer
339cdf0e10cSrcweir################################################################
340cdf0e10cSrcweir
341cdf0e10cSrcweirsub get_java_language
342cdf0e10cSrcweir{
343cdf0e10cSrcweir	my ( $language ) = @_;
344cdf0e10cSrcweir
345cdf0e10cSrcweir	# my $javalanguage = "";
346cdf0e10cSrcweir
347cdf0e10cSrcweir	# if ( $language eq "en-US" ) { $javalanguage = "en_US"; }
348cdf0e10cSrcweir	# elsif ( $language eq "ar" ) { $javalanguage = "ar_AR"; }
349cdf0e10cSrcweir	# elsif ( $language eq "bg" ) { $javalanguage = "bg_BG"; }
350cdf0e10cSrcweir	# elsif ( $language eq "ca" ) { $javalanguage = "ca_CA"; }
351cdf0e10cSrcweir	# elsif ( $language eq "cs" ) { $javalanguage = "cs_CS"; }
352cdf0e10cSrcweir	# elsif ( $language eq "da" ) { $javalanguage = "da_DA"; }
353cdf0e10cSrcweir	# elsif ( $language eq "de" ) { $javalanguage = "de"; }
354cdf0e10cSrcweir	# elsif ( $language eq "de" ) { $javalanguage = "de_DE"; }
355cdf0e10cSrcweir	# elsif ( $language eq "et" ) { $javalanguage = "et_ET"; }
356cdf0e10cSrcweir	# elsif ( $language eq "el" ) { $javalanguage = "el_EL"; }
357cdf0e10cSrcweir	# elsif ( $language eq "fi" ) { $javalanguage = "fi_FI"; }
358cdf0e10cSrcweir	# elsif ( $language eq "fr" ) { $javalanguage = "fr_FR"; }
359cdf0e10cSrcweir	# elsif ( $language eq "hu" ) { $javalanguage = "hu_HU"; }
360cdf0e10cSrcweir	# elsif ( $language eq "he" ) { $javalanguage = "he_HE"; }
361cdf0e10cSrcweir	# elsif ( $language eq "it" ) { $javalanguage = "it_IT"; }
362cdf0e10cSrcweir	# elsif ( $language eq "nl" ) { $javalanguage = "nl_NL"; }
363cdf0e10cSrcweir	# elsif ( $language eq "es" ) { $javalanguage = "es_ES"; }
364cdf0e10cSrcweir	# elsif ( $language eq "sv" ) { $javalanguage = "sv_SV"; }
365cdf0e10cSrcweir	# elsif ( $language eq "sk" ) { $javalanguage = "sk_SK"; }
366cdf0e10cSrcweir	# elsif ( $language eq "pl" ) { $javalanguage = "pl_PL"; }
367cdf0e10cSrcweir	# elsif ( $language eq "pt-BR" ) { $javalanguage = "pt_BR"; }
368cdf0e10cSrcweir	# elsif ( $language eq "ru" ) { $javalanguage = "ru_RU"; }
369cdf0e10cSrcweir	# elsif ( $language eq "tr" ) { $javalanguage = "tr_TR"; }
370cdf0e10cSrcweir	# elsif ( $language eq "ja" ) { $javalanguage = "ja"; }
371cdf0e10cSrcweir	# elsif ( $language eq "ja" ) { $javalanguage = "ja_JP"; }
372cdf0e10cSrcweir	# elsif ( $language eq "ko" ) { $javalanguage = "ko_KR"; }
373cdf0e10cSrcweir	# elsif ( $language eq "th" ) { $javalanguage = "th_TH"; }
374cdf0e10cSrcweir	# elsif ( $language eq "zh-CN" ) { $javalanguage = "zh_CN"; }
375cdf0e10cSrcweir	# elsif ( $language eq "zh-TW" ) { $javalanguage = "zh_TW"; }
376cdf0e10cSrcweir
377cdf0e10cSrcweir	# languages not defined yet
378cdf0e10cSrcweir	# if ( $javalanguage eq "" )
379cdf0e10cSrcweir	# {
380cdf0e10cSrcweir	# 	$javalanguage = $language;
381cdf0e10cSrcweir	#	$javalanguage =~ s/\-/\_/;
382cdf0e10cSrcweir	# }
383cdf0e10cSrcweir
384cdf0e10cSrcweir	$javalanguage = $language;
385cdf0e10cSrcweir	$javalanguage =~ s/\-/\_/;
386cdf0e10cSrcweir
387cdf0e10cSrcweir	return $javalanguage;
388cdf0e10cSrcweir}
389cdf0e10cSrcweir
390cdf0e10cSrcweir1;
391