Merge master into staging-next

This commit is contained in:
github-actions[bot] 2021-01-13 01:11:17 +00:00 committed by GitHub
commit 3edc776d77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 292 additions and 65 deletions

1
.github/CODEOWNERS vendored
View file

@ -37,6 +37,7 @@
/pkgs/build-support/cc-wrapper @Ericson2314 @orivej /pkgs/build-support/cc-wrapper @Ericson2314 @orivej
/pkgs/build-support/bintools-wrapper @Ericson2314 @orivej /pkgs/build-support/bintools-wrapper @Ericson2314 @orivej
/pkgs/build-support/setup-hooks @Ericson2314 /pkgs/build-support/setup-hooks @Ericson2314
/pkgs/build-support/setup-hooks/auto-patchelf.sh @aszlig
# Nixpkgs build-support # Nixpkgs build-support
/pkgs/build-support/writers @lassulus @Profpatsch /pkgs/build-support/writers @lassulus @Profpatsch

View file

@ -0,0 +1,30 @@
{ lib
, rustPlatform
, fetchFromGitHub
, llvmPackages
}:
rustPlatform.buildRustPackage rec {
pname = "electrs";
version = "0.8.6";
src = fetchFromGitHub {
owner = "romanz";
repo = pname;
rev = "v${version}";
sha256 = "0nnblxz4xr8k083wy3whx8qxqmdzbxsh5gd91161mrnvidganvgb";
};
# needed for librocksdb-sys
nativeBuildInputs = [ llvmPackages.clang ];
LIBCLANG_PATH = "${llvmPackages.libclang}/lib";
cargoSha256 = "11xwjcfc3kqjyp94qzmyb26xwynf4f1q3ac3rp7l7qq1njly07gr";
meta = with lib; {
description = "An efficient re-implementation of Electrum Server in Rust";
homepage = "https://github.com/romanz/electrs";
license = licenses.mit;
maintainers = with maintainers; [ prusnak ];
};
}

View file

@ -4,8 +4,8 @@
let let
pname = "MyCrypto"; pname = "MyCrypto";
version = "1.7.12"; version = "1.7.13";
sha256 = "0zmdmkli9zxygrcvrd4lbi0xqyq32dqlkxby8lsjknj1nd6l26n3"; sha256 = "15m21n68lxnz6fxwf1bb3cxg5qi6nrwcnqymiw8s9wizvv575vj7";
name = "${pname}-${version}"; name = "${pname}-${version}";
src = fetchurl { src = fetchurl {

View file

@ -2,13 +2,13 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "greybird"; pname = "greybird";
version = "3.22.13"; version = "3.22.14";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "shimmerproject"; owner = "shimmerproject";
repo = pname; repo = pname;
rev = "v${version}"; rev = "v${version}";
sha256 = "154qawiga792iimkpk3a6q8f4gm4r158wmsagkbqqbhj33kxgxhg"; sha256 = "0b0axzrvdsv7aa029idz4rs1jm6df4ff3v4j4d5wf4yiypb48js9";
}; };
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -2,13 +2,13 @@
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "matcha-gtk-theme"; pname = "matcha-gtk-theme";
version = "2020-12-07"; version = "2021-01-12";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "vinceliuice"; owner = "vinceliuice";
repo = pname; repo = pname;
rev = version; rev = version;
sha256 = "0ch05nz1hipi9fz4sx1pah61jkbjw2gz3binsqayhp76jmp344a1"; sha256 = "1h6y89aajygbp1rc3d5dw2vgb64a3hiajlifb4xnzhycc77vjskr";
}; };
buildInputs = [ gdk-pixbuf librsvg ]; buildInputs = [ gdk-pixbuf librsvg ];
@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
meta = with lib; { meta = with lib; {
description = "A stylish flat Design theme for GTK based desktop environments"; description = "A stylish flat Design theme for GTK based desktop environments";
homepage = "https://vinceliuice.github.io/theme-matcha"; homepage = "https://vinceliuice.github.io/theme-matcha";
license = licenses.gpl3; license = licenses.gpl3Only;
platforms = platforms.unix; platforms = platforms.unix;
maintainers = [ maintainers.romildo ]; maintainers = [ maintainers.romildo ];
}; };

