2017-12-06 05:00:50 +08:00
[ CmdletBinding ( ) ]
param (
$libraries = @ ( ) ,
2020-12-24 09:16:42 +08:00
$version = " 1.75.0 " ,
2020-03-11 01:15:27 +08:00
$portsDir = $null
2017-12-06 05:00:50 +08:00
)
2020-11-26 03:26:33 +08:00
$ErrorActionPreference = 'Stop'
2017-12-06 05:00:50 +08:00
$scriptsDir = split-path -parent $MyInvocation . MyCommand . Definition
2020-03-11 01:15:27 +08:00
if ( $null -eq $portsDir )
{
$portsDir = " $scriptsDir /../../ports "
}
2017-12-06 05:00:50 +08:00
2020-11-26 03:26:33 +08:00
if ( $IsWindows )
{
$vcpkg = " $scriptsDir /../../vcpkg.exe "
2021-01-14 06:41:23 +08:00
$curl = " curl.exe "
2020-11-26 03:26:33 +08:00
}
else
{
$vcpkg = " $scriptsDir /../../vcpkg "
2021-01-14 06:41:23 +08:00
$curl = " curl "
2020-11-26 03:26:33 +08:00
}
2021-01-14 06:41:23 +08:00
# Clear this array when moving to a new boost version
2020-08-08 02:41:21 +08:00
$port_versions = @ {
2020-11-07 05:30:37 +08:00
#e.g. "asio" = 1;
2021-01-14 06:41:23 +08:00
" asio " = 1 ;
2021-03-27 03:55:34 +08:00
" python " = 2 ;
" context " = 2 ;
" concept-check " = 2 ;
2020-08-08 02:41:21 +08:00
}
$per_port_data = @ {
2020-10-29 05:22:51 +08:00
" asio " = @ { " supports " = " !emscripten " } ;
" beast " = @ { " supports " = " !emscripten " } ;
" fiber " = @ { " supports " = " !osx&!uwp&!arm&!emscripten " } ;
2020-08-08 02:41:21 +08:00
" filesystem " = @ { " supports " = " !uwp " } ;
" iostreams " = @ { " supports " = " !uwp " } ;
2020-10-29 05:22:51 +08:00
" context " = @ { " supports " = " !uwp&!emscripten " } ;
2020-08-08 02:41:21 +08:00
" stacktrace " = @ { " supports " = " !uwp " } ;
2020-10-29 05:22:51 +08:00
" coroutine " = @ { " supports " = " !arm&!uwp&!emscripten " } ;
" coroutine2 " = @ { " supports " = " !emscripten " } ;
2020-08-08 02:41:21 +08:00
" test " = @ { " supports " = " !uwp " } ;
" wave " = @ { " supports " = " !uwp " } ;
2020-10-29 05:22:51 +08:00
" log " = @ { " supports " = " !uwp&!emscripten " } ;
2020-08-08 02:41:21 +08:00
" locale " = @ {
" supports " = " !uwp " ;
2021-01-14 06:41:23 +08:00
" features " = @ {
icu = @ {
dependencies = @ ( " icu " )
description = " ICU backend for Boost.Locale "
}
}
} ;
2020-10-29 05:22:51 +08:00
" parameter-python " = @ { " supports " = " !emscripten " } ;
" process " = @ { " supports " = " !emscripten " } ;
2020-08-08 02:41:21 +08:00
" python " = @ {
2020-10-29 05:22:51 +08:00
" supports " = " !uwp&!(arm&windows)&!emscripten " ;
2021-01-14 06:41:23 +08:00
" features " = @ {
python2 = @ {
dependencies = @ ( @ { name = " python2 " ; platform = " windows " } )
description = " Build with Python2 support "
}
}
} ;
" regex " = @ {
" features " = @ {
icu = @ {
dependencies = @ ( " icu " )
description = " ICU backend for Boost.Regex "
}
}
}
2020-08-08 02:41:21 +08:00
}
2018-08-10 13:56:09 +08:00
function TransformReference ( )
{
param (
[ string ] $library
)
2020-08-08 02:41:21 +08:00
if ( $per_port_data [ $library ] . supports )
2018-08-10 13:56:09 +08:00
{
2021-01-14 06:41:23 +08:00
@ { name = " boost- $library " ; platform = $per_port_data [ $library ] . supports }
2018-08-10 13:56:09 +08:00
}
else
{
2021-01-14 06:41:23 +08:00
" boost- $library "
2018-08-10 13:56:09 +08:00
}
}
2017-12-06 05:00:50 +08:00
function Generate ( )
{
param (
[ string ] $Name ,
2020-01-17 07:10:15 +08:00
[ string ] $PortName ,
2017-12-06 05:00:50 +08:00
[ string ] $Hash ,
[ bool ] $NeedsBuild ,
$Depends = @ ( )
)
2021-01-14 06:41:23 +08:00
New-Item -ItemType " Directory " " $portsDir /boost- $PortName " -erroraction SilentlyContinue | out-null
$controlLines = @ {
name = " boost- $PortName " ; `
" version-string " = $version ; `
dependencies = $Depends ; `
homepage = " https://github.com/boostorg/ $Name " ; `
description = " Boost $Name module " `
2020-08-08 02:41:21 +08:00
}
2021-01-14 06:41:23 +08:00
if ( $port_versions [ $PortName ] )
2017-12-06 05:00:50 +08:00
{
2021-01-14 06:41:23 +08:00
$controlLines [ " port-version " ] = $port_versions [ $PortName ]
2017-12-06 05:00:50 +08:00
}
2021-03-27 03:55:34 +08:00
elseif ( $NeedsBuild )
{
# This can be removed on next update; this is used to track the host dependencies change
$controlLines [ " port-version " ] = 1
}
2021-01-14 06:41:23 +08:00
if ( $per_port_data [ $PortName ] )
2017-12-06 05:00:50 +08:00
{
2021-01-14 06:41:23 +08:00
$controlLines + = $per_port_data [ $PortName ]
2017-12-06 05:00:50 +08:00
}
2021-01-14 06:41:23 +08:00
$controlLines | ConvertTo-Json -Depth 10 -Compress | out-file -enc ascii " $portsDir /boost- $PortName /vcpkg.json "
& $vcpkg format-manifest " $portsDir /boost- $PortName /vcpkg.json "
2017-12-06 05:00:50 +08:00
$portfileLines = @ (
2020-11-26 03:26:33 +08:00
" # Automatically generated by scripts/boost/generate-ports.ps1 "
2017-12-06 05:00:50 +08:00
" "
2020-01-17 07:10:15 +08:00
)
if ( $PortName -eq " system " )
{
$portfileLines + = @ (
" vcpkg_buildpath_length_warning(37) "
" "
)
}
$portfileLines + = @ (
2017-12-06 05:00:50 +08:00
" vcpkg_from_github( "
" OUT_SOURCE_PATH SOURCE_PATH "
" REPO boostorg/ $Name "
" REF boost- $version "
" SHA512 $Hash "
" HEAD_REF master "
2019-01-31 08:04:17 +08:00
)
2021-01-14 06:41:23 +08:00
$patches = Get-ChildItem $portsDir / boost - $PortName / * . patch
2020-08-08 02:41:21 +08:00
if ( $patches . Count -eq 0 )
2019-01-31 08:04:17 +08:00
{
2019-09-28 01:41:02 +08:00
}
2020-08-08 02:41:21 +08:00
elseif ( $patches . Count -eq 1 )
2019-09-28 01:41:02 +08:00
{
2020-08-08 02:41:21 +08:00
$portfileLines + = @ ( " PATCHES $( $patches . name ) " )
2019-01-31 08:04:17 +08:00
}
2020-08-08 02:41:21 +08:00
else
2020-03-25 04:01:25 +08:00
{
2020-08-08 02:41:21 +08:00
$portfileLines + = @ ( " PATCHES " )
foreach ( $patch in $patches )
{
2020-11-07 05:30:37 +08:00
$portfileLines + = @ ( " $( $patch . name ) " )
2020-08-08 02:41:21 +08:00
}
2020-03-25 04:01:25 +08:00
}
2019-01-31 08:04:17 +08:00
$portfileLines + = @ (
2017-12-06 05:00:50 +08:00
" ) "
" "
)
2020-01-17 07:10:15 +08:00
if ( Test-Path " $scriptsDir /post-source-stubs/ $PortName .cmake " )
2017-12-06 05:00:50 +08:00
{
2020-01-17 07:10:15 +08:00
$portfileLines + = @ ( get-content " $scriptsDir /post-source-stubs/ $PortName .cmake " )
2017-12-06 05:00:50 +08:00
}
if ( $NeedsBuild )
{
2020-05-14 01:26:05 +08:00
$portfileLines + = @ (
2021-03-27 03:55:34 +08:00
" if(NOT DEFINED CURRENT_HOST_INSTALLED_DIR) "
" message(FATAL_ERROR `" boost- $PortName requires a newer version of vcpkg in order to build. `" ) "
" endif() "
" include( `$ {CURRENT_HOST_INSTALLED_DIR}/share/boost-build/boost-modular-build.cmake) "
2020-05-14 01:26:05 +08:00
)
# b2-options.cmake contains port-specific build options
if ( Test-Path " $portsDir /boost- $PortName /b2-options.cmake " )
2017-12-06 05:00:50 +08:00
{
$portfileLines + = @ (
2019-01-31 08:04:17 +08:00
" boost_modular_build( "
" SOURCE_PATH `$ {SOURCE_PATH} "
2020-05-14 01:26:05 +08:00
" BOOST_CMAKE_FRAGMENT `" `$ {CMAKE_CURRENT_LIST_DIR}/b2-options.cmake `" "
2019-01-31 08:04:17 +08:00
" ) "
2017-12-06 05:00:50 +08:00
)
}
2020-11-26 03:26:33 +08:00
elseif ( Test-Path " $portsDir /boost- $PortName /b2-options.cmake.in " )
{
$portfileLines + = @ (
'configure_file('
' "${CMAKE_CURRENT_LIST_DIR}/b2-options.cmake.in"'
' "${CURRENT_BUILDTREES_DIR}/vcpkg-b2-options.cmake"'
' @ONLY'
')'
'boost_modular_build('
' SOURCE_PATH ${SOURCE_PATH}'
' BOOST_CMAKE_FRAGMENT "${CURRENT_BUILDTREES_DIR}/vcpkg-b2-options.cmake"'
')'
)
}
2017-12-06 05:00:50 +08:00
else
{
$portfileLines + = @ (
" boost_modular_build(SOURCE_PATH `$ {SOURCE_PATH}) "
2020-05-14 01:26:05 +08:00
)
2017-12-06 05:00:50 +08:00
}
}
2020-01-17 17:56:22 +08:00
$portfileLines + = @ (
" include( `$ {CURRENT_INSTALLED_DIR}/share/boost-vcpkg-helpers/boost-modular-headers.cmake) "
" boost_modular_headers(SOURCE_PATH `$ {SOURCE_PATH}) "
)
2017-12-06 05:00:50 +08:00
2020-01-17 07:10:15 +08:00
if ( Test-Path " $scriptsDir /post-build-stubs/ $PortName .cmake " )
2017-12-06 05:00:50 +08:00
{
2020-01-17 07:10:15 +08:00
$portfileLines + = @ ( get-content " $scriptsDir /post-build-stubs/ $PortName .cmake " )
2018-01-04 09:44:55 +08:00
}
2017-12-06 05:00:50 +08:00
2021-01-14 06:41:23 +08:00
$portfileLines + = @ ( " " )
$ ( $portfileLines -join " `r `n " ) | out-file -enc ascii " $portsDir /boost- $PortName /portfile.cmake " -NoNewline
2017-12-06 05:00:50 +08:00
}
if ( ! ( Test-Path " $scriptsDir /boost " ) )
{
" Cloning boost... "
pushd $scriptsDir
try
{
git clone https : / / github . com / boostorg / boost - -branch boost - $version
}
finally
{
popd
}
}
2018-04-18 06:18:09 +08:00
else
{
pushd $scriptsDir / boost
try
{
git fetch
git checkout -f boost - $version
}
finally
{
popd
}
}
2017-12-06 05:00:50 +08:00
2021-01-14 06:41:23 +08:00
$libraries_found = Get-ChildItem $scriptsDir / boost / libs -directory | % name | % {
2017-12-06 05:00:50 +08:00
if ( $_ -match " numeric " )
{
" numeric_conversion "
" interval "
" odeint "
" ublas "
2019-01-31 08:04:17 +08:00
" safe_numerics "
2017-12-06 05:00:50 +08:00
}
2019-05-17 09:33:32 +08:00
elseif ( $_ -eq " headers " )
{
}
2017-12-06 05:00:50 +08:00
else
{
$_
}
}
2021-01-14 06:41:23 +08:00
New-Item -ItemType " Directory " $scriptsDir / downloads -erroraction SilentlyContinue | out-null
2017-12-06 05:00:50 +08:00
if ( $libraries . Length -eq 0 )
{
$libraries = $libraries_found
}
$libraries_in_boost_port = @ ( )
foreach ( $library in $libraries )
{
" Handling boost/ $library ... "
$archive = " $scriptsDir /downloads/ $library -boost- $version .tar.gz "
if ( ! ( Test-Path $archive ) )
{
" Downloading boost/ $library ... "
2021-01-14 06:41:23 +08:00
& $curl -L " https://github.com/boostorg/ $library /archive/boost- $version .tar.gz " - -output " $scriptsDir /downloads/ $library -boost- $version .tar.gz "
2017-12-06 05:00:50 +08:00
}
2020-11-26 03:26:33 +08:00
$hash = & $vcpkg hash $archive
2017-12-06 05:00:50 +08:00
$unpacked = " $scriptsDir /libs/ $library -boost- $version "
if ( ! ( Test-Path $unpacked ) )
{
" Unpacking boost/ $library ... "
2021-01-14 06:41:23 +08:00
New-Item -ItemType " Directory " $scriptsDir / libs -erroraction SilentlyContinue | out-null
2017-12-06 05:00:50 +08:00
pushd $scriptsDir / libs
try
{
cmake -E tar xf $archive
}
finally
{
popd
}
}
pushd $unpacked
try
{
2021-01-14 06:41:23 +08:00
if ( $IsWindows )
{
$groups = $ (
findstr / si / C: " include <boost/ " include / *
findstr / si / C: " include <boost/ " src / *
) | % { $_ -replace " ^[^:]*: " , " " }
}
else
{
$groups = $ (
grep -irhs " include <boost/ " include src
)
}
$groups = $groups |
2018-08-10 13:56:09 +08:00
% { $_ `
-replace " boost/numeric/conversion/ " , " boost/numeric_conversion/ " `
-replace " boost/functional/hash.hpp " , " boost/container_hash/hash.hpp " `
-replace " boost/detail/([^/]+)/ " , " boost/ `$ 1/ " `
2019-01-31 08:04:17 +08:00
-replace " *# *include *<boost/([a-zA-Z0-9\._]*)(/|>).* " , " `$ 1 " `
2018-08-10 13:56:09 +08:00
-replace " /|\.hp?p?| " , " " } | group | % name | % {
2017-12-06 05:00:50 +08:00
# mappings
Write-Verbose " ${library} : $_ "
if ( $_ -match " aligned_storage " ) { " type_traits " }
elseif ( $_ -match " noncopyable|ref|swap|get_pointer|checked_delete|visit_each " ) { " core " }
elseif ( $_ -eq " type " ) { " core " }
2020-12-24 09:16:42 +08:00
elseif ( $_ -match " concept|concept_archetype " ) { " concept_check " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -match " unordered_ " ) { " unordered " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -match " cstdint|integer_fwd|integer_traits " ) { " integer " }
2019-01-31 08:04:17 +08:00
elseif ( $_ -match " call_traits|operators|current_function|cstdlib|next_prior|compressed_pair " ) { " utility " }
elseif ( $_ -match " ^version|^workaround " ) { " config " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -match " enable_shared_from_this|shared_ptr|make_shared|make_unique|intrusive_ptr|scoped_ptr|pointer_cast|pointer_to_other|weak_ptr|shared_array|scoped_array " ) { " smart_ptr " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -match " iterator_adaptors|generator_iterator|pointee " ) { " iterator " }
elseif ( $_ -eq " regex_fwd " ) { " regex " }
elseif ( $_ -eq " make_default " ) { " convert " }
elseif ( $_ -eq " foreach_fwd " ) { " foreach " }
elseif ( $_ -eq " cerrno " ) { " system " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -eq " circular_buffer_fwd " ) { " circular_buffer " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -eq " archive " ) { " serialization " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -match " none|none_t " ) { " optional " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -eq " limits " ) { " compatibility " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -match " cstdfloat|math_fwd " ) { " math " }
2020-12-16 07:00:41 +08:00
elseif ( $_ -eq " cast " ) { " conversion " ; " numeric_conversion " } # DEPRECATED header file, includes <boost/polymorphic_cast.hpp> and <boost/numeric/conversion/cast.hpp>
2017-12-06 05:00:50 +08:00
elseif ( $_ -match " polymorphic_cast|implicit_cast " ) { " conversion " }
elseif ( $_ -eq " nondet_random " ) { " random " }
elseif ( $_ -eq " memory_order " ) { " atomic " }
2020-12-24 09:16:42 +08:00
elseif ( $_ -match " blank|blank_fwd|numeric_traits|fenv " ) { " detail " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -match " is_placeholder|mem_fn " ) { " bind " }
elseif ( $_ -eq " exception_ptr " ) { " exception " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -match " multi_index_container|multi_index_container_fwd " ) { " multi_index " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -eq " lexical_cast " ) { " lexical_cast " ; " math " }
2019-01-31 08:04:17 +08:00
elseif ( $_ -match " token_iterator|token_functions " ) { " tokenizer " }
2017-12-06 05:00:50 +08:00
elseif ( $_ -eq " numeric " -and $library -notmatch " numeric_conversion|interval|odeint|ublas " ) { " numeric_conversion " ; " interval " ; " odeint " ; " ublas " }
2020-05-14 01:26:05 +08:00
elseif ( $_ -eq " io_fwd " ) { " io " }
2017-12-06 05:00:50 +08:00
else { $_ }
} | group | % name | ? { $_ -ne $library }
#"`nFor ${library}:"
" [known] " + $ ( $groups | ? { $libraries_found -contains $_ } )
" [unknown] " + $ ( $groups | ? { $libraries_found -notcontains $_ } )
$deps = @ ( $groups | ? { $libraries_found -contains $_ } )
$deps = @ ( $deps | ? {
# Boost contains cycles, so remove a few dependencies to break the loop.
2019-01-31 08:04:17 +08:00
( ( $library -notmatch " core|assert|mpl|detail|throw_exception|type_traits|^exception " ) -or ( $_ -notmatch " utility " ) ) `
2018-08-10 13:56:09 +08:00
-and `
2020-05-14 01:26:05 +08:00
( ( $library -notmatch " assert " ) -or ( $_ -notmatch " integer " ) ) `
-and `
2018-08-10 13:56:09 +08:00
( ( $library -notmatch " range " ) -or ( $_ -notmatch " algorithm " ) ) `
-and `
( ( $library -ne " config " ) -or ( $_ -notmatch " integer " ) ) `
-and `
2019-05-17 09:33:32 +08:00
( ( $library -notmatch " multiprecision " ) -or ( $_ -notmatch " random|math " ) ) `
2017-12-06 05:00:50 +08:00
-and `
( ( $library -notmatch " lexical_cast " ) -or ( $_ -notmatch " math " ) ) `
-and `
( ( $library -notmatch " functional " ) -or ( $_ -notmatch " function " ) ) `
-and `
( ( $library -notmatch " detail " ) -or ( $_ -notmatch " static_assert|integer|mpl|type_traits " ) ) `
-and `
2018-02-17 19:54:43 +08:00
( $_ -notmatch " mpi " ) `
2017-12-06 05:00:50 +08:00
-and `
( ( $library -notmatch " spirit " ) -or ( $_ -notmatch " serialization " ) ) `
-and `
2019-01-31 08:04:17 +08:00
( ( $library -notmatch " throw_exception " ) -or ( $_ -notmatch " ^exception " ) ) `
-and `
2020-12-24 09:16:42 +08:00
( ( $library -notmatch " iostreams|math " ) -or ( $_ -notmatch " random " ) ) `
2019-01-31 08:04:17 +08:00
-and `
2017-12-06 05:00:50 +08:00
( ( $library -notmatch " utility|concept_check " ) -or ( $_ -notmatch " iterator " ) )
2021-01-14 06:41:23 +08:00
} | % { $_ -replace " _ " , " - " } | % { TransformReference $_ } )
2017-12-06 05:00:50 +08:00
$deps + = @ ( " boost-vcpkg-helpers " )
$needsBuild = $false
2018-04-18 07:26:01 +08:00
if ( ( Test-Path $unpacked / build / Jamfile . v2 ) -and $library -ne " metaparse " -and $library -ne " graph_parallel " )
2017-12-06 05:00:50 +08:00
{
2021-03-27 03:55:34 +08:00
$deps + = @ (
@ { name = " boost-build " ; host = $True } ,
@ { name = " boost-modular-build-helper " ; host = $True }
)
2017-12-06 05:00:50 +08:00
$needsBuild = $true
}
if ( $library -eq " python " )
{
2020-03-03 02:41:27 +08:00
$deps + = @ ( " python3 " )
2017-12-22 03:46:26 +08:00
$needsBuild = $true
2017-12-06 05:00:50 +08:00
}
elseif ( $library -eq " iostreams " )
{
2019-09-28 01:41:02 +08:00
$deps + = @ ( " zlib " , " bzip2 " , " liblzma " , " zstd " )
2017-12-06 05:00:50 +08:00
}
2018-04-18 07:26:01 +08:00
elseif ( $library -eq " locale " )
{
2021-01-14 06:41:23 +08:00
$deps + = @ ( @ { name = " libiconv " ; platform = " !uwp&!windows&!mingw " } , " boost-system " )
2018-04-18 07:26:01 +08:00
}
2018-01-20 08:26:30 +08:00
elseif ( $library -eq " asio " )
{
$deps + = @ ( " openssl " )
}
2018-02-17 19:54:43 +08:00
elseif ( $library -eq " mpi " )
{
2019-08-01 05:47:59 +08:00
$deps + = @ ( " mpi " )
2018-02-17 19:54:43 +08:00
}
2017-12-06 05:00:50 +08:00
2020-01-17 07:10:15 +08:00
$portName = $library -replace " _ " , " - "
2017-12-06 05:00:50 +08:00
Generate `
-Name $library `
2020-01-17 07:10:15 +08:00
-PortName $portName `
2017-12-06 05:00:50 +08:00
-Hash $hash `
-Depends $deps `
-NeedsBuild $needsBuild
2020-01-17 07:10:15 +08:00
$libraries_in_boost_port + = @ ( TransformReference $portName )
2017-12-06 05:00:50 +08:00
}
finally
{
popd
}
}
2019-01-31 08:04:17 +08:00
if ( $libraries_in_boost_port . length -gt 1 ) {
# Generate master boost control file which depends on each individual library
2020-06-12 02:13:09 +08:00
# mpi is excluded due to it having a dependency on msmpi/openmpi
2021-01-14 06:41:23 +08:00
$boostDependsList = $libraries_in_boost_port | ? { $_ -notmatch " boost-mpi " }
@ {
name = " boost " ;
" version-string " = $version ;
" port-version " = $port_versions . boost ? $port_versions . boost : 0 ;
homepage = " https://boost.org " ;
description = " Peer-reviewed portable C++ source libraries " ;
dependencies = $boostDependsList ;
features = @ (
@ {
name = " mpi " ;
description = " Build with MPI support " ;
dependencies = @ ( " boost-mpi " ) ;
}
) ;
} | ConvertTo-Json -Depth 10 -Compress | out-file -enc ascii $portsDir / boost / vcpkg . json
& $vcpkg format-manifest " $portsDir /boost/vcpkg.json "
2019-01-31 08:04:17 +08:00
2019-09-28 01:41:02 +08:00
" set(VCPKG_POLICY_EMPTY_PACKAGE enabled) `n " | out-file -enc ascii $portsDir / boost / portfile . cmake
2019-01-31 08:04:17 +08:00
}
2017-12-06 05:00:50 +08:00
return