Add compile_multilib properties to all native prebuilts (reland).
There was a special case in cc_prebuilt_binary only, which resulted in prebuilt libraries getting both 32 and 64 bit variants even when their sources only had one of them, and the other variant would be defunct since it wouldn't get any prebuilt artefact. This moves the handling of compile_multilib completely to the common update code, so that SDK members don't need to deal with it. It doesn't take SDK member defaults into account, which means a bit more boilerplate in the snapshots, but it's simpler and less error prone (different SDK member types have different defaults). This relands https://r.android.com/1359962 after disabling the SDK tests on mac once and for all. Bug: 151303681 Test: `go test -v ./sdk` in build/soong on mac and linux Change-Id: I05f6603b2ac9b8676b25c3e297165ca23284e9cc
This commit is contained in:
parent
3044394329
commit
89238f4703
|
@ -466,8 +466,7 @@ func RegisterSdkMemberType(memberType SdkMemberType) {
|
|||
|
||||
// Base structure for all implementations of SdkMemberProperties.
|
||||
//
|
||||
// Contains common properties that apply across many different member types. These
|
||||
// are not affected by the optimization to extract common values.
|
||||
// Contains common properties that apply across many different member types.
|
||||
type SdkMemberPropertiesBase struct {
|
||||
// The number of unique os types supported by the member variants.
|
||||
//
|
||||
|
@ -489,9 +488,7 @@ type SdkMemberPropertiesBase struct {
|
|||
Os OsType `sdk:"keep"`
|
||||
|
||||
// The setting to use for the compile_multilib property.
|
||||
//
|
||||
// This property is set after optimization so there is no point in trying to optimize it.
|
||||
Compile_multilib string `sdk:"keep"`
|
||||
Compile_multilib string `android:"arch_variant"`
|
||||
}
|
||||
|
||||
// The os prefix to use for any file paths in the sdk.
|
||||
|
|
|
@ -140,10 +140,6 @@ func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberCo
|
|||
}
|
||||
|
||||
func (p *nativeBinaryInfoProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
|
||||
if p.Compile_multilib != "" {
|
||||
propertySet.AddProperty("compile_multilib", p.Compile_multilib)
|
||||
}
|
||||
|
||||
builder := ctx.SnapshotBuilder()
|
||||
if p.outputFile != nil {
|
||||
propertySet.AddProperty("srcs", []string{nativeBinaryPathFor(*p)})
|
||||
|
|
|
@ -73,12 +73,16 @@ func TestSdkCompileMultilibOverride(t *testing.T) {
|
|||
result := testSdkWithCc(t, `
|
||||
sdk {
|
||||
name: "mysdk",
|
||||
device_supported: false,
|
||||
host_supported: true,
|
||||
native_shared_libs: ["sdkmember"],
|
||||
compile_multilib: "64",
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "sdkmember",
|
||||
device_supported: false,
|
||||
host_supported: true,
|
||||
srcs: ["Test.cpp"],
|
||||
stl: "none",
|
||||
compile_multilib: "64",
|
||||
|
@ -86,8 +90,52 @@ func TestSdkCompileMultilibOverride(t *testing.T) {
|
|||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
cc_prebuilt_library_shared {
|
||||
name: "mysdk_sdkmember@current",
|
||||
sdk_member_name: "sdkmember",
|
||||
device_supported: false,
|
||||
host_supported: true,
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "64",
|
||||
arch: {
|
||||
x86_64: {
|
||||
srcs: ["x86_64/lib/sdkmember.so"],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
cc_prebuilt_library_shared {
|
||||
name: "sdkmember",
|
||||
prefer: false,
|
||||
device_supported: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "64",
|
||||
arch: {
|
||||
x86_64: {
|
||||
srcs: ["x86_64/lib/sdkmember.so"],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
sdk_snapshot {
|
||||
name: "mysdk@current",
|
||||
device_supported: false,
|
||||
host_supported: true,
|
||||
native_shared_libs: ["mysdk_sdkmember@current"],
|
||||
target: {
|
||||
linux_glibc: {
|
||||
compile_multilib: "64",
|
||||
},
|
||||
},
|
||||
}
|
||||
`),
|
||||
checkAllCopyRules(`
|
||||
.intermediates/sdkmember/android_arm64_armv8-a_shared/sdkmember.so -> arm64/lib/sdkmember.so
|
||||
.intermediates/sdkmember/linux_glibc_x86_64_shared/sdkmember.so -> x86_64/lib/sdkmember.so
|
||||
`))
|
||||
}
|
||||
|
||||
|
@ -271,6 +319,7 @@ cc_prebuilt_object {
|
|||
name: "mysdk_crtobj@current",
|
||||
sdk_member_name: "crtobj",
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
arm64: {
|
||||
srcs: ["arm64/lib/crtobj.o"],
|
||||
|
@ -285,6 +334,7 @@ cc_prebuilt_object {
|
|||
name: "crtobj",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
arm64: {
|
||||
srcs: ["arm64/lib/crtobj.o"],
|
||||
|
@ -378,6 +428,7 @@ cc_prebuilt_library_shared {
|
|||
sdk_member_name: "mynativelib",
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -394,6 +445,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mynativelib",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -621,9 +673,9 @@ cc_prebuilt_binary {
|
|||
host_supported: true,
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
static_executable: true,
|
||||
nocrt: true,
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
x86_64: {
|
||||
srcs: ["x86_64/bin/linker"],
|
||||
|
@ -640,9 +692,9 @@ cc_prebuilt_binary {
|
|||
device_supported: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
static_executable: true,
|
||||
nocrt: true,
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
x86_64: {
|
||||
srcs: ["x86_64/bin/linker"],
|
||||
|
@ -702,6 +754,7 @@ cc_prebuilt_library_shared {
|
|||
],
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -723,6 +776,7 @@ cc_prebuilt_library_shared {
|
|||
"apex2",
|
||||
],
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -824,6 +878,7 @@ cc_prebuilt_library_shared {
|
|||
sdk_member_name: "mynativelib",
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
shared_libs: [
|
||||
"mysdk_myothernativelib@current",
|
||||
"libc",
|
||||
|
@ -842,6 +897,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mynativelib",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
shared_libs: [
|
||||
"myothernativelib",
|
||||
"libc",
|
||||
|
@ -861,6 +917,7 @@ cc_prebuilt_library_shared {
|
|||
sdk_member_name: "myothernativelib",
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
system_shared_libs: ["libm"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -876,6 +933,7 @@ cc_prebuilt_library_shared {
|
|||
name: "myothernativelib",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
system_shared_libs: ["libm"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -892,6 +950,7 @@ cc_prebuilt_library_shared {
|
|||
sdk_member_name: "mysystemnativelib",
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
arm64: {
|
||||
srcs: ["arm64/lib/mysystemnativelib.so"],
|
||||
|
@ -906,6 +965,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mysystemnativelib",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
arm64: {
|
||||
srcs: ["arm64/lib/mysystemnativelib.so"],
|
||||
|
@ -974,6 +1034,7 @@ cc_prebuilt_library_shared {
|
|||
installable: false,
|
||||
sdk_version: "minimum",
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
x86_64: {
|
||||
|
@ -994,6 +1055,7 @@ cc_prebuilt_library_shared {
|
|||
host_supported: true,
|
||||
sdk_version: "minimum",
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
x86_64: {
|
||||
|
@ -1070,12 +1132,18 @@ cc_prebuilt_library_shared {
|
|||
installable: false,
|
||||
stl: "none",
|
||||
target: {
|
||||
linux_glibc: {
|
||||
compile_multilib: "both",
|
||||
},
|
||||
linux_glibc_x86_64: {
|
||||
srcs: ["linux_glibc/x86_64/lib/mynativelib.so"],
|
||||
},
|
||||
linux_glibc_x86: {
|
||||
srcs: ["linux_glibc/x86/lib/mynativelib.so"],
|
||||
},
|
||||
windows: {
|
||||
compile_multilib: "64",
|
||||
},
|
||||
windows_x86_64: {
|
||||
srcs: ["windows/x86_64/lib/mynativelib.dll"],
|
||||
},
|
||||
|
@ -1089,12 +1157,18 @@ cc_prebuilt_library_shared {
|
|||
host_supported: true,
|
||||
stl: "none",
|
||||
target: {
|
||||
linux_glibc: {
|
||||
compile_multilib: "both",
|
||||
},
|
||||
linux_glibc_x86_64: {
|
||||
srcs: ["linux_glibc/x86_64/lib/mynativelib.so"],
|
||||
},
|
||||
linux_glibc_x86: {
|
||||
srcs: ["linux_glibc/x86/lib/mynativelib.so"],
|
||||
},
|
||||
windows: {
|
||||
compile_multilib: "64",
|
||||
},
|
||||
windows_x86_64: {
|
||||
srcs: ["windows/x86_64/lib/mynativelib.dll"],
|
||||
},
|
||||
|
@ -1151,6 +1225,7 @@ cc_prebuilt_library_static {
|
|||
sdk_member_name: "mynativelib",
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1168,6 +1243,7 @@ cc_prebuilt_library_static {
|
|||
name: "mynativelib",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1236,6 +1312,7 @@ cc_prebuilt_library_static {
|
|||
host_supported: true,
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
x86_64: {
|
||||
|
@ -1255,6 +1332,7 @@ cc_prebuilt_library_static {
|
|||
device_supported: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
x86_64: {
|
||||
|
@ -1315,6 +1393,7 @@ cc_prebuilt_library {
|
|||
sdk_member_name: "mynativelib",
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1340,6 +1419,7 @@ cc_prebuilt_library {
|
|||
name: "mynativelib",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1416,6 +1496,7 @@ cc_prebuilt_library_static {
|
|||
host_supported: true,
|
||||
installable: false,
|
||||
stl: "none",
|
||||
compile_multilib: "64",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
x86_64: {
|
||||
|
@ -1431,6 +1512,7 @@ cc_prebuilt_library_static {
|
|||
device_supported: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "64",
|
||||
export_include_dirs: ["include/include"],
|
||||
arch: {
|
||||
x86_64: {
|
||||
|
@ -1483,6 +1565,7 @@ cc_prebuilt_library_headers {
|
|||
name: "mysdk_mynativeheaders@current",
|
||||
sdk_member_name: "mynativeheaders",
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
}
|
||||
|
||||
|
@ -1490,6 +1573,7 @@ cc_prebuilt_library_headers {
|
|||
name: "mynativeheaders",
|
||||
prefer: false,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
}
|
||||
|
||||
|
@ -1532,6 +1616,7 @@ cc_prebuilt_library_headers {
|
|||
device_supported: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
}
|
||||
|
||||
|
@ -1541,6 +1626,7 @@ cc_prebuilt_library_headers {
|
|||
device_supported: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_include_dirs: ["include/include"],
|
||||
}
|
||||
|
||||
|
@ -1590,6 +1676,7 @@ cc_prebuilt_library_headers {
|
|||
sdk_member_name: "mynativeheaders",
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_system_include_dirs: ["common_os/include/include"],
|
||||
target: {
|
||||
android: {
|
||||
|
@ -1606,6 +1693,7 @@ cc_prebuilt_library_headers {
|
|||
prefer: false,
|
||||
host_supported: true,
|
||||
stl: "none",
|
||||
compile_multilib: "both",
|
||||
export_system_include_dirs: ["common_os/include/include"],
|
||||
target: {
|
||||
android: {
|
||||
|
@ -1662,6 +1750,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mysdk_sslnil@current",
|
||||
sdk_member_name: "sslnil",
|
||||
installable: false,
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
arm64: {
|
||||
srcs: ["arm64/lib/sslnil.so"],
|
||||
|
@ -1675,6 +1764,7 @@ cc_prebuilt_library_shared {
|
|||
cc_prebuilt_library_shared {
|
||||
name: "sslnil",
|
||||
prefer: false,
|
||||
compile_multilib: "both",
|
||||
arch: {
|
||||
arm64: {
|
||||
srcs: ["arm64/lib/sslnil.so"],
|
||||
|
@ -1689,6 +1779,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mysdk_sslempty@current",
|
||||
sdk_member_name: "sslempty",
|
||||
installable: false,
|
||||
compile_multilib: "both",
|
||||
system_shared_libs: [],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1703,6 +1794,7 @@ cc_prebuilt_library_shared {
|
|||
cc_prebuilt_library_shared {
|
||||
name: "sslempty",
|
||||
prefer: false,
|
||||
compile_multilib: "both",
|
||||
system_shared_libs: [],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1718,6 +1810,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mysdk_sslnonempty@current",
|
||||
sdk_member_name: "sslnonempty",
|
||||
installable: false,
|
||||
compile_multilib: "both",
|
||||
system_shared_libs: ["mysdk_sslnil@current"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1732,6 +1825,7 @@ cc_prebuilt_library_shared {
|
|||
cc_prebuilt_library_shared {
|
||||
name: "sslnonempty",
|
||||
prefer: false,
|
||||
compile_multilib: "both",
|
||||
system_shared_libs: ["sslnil"],
|
||||
arch: {
|
||||
arm64: {
|
||||
|
@ -1780,6 +1874,7 @@ cc_prebuilt_library_shared {
|
|||
sdk_member_name: "sslvariants",
|
||||
host_supported: true,
|
||||
installable: false,
|
||||
compile_multilib: "both",
|
||||
target: {
|
||||
android: {
|
||||
system_shared_libs: [],
|
||||
|
@ -1803,6 +1898,7 @@ cc_prebuilt_library_shared {
|
|||
name: "sslvariants",
|
||||
prefer: false,
|
||||
host_supported: true,
|
||||
compile_multilib: "both",
|
||||
target: {
|
||||
android: {
|
||||
system_shared_libs: [],
|
||||
|
@ -1859,6 +1955,7 @@ cc_prebuilt_library_shared {
|
|||
name: "mysdk_stubslib@current",
|
||||
sdk_member_name: "stubslib",
|
||||
installable: false,
|
||||
compile_multilib: "both",
|
||||
stubs: {
|
||||
versions: ["3"],
|
||||
},
|
||||
|
@ -1875,6 +1972,7 @@ cc_prebuilt_library_shared {
|
|||
cc_prebuilt_library_shared {
|
||||
name: "stubslib",
|
||||
prefer: false,
|
||||
compile_multilib: "both",
|
||||
stubs: {
|
||||
versions: ["3"],
|
||||
},
|
||||
|
@ -1928,6 +2026,7 @@ cc_prebuilt_library_shared {
|
|||
sdk_member_name: "stubslib",
|
||||
host_supported: true,
|
||||
installable: false,
|
||||
compile_multilib: "both",
|
||||
stubs: {
|
||||
versions: ["3"],
|
||||
},
|
||||
|
@ -1951,6 +2050,7 @@ cc_prebuilt_library_shared {
|
|||
name: "stubslib",
|
||||
prefer: false,
|
||||
host_supported: true,
|
||||
compile_multilib: "both",
|
||||
stubs: {
|
||||
versions: ["3"],
|
||||
},
|
||||
|
@ -2003,6 +2103,7 @@ cc_prebuilt_library_shared {
|
|||
host_supported: true,
|
||||
installable: false,
|
||||
unique_host_soname: true,
|
||||
compile_multilib: "both",
|
||||
target: {
|
||||
android_arm64: {
|
||||
srcs: ["android/arm64/lib/mylib.so"],
|
||||
|
@ -2024,6 +2125,7 @@ cc_prebuilt_library_shared {
|
|||
prefer: false,
|
||||
host_supported: true,
|
||||
unique_host_soname: true,
|
||||
compile_multilib: "both",
|
||||
target: {
|
||||
android_arm64: {
|
||||
srcs: ["android/arm64/lib/mylib.so"],
|
||||
|
|
|
@ -794,6 +794,17 @@ func (s *snapshotBuilder) isInternalMember(memberName string) bool {
|
|||
return !ok
|
||||
}
|
||||
|
||||
// Add the properties from the given SdkMemberProperties to the blueprint
|
||||
// property set. This handles common properties in SdkMemberPropertiesBase and
|
||||
// calls the member-specific AddToPropertySet for the rest.
|
||||
func addSdkMemberPropertiesToSet(ctx *memberContext, memberProperties android.SdkMemberProperties, targetPropertySet android.BpPropertySet) {
|
||||
if memberProperties.Base().Compile_multilib != "" {
|
||||
targetPropertySet.AddProperty("compile_multilib", memberProperties.Base().Compile_multilib)
|
||||
}
|
||||
|
||||
memberProperties.AddToPropertySet(ctx, targetPropertySet)
|
||||
}
|
||||
|
||||
type sdkMemberRef struct {
|
||||
memberType android.SdkMemberType
|
||||
variant android.SdkAware
|
||||
|
@ -1009,7 +1020,7 @@ func (osInfo *osTypeSpecificInfo) addToPropertySet(ctx *memberContext, bpModule
|
|||
}
|
||||
|
||||
// Add the os specific but arch independent properties to the module.
|
||||
osInfo.Properties.AddToPropertySet(ctx, osPropertySet)
|
||||
addSdkMemberPropertiesToSet(ctx, osInfo.Properties, osPropertySet)
|
||||
|
||||
// Add arch (and possibly os) specific sections for each set of arch (and possibly
|
||||
// os) specific properties.
|
||||
|
@ -1111,11 +1122,11 @@ func (archInfo *archTypeSpecificInfo) optimizeProperties(ctx *memberContext, com
|
|||
func (archInfo *archTypeSpecificInfo) addToPropertySet(ctx *memberContext, archPropertySet android.BpPropertySet, archOsPrefix string) {
|
||||
archTypeName := archInfo.archType.Name
|
||||
archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + archTypeName)
|
||||
archInfo.Properties.AddToPropertySet(ctx, archTypePropertySet)
|
||||
addSdkMemberPropertiesToSet(ctx, archInfo.Properties, archTypePropertySet)
|
||||
|
||||
for _, linkInfo := range archInfo.linkInfos {
|
||||
linkPropertySet := archTypePropertySet.AddPropertySet(linkInfo.linkType)
|
||||
linkInfo.Properties.AddToPropertySet(ctx, linkPropertySet)
|
||||
addSdkMemberPropertiesToSet(ctx, linkInfo.Properties, linkPropertySet)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1221,7 +1232,7 @@ func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModu
|
|||
extractCommonProperties(ctx.sdkMemberContext, commonValueExtractor, commonProperties, osSpecificPropertiesContainers)
|
||||
|
||||
// Add the common properties to the module.
|
||||
commonProperties.AddToPropertySet(ctx, bpModule)
|
||||
addSdkMemberPropertiesToSet(ctx, commonProperties, bpModule)
|
||||
|
||||
// Create a target property set into which target specific properties can be
|
||||
// added.
|
||||
|
|
Loading…
Reference in New Issue