View file

@ -1,24 +1,45 @@
{ stdenv, fetchurl, pkgconfig, glib, zlib, libpng, cmake }: { stdenv, fetchFromGitHub, pkg-config, glib, zlib, libpng, cmake }:
stdenv.mkDerivation rec { let
version = "0.3.95"; version = "0.3.95";
pname = "lensfun"; pname = "lensfun";
src = fetchurl { # Fetch a more recent version of the repo containing a more recent lens
url = "mirror://sourceforge/lensfun/${version}/${pname}-${version}.tar.gz"; # database
sha256 = "0218f3xrlln0jmh4gcf1zbpvi2bidgl3b2mblf6c810n7j1rrhl2"; lensfunDatabase = fetchFromGitHub {
owner = "lensfun";
repo = "lensfun";
rev = "4672d765a17bfef7bc994ca7008cb717c61045d5";
sha256 = "00x35xhpn55j7f8qzakb6wl1ccbljg1gqjb93jl9w3mha2bzsr41";
}; };
nativeBuildInputs = [ cmake pkgconfig ]; in
stdenv.mkDerivation {
inherit pname version;
src = fetchFromGitHub {
owner = "lensfun";
repo = "lensfun";
rev = "v${version}";
sha256 = "0isli0arns8bmxqpbr1jnbnqh5wvspixdi51adm671f9ngng7x5r";
};
# replace database with a more recent snapshot
postUnpack = ''
rm -R source/data/db
cp -R ${lensfunDatabase}/data/db source/data
'';
nativeBuildInputs = [ cmake pkg-config ];
buildInputs = [ glib zlib libpng ]; buildInputs = [ glib zlib libpng ];
configureFlags = [ "-v" ]; cmakeFlags = [ "-DINSTALL_HELPER_SCRIPTS=OFF" ];
meta = with stdenv.lib; { meta = with stdenv.lib; {
platforms = platforms.linux ++ platforms.darwin; platforms = platforms.linux ++ platforms.darwin;
maintainers = with maintainers; [ ]; maintainers = with maintainers; [ flokli ];
license = stdenv.lib.licenses.lgpl3; license = stdenv.lib.licenses.lgpl3;
description = "An opensource database of photographic lenses and their characteristics"; description = "An opensource database of photographic lenses and their characteristics";
homepage = "http://lensfun.sourceforge.net/"; homepage = "https://lensfun.github.io";
}; };
} }

View file

