2005-10-29 20:27:43 +04:00
|
|
|
rule SymLink
|
|
|
|
{
|
|
|
|
# SymLink <target> : <source> : <makeDefaultDependencies> ;
|
|
|
|
# Links <target> to <source>.
|
|
|
|
# <source> is the exact link contents. No binding is done.
|
|
|
|
# <makeDefaultDependencies> If true, <target> will be made a dependency
|
|
|
|
# of the `all' pseudo target, i.e. it will be made by default, and removed
|
|
|
|
# on `jam clean'.
|
|
|
|
|
|
|
|
local target = $(1) ;
|
|
|
|
local source = $(2) ;
|
|
|
|
local makeDefaultDependencies = $(3) ;
|
|
|
|
if ! $(makeDefaultDependencies) {
|
|
|
|
makeDefaultDependencies = true ;
|
|
|
|
}
|
|
|
|
LINKCONTENTS on $(target) = $(source) ;
|
|
|
|
SymLink1 $(target) ;
|
|
|
|
if $(makeDefaultDependencies) = true {
|
|
|
|
LocalDepends files : $(target) ;
|
|
|
|
LocalClean clean : $(target) ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
actions SymLink1
|
|
|
|
{
|
|
|
|
$(RM) "$(1)" && $(LN) -s "$(LINKCONTENTS)" "$(1)"
|
|
|
|
}
|
|
|
|
|
|
|
|
rule RelSymLink
|
|
|
|
{
|
|
|
|
# RelSymLink <link> : <link target> : <makeDefaultDependencies> ;
|
|
|
|
# Creates a relative symbolic link from <link> to <link target>.
|
|
|
|
# <link> and <link target> can be usual targets. They may have a grist
|
|
|
|
# and don't need to have any dirname. Their LOCATE variables are used to
|
|
|
|
# find their locations.
|
|
|
|
# <makeDefaultDependencies> If true (which is the default), <link> will be
|
|
|
|
# made a dependency of the `files' pseudo target, i.e. it will be made by
|
|
|
|
# default, and removed on `jam clean'.
|
|
|
|
|
|
|
|
local target = $(1) ;
|
|
|
|
local source = $(2) ;
|
|
|
|
local makeDefaultDependencies = $(3) ;
|
|
|
|
local targetDir = [ on $(target) FDirName $(LOCATE[1]) $(target:D) ] ;
|
|
|
|
local sourceDir = [ on $(source) FDirName $(LOCATE[1]) $(source:D) ] ;
|
|
|
|
local sourcePath = $(source:G=) ;
|
|
|
|
sourcePath = $(sourcePath:D=$(sourceDir)) ;
|
|
|
|
local targetDirComponents = [ FSplitPath $(targetDir) ] ;
|
|
|
|
local sourceComponents = [ FSplitPath $(sourcePath) ] ;
|
|
|
|
|
|
|
|
SymLink $(target)
|
|
|
|
: [ FRelPath $(targetDirComponents) : $(sourceComponents) ]
|
|
|
|
: $(makeDefaultDependencies) ;
|
|
|
|
NOUPDATE $(target) ;
|
|
|
|
Depends $(target) : $(source) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
rule AbsSymLink
|
|
|
|
{
|
2008-10-18 13:23:42 +04:00
|
|
|
# AbsSymLink <link> : <link target> : <link dir>
|
2005-10-29 20:27:43 +04:00
|
|
|
# : <makeDefaultDependencies> ;
|
|
|
|
# Creates an absolute symbolic link from <link> to <link target>.
|
|
|
|
# <link> and <link target> must be usual targets. If <link dir> is
|
|
|
|
# given, then it is set as LOCATE directory on <link>.
|
|
|
|
# <makeDefaultDependencies> If true (which is the default), <link> will be
|
|
|
|
# made a dependency of the `files' pseudo target, i.e. it will be made by
|
|
|
|
# default, and removed on `jam clean'.
|
|
|
|
|
|
|
|
local makeDefaultDependencies = $(4) ;
|
|
|
|
if ! $(makeDefaultDependencies) {
|
|
|
|
makeDefaultDependencies = true ;
|
|
|
|
}
|
|
|
|
|
|
|
|
Depends $(1) : $(2) ;
|
|
|
|
if $(3) {
|
|
|
|
MakeLocate $(1) : $(3) ;
|
|
|
|
}
|
|
|
|
SEARCH on $(2) += $(SEARCH_SOURCE) ;
|
|
|
|
if $(makeDefaultDependencies) = true {
|
|
|
|
LocalDepends files : $(1) ;
|
|
|
|
LocalClean clean : $(1) ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
actions AbsSymLink
|
|
|
|
{
|
|
|
|
target="$(2)"
|
|
|
|
case "$target" in
|
|
|
|
/*) ;;
|
|
|
|
*) target=`pwd`/"$target";;
|
|
|
|
esac
|
|
|
|
$(RM) "$(1)" && $(LN) -s "$target" "$(1)"
|
|
|
|
}
|
|
|
|
|
2009-07-21 03:03:28 +04:00
|
|
|
rule HaikuInstall installAndUninstall : dir : sources : installgrist
|
|
|
|
: installRule : targets
|
2005-10-29 20:27:43 +04:00
|
|
|
{
|
|
|
|
# Usage: HaikuInstall <[ install [ and uninstall ] pseudotarget ]>
|
2009-07-21 03:03:28 +04:00
|
|
|
# : <directory> : <sources to install> : [ <installgrist> ]
|
|
|
|
# : [ <install rule> ] : [ <targets> ] ;
|
|
|
|
|
|
|
|
local install = $(installAndUninstall[1]) ;
|
2005-10-29 20:27:43 +04:00
|
|
|
install ?= install ;
|
2009-07-21 03:03:28 +04:00
|
|
|
local uninstall = $(installAndUninstall[2]) ;
|
2005-10-29 20:27:43 +04:00
|
|
|
uninstall ?= un$(install) ;
|
|
|
|
installgrist ?= $(INSTALLGRIST) ;
|
|
|
|
installRule ?= Install ;
|
2009-07-21 03:03:28 +04:00
|
|
|
|
|
|
|
targets ?= $(sources) ;
|
|
|
|
targets = $(targets:G=$(installgrist)) ;
|
2005-10-29 20:27:43 +04:00
|
|
|
|
|
|
|
NotFile $(install) ;
|
|
|
|
NotFile $(uninstall) ;
|
|
|
|
Depends $(install) : $(targets) ;
|
|
|
|
Clean $(uninstall) : $(targets) ;
|
|
|
|
|
|
|
|
SEARCH on $(sources) += $(SEARCH_SOURCE) ;
|
|
|
|
MakeLocate $(targets) : $(dir) ;
|
|
|
|
|
|
|
|
local source ;
|
|
|
|
for source in $(sources) {
|
2009-07-21 03:03:28 +04:00
|
|
|
local target = $(targets[1]) ;
|
|
|
|
targets = $(targets[2-]) ;
|
2005-10-29 20:27:43 +04:00
|
|
|
|
|
|
|
Depends $(target) : $(source) ;
|
|
|
|
$(installRule) $(target) : $(source) ;
|
|
|
|
|
|
|
|
if [ on $(target) return $(MODE) ] {
|
|
|
|
Chmod $(target) ;
|
|
|
|
}
|
|
|
|
|
2008-10-18 13:23:42 +04:00
|
|
|
if $(OWNER) && $(CHOWN) {
|
2005-10-29 20:27:43 +04:00
|
|
|
Chown $(target) ;
|
|
|
|
OWNER on $(target) = $(OWNER) ;
|
|
|
|
}
|
|
|
|
|
2008-10-18 13:23:42 +04:00
|
|
|
if $(GROUP) && $(CHGRP) {
|
2005-10-29 20:27:43 +04:00
|
|
|
Chgrp $(target) ;
|
|
|
|
GROUP on $(target) = $(GROUP) ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rule InstallAbsSymLinkAdapter
|
|
|
|
{
|
|
|
|
# InstallAbsSymLinkAdapter <link> : <link target>
|
|
|
|
if ! [ on $(2) return $(TARGET) ] {
|
|
|
|
TARGET on $(2) = [ on $(2) return $(SEARCH) ] ;
|
|
|
|
}
|
|
|
|
AbsSymLink $(1) : $(2) : : false ;
|
|
|
|
}
|
|
|
|
|
|
|
|
rule HaikuInstallAbsSymLink
|
|
|
|
{
|
|
|
|
# Usage: HaikuInstallAbsSymLink <[ install [ and uninstall ] pseudotarget ]>
|
|
|
|
# : <directory> : <sources to install>
|
|
|
|
# : [ <installgrist> ] ;
|
|
|
|
HaikuInstall $(1) : $(2) : $(3) : $(4) : InstallAbsSymLinkAdapter ;
|
|
|
|
}
|
|
|
|
|
|
|
|
rule InstallRelSymLinkAdapter
|
|
|
|
{
|
|
|
|
# InstallRelSymLinkAdapter <link> : <link target>
|
|
|
|
if ! [ on $(2) return $(TARGET) ] {
|
|
|
|
TARGET on $(2) = [ on $(2) return $(SEARCH) ] ;
|
|
|
|
}
|
|
|
|
RelSymLink $(1) : $(2) : false ;
|
|
|
|
}
|
|
|
|
|
|
|
|
rule HaikuInstallRelSymLink
|
|
|
|
{
|
|
|
|
# Usage: HaikuInstallRelSymLink <[ install [ and uninstall ] pseudotarget ]>
|
|
|
|
# : <directory> : <sources to install>
|
|
|
|
# : [ <installgrist> ] ;
|
|
|
|
HaikuInstall $(1) : $(2) : $(3) : $(4) : InstallRelSymLinkAdapter ;
|
|
|
|
}
|
|
|
|
|
2008-10-18 13:23:42 +04:00
|
|
|
|
2005-10-29 20:27:43 +04:00
|
|
|
rule UnarchiveObjects
|
|
|
|
{
|
|
|
|
# UnarchiveObjects <target objects> : <static object>
|
|
|
|
|
|
|
|
MakeLocateArch $(1) ;
|
|
|
|
Depends $(1) : $(2) ;
|
|
|
|
SEARCH on $(2) = $(SEARCH_SOURCE) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
actions UnarchiveObjects
|
|
|
|
{
|
|
|
|
( cd $(1[1]:D) && $(TARGET_AR) $(TARGET_UNARFLAGS) "$(2)" $(1:BS) )
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-25 17:54:50 +03:00
|
|
|
rule ExtractArchive directory : entries : archiveFile : grist
|
2009-04-08 13:55:33 +04:00
|
|
|
{
|
2010-02-25 17:54:50 +03:00
|
|
|
# ExtractArchive <directory> : <entries> : <archiveFile> [ : <grist> ]
|
2009-04-08 13:55:33 +04:00
|
|
|
#
|
2010-02-25 17:54:50 +03:00
|
|
|
# Extract the archive file target <archiveFile> to directory <directory>.
|
|
|
|
# The rule can be called multiple times for different <entries> for the same
|
|
|
|
# <directory> and <archiveFile> combo.
|
2009-04-08 13:55:33 +04:00
|
|
|
#
|
2010-02-25 17:54:50 +03:00
|
|
|
# <directory> - The directory into which to extract the archive file. The
|
2009-04-08 13:55:33 +04:00
|
|
|
# directory is created is by this rule and it is the target
|
2010-02-25 17:54:50 +03:00
|
|
|
# that the extract action is associated with.
|
2011-02-15 20:56:05 +03:00
|
|
|
# <entries> - The entries of the archive file one is interested in. The
|
|
|
|
# rule always extracts the complete archive file, from the
|
|
|
|
# given entries the rule creates targets (using <grist>)
|
|
|
|
# representing the extracted entries. Those targets are
|
2010-02-26 15:34:07 +03:00
|
|
|
# returned by the rule.
|
2010-02-25 17:54:50 +03:00
|
|
|
# <archiveFile> - The archive file target to extract.
|
2009-04-08 13:55:33 +04:00
|
|
|
# <grist> - The grist used to create targets from <entries>. Defaults to
|
2010-02-25 17:54:50 +03:00
|
|
|
# "extracted".
|
2009-04-08 13:55:33 +04:00
|
|
|
|
2010-02-25 17:54:50 +03:00
|
|
|
grist ?= extracted ;
|
2009-04-08 13:55:33 +04:00
|
|
|
|
|
|
|
# Turn the entries into targets to build.
|
|
|
|
local targets ;
|
|
|
|
local entry ;
|
|
|
|
for entry in $(entries) {
|
|
|
|
local target = $(entry:G=$(grist)) ;
|
|
|
|
targets += $(target) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
LOCATE on $(targets) = $(directory) ;
|
2011-04-10 21:58:35 +04:00
|
|
|
Depends $(targets) : $(directory) $(archiveFile) ;
|
2009-04-08 13:55:33 +04:00
|
|
|
NoUpdate $(targets) ;
|
|
|
|
|
|
|
|
# one-time initialization for the main target (the directory)
|
|
|
|
if ! [ on $(directory) return $(INITIALIZED) ] {
|
2009-04-08 22:03:18 +04:00
|
|
|
# make sure the parent dir exists
|
|
|
|
local parentDir = $(directory:PG=dir) ;
|
|
|
|
Depends $(directory) : $(parentDir) ;
|
|
|
|
MkDir $(parentDir) ;
|
|
|
|
|
2009-04-08 13:55:33 +04:00
|
|
|
NoUpdate $(directory) ;
|
2010-02-25 17:54:50 +03:00
|
|
|
Depends $(directory) : $(archiveFile) ;
|
|
|
|
switch $(archiveFile:S)
|
|
|
|
{
|
2011-06-20 00:18:55 +04:00
|
|
|
case .zip :
|
2013-04-02 21:17:46 +04:00
|
|
|
ExtractZipArchive1 $(directory) : $(archiveFile) ;
|
2011-06-20 00:18:55 +04:00
|
|
|
|
|
|
|
case .tgz :
|
2013-04-02 21:17:46 +04:00
|
|
|
ExtractTarArchive1 $(directory) : $(archiveFile) ;
|
2011-06-20 00:18:55 +04:00
|
|
|
|
|
|
|
case .hpkg :
|
2013-04-02 21:17:46 +04:00
|
|
|
Depends $(directory) : <build>package ;
|
|
|
|
ExtractHPKGArchive1 $(directory)
|
|
|
|
: <build>package $(archiveFile) ;
|
2011-06-20 00:18:55 +04:00
|
|
|
|
|
|
|
case * :
|
|
|
|
Exit "ExtractArchive: Unhandled archive extension:"
|
|
|
|
"$(archiveFile:S)" ;
|
2010-02-25 17:54:50 +03:00
|
|
|
}
|
2009-04-08 13:55:33 +04:00
|
|
|
INITIALIZED on $(directory) = 1 ;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $(targets) ;
|
|
|
|
}
|
|
|
|
|
2011-06-20 00:18:55 +04:00
|
|
|
|
2010-02-25 17:54:50 +03:00
|
|
|
actions ExtractZipArchive1
|
2009-04-08 13:55:33 +04:00
|
|
|
{
|
2013-04-02 21:17:46 +04:00
|
|
|
mkdir -p $(1)
|
|
|
|
unzip -q -u -o -d $(1) $(2)
|
2009-04-08 13:55:33 +04:00
|
|
|
}
|
|
|
|
|
2013-04-02 21:17:46 +04:00
|
|
|
|
2010-02-25 17:54:50 +03:00
|
|
|
actions ExtractTarArchive1
|
2009-04-08 13:55:33 +04:00
|
|
|
{
|
2013-04-02 21:17:46 +04:00
|
|
|
mkdir -p $(1)
|
|
|
|
tar -C $(1) -xf $(2)
|
2009-04-08 13:55:33 +04:00
|
|
|
}
|
|
|
|
|
2011-06-20 00:18:55 +04:00
|
|
|
|
|
|
|
actions ExtractHPKGArchive1
|
|
|
|
{
|
2013-04-02 21:17:46 +04:00
|
|
|
mkdir -p "$(1)"
|
2011-06-20 00:18:55 +04:00
|
|
|
$(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)
|
2013-04-02 21:17:46 +04:00
|
|
|
$(2[1]) extract -C "$(1)" "$(2[2])"
|
2011-06-20 00:18:55 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-10-29 20:27:43 +04:00
|
|
|
rule ObjectReference
|
|
|
|
{
|
|
|
|
# ObjectReference <reference object> : <source object>
|
|
|
|
# Makes <reference object> refer to the same file as <source object>.
|
|
|
|
# The filenames must of course be identical.
|
|
|
|
# <source object> must have already been LOCATEd.
|
|
|
|
|
|
|
|
local ref = $(1) ;
|
|
|
|
local source = $(2) ;
|
|
|
|
if $(ref) != $(source) {
|
|
|
|
Depends $(ref) : $(source) ;
|
|
|
|
LOCATE on $(ref) = [ on $(source) return $(LOCATE) ] ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rule ObjectReferences
|
|
|
|
{
|
|
|
|
# ObjectReferences <source objects>
|
|
|
|
# Creates local references to <source objects>, i.e. identifiers with the
|
|
|
|
# current grist referring to the same files. <source objects> must have
|
|
|
|
# already been LOCATEd.
|
|
|
|
|
|
|
|
local source ;
|
|
|
|
for source in $(1) {
|
|
|
|
ObjectReference [ FGristFiles $(source) ] : $(source) ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-02-06 19:51:29 +03:00
|
|
|
rule CopySetHaikuRevision target : source
|
|
|
|
{
|
|
|
|
# CopySetHaikuRevision <target> : <source>
|
|
|
|
#
|
|
|
|
# Copy <source> to <target>, writing the SVN revision of the working root
|
|
|
|
# directory into the haiku revision section of <target>.
|
|
|
|
#
|
|
|
|
# <target> - Output file target. Gristed and located target.
|
|
|
|
# <source> - ELF object to be copied. Gristed and located target.
|
|
|
|
|
|
|
|
# If existent, make the target depend on the .svn/entries file in the
|
|
|
|
# root directory, so it gets updated when the revision changes due to
|
|
|
|
# "svn up".
|
|
|
|
if [ Glob [ FDirName $(HAIKU_TOP) .svn ] : entries ] {
|
|
|
|
local svnEntries = <haiku-rootdir-svn>entries ;
|
|
|
|
SEARCH on $(svnEntries) = [ FDirName $(HAIKU_TOP) .svn ] ;
|
|
|
|
Depends $(target) : $(svnEntries) ;
|
2008-08-15 15:00:07 +04:00
|
|
|
} else if [ Glob [ FDirName $(HAIKU_TOP) .git ] : index ] {
|
|
|
|
local gitIndex = <haiku-rootdir-git>index ;
|
|
|
|
SEARCH on $(gitIndex) = [ FDirName $(HAIKU_TOP) .git ] ;
|
|
|
|
Depends $(target) : $(gitIndex) ;
|
2010-03-21 20:02:14 +03:00
|
|
|
} else if [ Glob [ FDirName $(HAIKU_TOP) .hg ] : store ] {
|
|
|
|
local hgStore = <haiku-rootdir-hg>store ;
|
|
|
|
SEARCH on $(hgStore) = [ FDirName $(HAIKU_TOP) .hg ] ;
|
|
|
|
Depends $(target) : $(hgStore) ;
|
2007-02-06 19:51:29 +03:00
|
|
|
}
|
|
|
|
|
2011-07-03 11:30:54 +04:00
|
|
|
PropagateContainerUpdateTargetFlags $(target) : $(source) ;
|
2007-06-29 23:28:11 +04:00
|
|
|
|
2007-02-06 19:51:29 +03:00
|
|
|
Depends $(target) : <build>copyattr <build>set_haiku_revision $(source) ;
|
|
|
|
CopySetHaikuRevision1 $(target)
|
|
|
|
: <build>copyattr <build>set_haiku_revision $(source) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
actions CopySetHaikuRevision1
|
|
|
|
{
|
|
|
|
$(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)
|
2011-05-14 00:38:02 +04:00
|
|
|
|
2011-05-16 20:11:42 +04:00
|
|
|
. $(HAIKU_TOP)/build/scripts/determine_haiku_revision
|
|
|
|
determineHaikuRevision $(HAIKU_TOP) $(HAIKU_BUILD_OUTPUT_DIR)
|
|
|
|
|
2007-02-06 19:51:29 +03:00
|
|
|
$(2[1]) --data $(2[3]) $(1) &&
|
|
|
|
$(2[2]) $(1) ${revision}
|
|
|
|
}
|
2007-06-12 07:54:07 +04:00
|
|
|
|
2007-07-15 04:04:27 +04:00
|
|
|
rule DataFileToSourceFile sourceFile : dataFile : dataVariable : sizeVariable
|
|
|
|
{
|
|
|
|
sourceFile = [ FGristFiles $(sourceFile) ] ;
|
|
|
|
MakeLocateCommonPlatform $(sourceFile) ;
|
|
|
|
|
|
|
|
sizeVariable ?= $(dataVariable)Size ;
|
|
|
|
|
|
|
|
DATA_VARIABLE on $(sourceFile) = $(dataVariable) ;
|
|
|
|
SIZE_VARIABLE on $(sourceFile) = $(sizeVariable) ;
|
|
|
|
|
|
|
|
Depends $(sourceFile) : <build>data_to_source $(dataFile) ;
|
|
|
|
DataFileToSourceFile1 $(sourceFile) : <build>data_to_source $(dataFile) ;
|
|
|
|
LocalClean clean : $(sourceFile) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
actions DataFileToSourceFile1
|
|
|
|
{
|
|
|
|
$(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)
|
|
|
|
$(2[1]) $(DATA_VARIABLE) $(SIZE_VARIABLE) $(2[2]) $(1)
|
|
|
|
}
|
2007-09-05 07:08:38 +04:00
|
|
|
|
2010-02-25 19:13:22 +03:00
|
|
|
rule DownloadLocatedFile target : url
|
2007-09-05 07:08:38 +04:00
|
|
|
{
|
|
|
|
URL on $(target) = $(url) ;
|
|
|
|
|
2010-02-25 19:13:22 +03:00
|
|
|
DownloadLocatedFile1 $(target) ;
|
2007-09-05 07:08:38 +04:00
|
|
|
}
|
|
|
|
|
2010-02-25 19:13:22 +03:00
|
|
|
actions DownloadLocatedFile1
|
2007-09-05 07:08:38 +04:00
|
|
|
{
|
2011-06-07 21:52:13 +04:00
|
|
|
wget -O "$(1)" $(URL)
|
2007-09-05 07:08:38 +04:00
|
|
|
}
|
2009-04-08 13:55:33 +04:00
|
|
|
|
2010-02-25 19:13:22 +03:00
|
|
|
rule DownloadFile file : url
|
2009-04-08 13:55:33 +04:00
|
|
|
{
|
2010-02-25 19:13:22 +03:00
|
|
|
file = $(file:G=download) ;
|
2009-04-08 13:55:33 +04:00
|
|
|
|
|
|
|
# Request the download only once.
|
2010-02-25 19:13:22 +03:00
|
|
|
if [ on $(file) return $(HAIKU_FILE_DOWNLOAD) ] {
|
|
|
|
return $(file) ;
|
2009-04-08 13:55:33 +04:00
|
|
|
}
|
|
|
|
|
2010-02-25 19:13:22 +03:00
|
|
|
HAIKU_FILE_DOWNLOAD on $(file) = 1 ;
|
|
|
|
|
|
|
|
MakeLocate $(file) : $(HAIKU_DOWNLOAD_DIR) ;
|
|
|
|
DownloadLocatedFile $(file) : $(url) ;
|
2009-04-08 13:55:33 +04:00
|
|
|
|
2010-02-25 19:13:22 +03:00
|
|
|
return $(file) ;
|
|
|
|
}
|
2009-04-08 13:55:33 +04:00
|
|
|
|