@ -1,21 +1,27 @@
{ lib { lib
, buildPythonPackage , buildPythonPackage
, fetchPypi , fetchFromGitHub
, biopython , biopython
, docopt , docopt
, flametree , flametree
, numpy , numpy
, proglog , proglog
, pytestCheckHook
, python-codon-tables , python-codon-tables
, primer3
, genome-collector
, matplotlib
}: }:
buildPythonPackage rec { buildPythonPackage rec {
pname = "dnachisel"; pname = "dnachisel";
version = "3.2.5"; version = "3.2.6";
src = fetchPypi { src = fetchFromGitHub {
inherit pname version; owner = "Edinburgh-Genome-Foundry";
sha256 = "35301c5eda0baca5902403504e0b5a22eb65da92c2bbd23199d95c4a6bf0ef37"; repo = "DnaChisel";
rev = "v${version}";
sha256 = "0m88biw7sycjwsmncdybj9n3yf4n9cyvifv9zv7irm8ha3scchji";
}; };
propagatedBuildInputs = [ propagatedBuildInputs = [
@ -27,9 +33,24 @@ buildPythonPackage rec {
python-codon-tables python-codon-tables
]; ];
# no tests in tarball checkInputs = [
doCheck = false; primer3
genome-collector
matplotlib
pytestCheckHook
];
# Disable tests which requires network access
disabledTests = [
"test_circular_sequence_optimize_with_report"
"test_constraints_reports"
"test_optimize_with_report"
"test_optimize_with_report_no_solution"
"test_avoid_blast_matches_with_list"
"test_avoid_phage_blast_matches"
"test_avoid_matches_with_list"
"test_avoid_matches_with_phage"
];
pythonImportsCheck = [ "dnachisel" ]; pythonImportsCheck = [ "dnachisel" ];
meta = with lib; { meta = with lib; {

View file

@ -0,0 +1,34 @@
{ lib
, buildPythonPackage
, appdirs
, biopython
, fetchPypi
, proglog
}:
buildPythonPackage rec {
pname = "genome_collector";
version = "0.1.6";
src = fetchPypi {
inherit pname version;
sha256 = "0023ihrz0waxbhq28xh1ymvk51ih882y9psg4glm6s9d1zmqvdph";
};
propagatedBuildInputs = [
appdirs
biopython
proglog
];
# Project hasn't released the tests yet
doCheck = false;
pythonImportsCheck = [ "genome_collector" ];
meta = with lib; {
description = "Genomes and build BLAST/Bowtie indexes in Python";
homepage = "https://github.com/Edinburgh-Genome-Foundry/genome_collector";
license = with licenses; [ mit ];
maintainers = with maintainers; [ fab ];
};
}

View file

@ -1,6 +1,6 @@
{ lib, buildPythonPackage, fetchPypi { lib, buildPythonPackage, fetchPypi
, google-auth, google-auth-httplib2, google-api-core , google-auth, google-auth-httplib2, google-api-core
, httplib2, six, uritemplate, oauth2client }: , httplib2, six, uritemplate, oauth2client, setuptools }:
buildPythonPackage rec { buildPythonPackage rec {
pname = "google-api-python-client"; pname = "google-api-python-client";
@ -16,7 +16,11 @@ buildPythonPackage rec {
propagatedBuildInputs = [ propagatedBuildInputs = [
google-auth google-auth-httplib2 google-api-core google-auth google-auth-httplib2 google-api-core
httplib2 six uritemplate oauth2client httplib2 six uritemplate oauth2client setuptools
];
pythonImportsCheck = [
"googleapiclient"
]; ];
meta = with lib; { meta = with lib; {

View file

@ -0,0 +1,32 @@
{ lib
, buildPythonPackage
, fetchFromGitHub
, cython
, click
}:
buildPythonPackage rec {
pname = "primer3";
version = "0.6.1";
src = fetchFromGitHub {
owner = "libnano";
repo = "primer3-py";
rev = version;
sha256 = "1glybwp9w2m1ydvaphr41gj31d8fvlh40s35galfbjqa563si72g";
};
nativeBuildInputs = [ cython ];
# pytestCheckHook leads to a circular import issue
checkInputs = [ click ];
pythonImportsCheck = [ "primer3" ];
meta = with lib; {
description = "Oligo analysis and primer design";
homepage = "https://github.com/libnano/primer3-py";
license = with licenses; [ gpl2Only ];
maintainers = with maintainers; [ fab ];
};
}

View file

@ -0,0 +1,45 @@
{ lib
, buildPythonPackage
, fetchFromGitHub
, pytest-asyncio
, pytest-cov
, pytest-timeout
, pytestCheckHook
, pythonOlder
, stdenv
}:
buildPythonPackage rec {
pname = "pypck";
version = "0.7.8";
disabled = pythonOlder "3.8";
src = fetchFromGitHub {
owner = "alengwenus";
repo = pname;
rev = version;
sha256 = "06yqyqpzpypid27z31prvsp7nzpjqzn7gjlfqwjhhxl8fdgh8hkr";
};
checkInputs = [
pytest-asyncio
pytest-cov
pytest-timeout
pytestCheckHook
];
disabledTests = lib.optionals stdenv.isDarwin [
"test_connection_lost"
];
__darwinAllowLocalNetworking = true;
pythonImportsCheck = [ "pypck" ];
meta = with lib; {
description = "LCN-PCK library written in Python";
homepage = "https://github.com/alengwenus/pypck";
license = with licenses; [ epl20 ];
maintainers = with maintainers; [ fab ];
};
}

View file

@ -1,34 +1,38 @@
{ lib, stdenv { lib
, buildPythonPackage , buildPythonPackage
, fetchFromGitHub , fetchFromGitHub
, nose , nose
, plumbum , plumbum
, pytestCheckHook
}: }:
buildPythonPackage rec { buildPythonPackage rec {
pname = "rpyc"; pname = "rpyc";
version = "4.1.3"; version = "5.0.1";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "tomerfiliba"; owner = "tomerfiliba";
repo = pname; repo = pname;
rev = version; rev = version;
sha256 = "145mi8p37x9cbfm5117g4ng7b5rmghjjwgm319qqhwgzvqg3y4j9"; sha256 = "1g75k4valfjgab00xri4pf8c8bb2zxkhgkpyy44fjk7s5j66daa1";
}; };
propagatedBuildInputs = [ plumbum ]; propagatedBuildInputs = [ plumbum ];
checkInputs = [ nose ]; checkInputs = [ pytestCheckHook ];
checkPhase = ''
cd tests # Disable tests that requires network access
# some tests have added complexities and some tests attempt network use disabledTests = [
nosetests -I test_deploy -I test_gevent_server -I test_ssh -I test_registry "test_api"
''; "test_pruning"
"test_rpyc"
];
pythonImportsCheck = [ "rpyc" ];
meta = with lib; { meta = with lib; {
description = "Remote Python Call (RPyC), a transparent and symmetric RPC library"; description = "Remote Python Call (RPyC), a transparent and symmetric RPC library";
homepage = "https://rpyc.readthedocs.org"; homepage = "https://rpyc.readthedocs.org";
license = licenses.mit; license = with licenses; [ mit ];
maintainers = with maintainers; [ fab ];
}; };
} }

View file

@ -7,13 +7,13 @@
}: }:
buildPythonPackage rec { buildPythonPackage rec {
version = "1.1.1"; version = "1.3.0";
pname = "strictyaml"; pname = "strictyaml";
disabled = isPy27; disabled = isPy27;
src = fetchPypi { src = fetchPypi {
inherit pname version; inherit pname version;
sha256 = "ea2bb97aacc12fff7df11bd4cb4ae64b1418a0311fbd1611445cc59dc650bdd3"; sha256 = "f640ae4e6fe761c3ae7138092c3dcb9b5050ec56e9cbac45d8a6b549d7ec973c";
}; };
propagatedBuildInputs = [ ruamel_yaml python-dateutil ]; propagatedBuildInputs = [ ruamel_yaml python-dateutil ];

View file

@ -3,7 +3,6 @@
, fetchFromGitHub , fetchFromGitHub
, aiohttp , aiohttp
, zigpy , zigpy
, conftest
, asynctest , asynctest
, pytestCheckHook , pytestCheckHook
}: }:
@ -20,7 +19,7 @@ buildPythonPackage rec {
}; };
propagatedBuildInputs = [ aiohttp zigpy ]; propagatedBuildInputs = [ aiohttp zigpy ];
checkInputs = [ pytestCheckHook conftest asynctest ]; checkInputs = [ pytestCheckHook asynctest ];
meta = with lib; { meta = with lib; {
description = "ZHA Device Handlers are custom quirks implementations for Zigpy"; description = "ZHA Device Handlers are custom quirks implementations for Zigpy";

View file

@ -102,10 +102,6 @@ let
popd popd
''; '';
preBuild = ''
export GRADLE_USER_HOME=$(mktemp -d)
'';
# The default one still uses jdk8 (#89731) # The default one still uses jdk8 (#89731)
gradle_6 = (gradleGen.override (old: { java = jdk; })).gradle_6_7; gradle_6 = (gradleGen.override (old: { java = jdk; })).gradle_6_7;
@ -119,8 +115,9 @@ let
# Here we download dependencies for both the server and the client so # Here we download dependencies for both the server and the client so
# we only have to specify one hash for 'deps'. Deps can be garbage # we only have to specify one hash for 'deps'. Deps can be garbage
# collected after the build, so this is not really an issue. # collected after the build, so this is not really an issue.
buildPhase = preBuild + '' buildPhase = ''
pushd Mindustry pushd Mindustry
export GRADLE_USER_HOME=$(mktemp -d)
gradle --no-daemon resolveDependencies gradle --no-daemon resolveDependencies
popd popd
''; '';
@ -136,7 +133,7 @@ let
}; };
in in
assert stdenv.lib.assertMsg (enableClient || enableServer) assert lib.assertMsg (enableClient || enableServer)
"mindustry: at least one of 'enableClient' and 'enableServer' must be true"; "mindustry: at least one of 'enableClient' and 'enableServer' must be true";
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
inherit pname version unpackPhase patches; inherit pname version unpackPhase patches;
@ -147,7 +144,7 @@ stdenv.mkDerivation rec {
rm Arc/backends/backend-sdl/libs/linux64/libsdl-arc*.so rm Arc/backends/backend-sdl/libs/linux64/libsdl-arc*.so
'' + cleanupMindustrySrc; '' + cleanupMindustrySrc;
buildInputs = [ buildInputs = lib.optionals enableClient [
SDL2 SDL2
glew glew
alsaLib alsaLib
@ -157,13 +154,16 @@ stdenv.mkDerivation rec {
gradle_6 gradle_6
makeWrapper makeWrapper
jdk jdk
] ++ lib.optionals enableClient [
ant ant
copyDesktopItems copyDesktopItems
]; ];
desktopItems = [ desktopItem ]; desktopItems = lib.optional enableClient desktopItem;
buildPhase = with lib; ''
export GRADLE_USER_HOME=$(mktemp -d)
buildPhase = with stdenv.lib; preBuild + ''
# point to offline repo # point to offline repo
sed -ie "s#mavenLocal()#mavenLocal(); maven { url '${deps}' }#g" Mindustry/build.gradle sed -ie "s#mavenLocal()#mavenLocal(); maven { url '${deps}' }#g" Mindustry/build.gradle
sed -ie "s#mavenCentral()#mavenCentral(); maven { url '${deps}' }#g" Arc/build.gradle sed -ie "s#mavenCentral()#mavenCentral(); maven { url '${deps}' }#g" Arc/build.gradle
@ -180,7 +180,9 @@ stdenv.mkDerivation rec {
gradle --offline --no-daemon server:dist -Pbuildversion=${buildVersion} gradle --offline --no-daemon server:dist -Pbuildversion=${buildVersion}
''; '';
installPhase = with stdenv.lib; optionalString enableClient '' installPhase = with lib; ''
runHook preInstall
'' + optionalString enableClient ''
install -Dm644 desktop/build/libs/Mindustry.jar $out/share/mindustry.jar install -Dm644 desktop/build/libs/Mindustry.jar $out/share/mindustry.jar
mkdir -p $out/bin mkdir -p $out/bin
makeWrapper ${jdk}/bin/java $out/bin/mindustry \ makeWrapper ${jdk}/bin/java $out/bin/mindustry \
@ -191,6 +193,8 @@ stdenv.mkDerivation rec {
mkdir -p $out/bin mkdir -p $out/bin
makeWrapper ${jdk}/bin/java $out/bin/mindustry-server \ makeWrapper ${jdk}/bin/java $out/bin/mindustry-server \
--add-flags "-jar $out/share/mindustry-server.jar" --add-flags "-jar $out/share/mindustry-server.jar"
'' + ''
runHook postInstall
''; '';
meta = with lib; { meta = with lib; {

View file

@ -325,6 +325,18 @@ in rec {
''; '';
}; };
power-theme = mkDerivation {
pluginName = "power";
rtpFilePath = "tmux-power.tmux";
version = "unstable-2020-11-18";
src = pkgs.fetchFromGitHub {
owner = "wfxr";
repo = "tmux-power";
rev = "aec44aa5e00cc39eb71c668b1d73823270058e7d";
sha256 = "11nm8cylx10d565g17acy0bj12n6dcbxp71zca2bmg0j1dq859cm";
};
};
prefix-highlight = mkDerivation { prefix-highlight = mkDerivation {
pluginName = "prefix-highlight"; pluginName = "prefix-highlight";
version = "unstable-2020-03-26"; version = "unstable-2020-03-26";

View file

@ -36,6 +36,18 @@ let
}; };
}; };
alexdima.copy-relative-path = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "copy-relative-path";
publisher = "alexdima";
version = "0.0.2";
sha256 = "06g601n9d6wyyiz659w60phgm011gn9jj5fy0gf5wpi2bljk3vcn";
};
meta = {
license = lib.licenses.mit;
};
};
ms-python.vscode-pylance = buildVscodeMarketplaceExtension { ms-python.vscode-pylance = buildVscodeMarketplaceExtension {
mktplcRef = { mktplcRef = {
name = "vscode-pylance"; name = "vscode-pylance";

View file

@ -428,7 +428,7 @@
"lannouncer" = ps: with ps; [ ]; "lannouncer" = ps: with ps; [ ];
"lastfm" = ps: with ps; [ pylast ]; "lastfm" = ps: with ps; [ pylast ];
"launch_library" = ps: with ps; [ ]; # missing inputs: pylaunches "launch_library" = ps: with ps; [ ]; # missing inputs: pylaunches
"lcn" = ps: with ps; [ ]; # missing inputs: pypck "lcn" = ps: with ps; [ pypck ];
"lg_netcast" = ps: with ps; [ ]; # missing inputs: pylgnetcast-homeassistant "lg_netcast" = ps: with ps; [ ]; # missing inputs: pylgnetcast-homeassistant
"lg_soundbar" = ps: with ps; [ ]; # missing inputs: temescal "lg_soundbar" = ps: with ps; [ ]; # missing inputs: temescal
"life360" = ps: with ps; [ ]; # missing inputs: life360 "life360" = ps: with ps; [ ]; # missing inputs: life360

View file

@ -4,11 +4,11 @@ with python.pkgs;
buildPythonApplication rec { buildPythonApplication rec {
pname = "tmuxp"; pname = "tmuxp";
version = "1.6.3"; version = "1.7.0";
src = fetchPypi { src = fetchPypi {
inherit pname version; inherit pname version;
sha256 = "4bc52d6683235307c92ddbb164c84e3e892ee2d00afa16ed89eca0fa7f85029e"; sha256 = "e5135d07a8944170e39ea8b96b09123c54648cca94537b4953d8f15e5a537da2";
}; };
postPatch = '' postPatch = ''

View file

@ -25670,6 +25670,8 @@ in
dogecoin = callPackage ../applications/blockchains/dogecoin.nix { boost = boost165; withGui = true; }; dogecoin = callPackage ../applications/blockchains/dogecoin.nix { boost = boost165; withGui = true; };
dogecoind = callPackage ../applications/blockchains/dogecoin.nix { boost = boost165; withGui = false; }; dogecoind = callPackage ../applications/blockchains/dogecoin.nix { boost = boost165; withGui = false; };
electrs = callPackage ../applications/blockchains/electrs.nix { };
ergo = callPackage ../applications/blockchains/ergo { }; ergo = callPackage ../applications/blockchains/ergo { };
exodus = callPackage ../applications/blockchains/exodus { }; exodus = callPackage ../applications/blockchains/exodus { };

View file

@ -2433,6 +2433,8 @@ in {
genanki = callPackage ../development/python-modules/genanki { }; genanki = callPackage ../development/python-modules/genanki { };
genome-collector = callPackage ../development/python-modules/genome-collector { };
genpy = callPackage ../development/python-modules/genpy { }; genpy = callPackage ../development/python-modules/genpy { };
genshi = callPackage ../development/python-modules/genshi { }; genshi = callPackage ../development/python-modules/genshi { };
@ -4928,6 +4930,8 @@ in {
else else
callPackage ../development/python-modules/prettytable/1.nix { }; callPackage ../development/python-modules/prettytable/1.nix { };
primer3 = callPackage ../development/python-modules/primer3 { };
priority = callPackage ../development/python-modules/priority { }; priority = callPackage ../development/python-modules/priority { };
prison = callPackage ../development/python-modules/prison { }; prison = callPackage ../development/python-modules/prison { };
@ -5600,6 +5604,8 @@ in {
pypcap = callPackage ../development/python-modules/pypcap { }; pypcap = callPackage ../development/python-modules/pypcap { };
pypck = callPackage ../development/python-modules/pypck { };
pypdf2 = callPackage ../development/python-modules/pypdf2 { }; pypdf2 = callPackage ../development/python-modules/pypdf2 { };
pyPdf = callPackage ../development/python-modules/pypdf { }; pyPdf = callPackage ../development/python-modules/pypdf { };