583 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Nix
		
	
	
			
		
		
	
	
			583 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Nix
		
	
	
| final: final-py: prev-py: let
 | |
|   SpiNNFrontEndCommon_C_Models = final.stdenv.mkDerivation {
 | |
|     pname = "SpiNNFrontEndCommon";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "SpiNNFrontEndCommon";
 | |
|       rev = "c3f8c980fd51d40032524150c563feac787532ae";
 | |
|       hash = "sha256-lJwoFmICQdnLaalFcFGnLnGiE+puuV2fQHM1wqHiiFY=";
 | |
|     };
 | |
|     buildInputs = with final; [
 | |
|       final-py.spinn_common
 | |
|       which
 | |
|       gcc-arm-embedded-10
 | |
|       (final-py.python.withPackages (p: with p; [
 | |
|         SpiNNUtilities
 | |
|       ]))
 | |
|     ];
 | |
|     preConfigure = ''
 | |
|       mkdir SPINN_DIRS
 | |
|       cp -r ${final-py.spinn_common}/SPINN_DIRS/* SPINN_DIRS
 | |
|       chmod +rw -R SPINN_DIRS
 | |
|       export SPINN_DIRS=$PWD/SPINN_DIRS
 | |
|       export GNUTOOLS=${final.gcc-arm-embedded-10}
 | |
|       export GNUBIN=$GNUTOOLS/bin
 | |
|       export C_LOGS_DICT=$PWD/spinn_front_end_common/common_model_binaries/logs.sqlite3
 | |
|       pushd c_common
 | |
|     '';
 | |
|     
 | |
|     installPhase = ''
 | |
|       popd
 | |
|       mkdir $out
 | |
|       cp -r * $out
 | |
|     '';
 | |
|   };
 | |
| 
 | |
|   spynnaker_c = final.stdenv.mkDerivation {
 | |
|     pname = "spynnaker";
 | |
|     version = "1!7.1.1";
 | |
|     
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "sPyNNaker";
 | |
|       rev = "6f7455badeeea223dda85cd0aab9e5f5086f843b";
 | |
|       hash = "sha256-zXssngB+A6zoH5X2FOI10biUNXNlwh0tySje/JMoZ0w=";
 | |
|     };
 | |
| 
 | |
|     buildInputs = with final; [
 | |
|       (final-py.python.withPackages (p: with p; [
 | |
|         SpiNNFrontEndCommon
 | |
|       ]))
 | |
|       gcc-arm-embedded-10
 | |
|     ];
 | |
|     
 | |
|     preConfigure = ''
 | |
|       mkdir SPINN_DIRS
 | |
|       cp -r ${SpiNNFrontEndCommon_C_Models}/SPINN_DIRS/* SPINN_DIRS
 | |
|       chmod +rw -R SPINN_DIRS
 | |
|       export SPINN_DIRS=$PWD/SPINN_DIRS
 | |
|       export GNUTOOLS=${final.gcc-arm-embedded-10}
 | |
|       export GNUBIN=$GNUTOOLS/bin
 | |
|       SLLT_TAG=https://spinnakermanchester.github.io/spinnaker_tools/sllt.tag
 | |
|       COMMON_TAG=https://spinnakermanchester.github.io/spinn_common/common.tag
 | |
|       FEC_TAG=https://spinnakermanchester.github.io/SpiNNFrontEndCommon/c/fec.tag
 | |
|       pushd neural_modelling
 | |
|       export NEURAL_MODELLING_DIRS=$PWD
 | |
|       touch logs.sqlite3
 | |
|       export C_LOGS_DICT=$PWD/logs.sqlite3
 | |
|     '';
 | |
| 
 | |
|     installPhase = ''
 | |
|       popd
 | |
|       mkdir $out
 | |
|       cp -r * $out
 | |
|     '';
 | |
|   };
 | |
| in {
 | |
|   morphio = final-py.toPythonModule ( final.stdenv.mkDerivation rec {
 | |
|     pname = "morphio";
 | |
|     version = "3.3.9";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "BlueBrain";
 | |
|       repo = "MorphIO";
 | |
|       rev = "v${version}";
 | |
|       fetchSubmodules = true;
 | |
|       hash = "sha256-qPHuKb9dSnSgEXzeI94Zf3VpMBBssQ0y8lCVzzYB+rA=";
 | |
|     };
 | |
| 
 | |
|     nativeBuildInputs = (with final; [
 | |
|       cmake
 | |
|       ninja
 | |
|       hdf5
 | |
|       final-py.numpy
 | |
|     ]);
 | |
|     cmakeFlags = [
 | |
|       "-DMorphIO_CXX_WARNINGS=OFF"
 | |
|     ];
 | |
|     postInstall = ''
 | |
|       mkdir -p $out/${final-py.python.sitePackages}
 | |
|       mv ../morphio $out/${final-py.python.sitePackages}
 | |
|       cp binds/python/_morphio.* $out/${final-py.python.sitePackages}/morphio/
 | |
|     '';
 | |
|   });
 | |
| 
 | |
|   csa = final-py.buildPythonPackage rec {
 | |
|     pname = "csa";
 | |
|     version = "0.1.12";
 | |
|     
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "INCF";
 | |
|       repo = "csa";
 | |
|       rev = "v${version}";
 | |
|       hash = "sha256-QtgqpYD0PtMoiobCEe0SkKF6HiiypctOWht9EnhlhKM=";
 | |
|     };
 | |
| 
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       numpy
 | |
|       matplotlib
 | |
|     ];        
 | |
|   };
 | |
|   
 | |
|   nineml = final-py.buildPythonPackage rec {
 | |
|     pname = "nineml";
 | |
|     version = "25-04-2020";
 | |
|     
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "INCF";
 | |
|       repo = "nineml-python";
 | |
|       rev = "062a2ac8a9be97cee4dad02938e3858e051cf07c";
 | |
|       hash = "sha256-Tyil4lnqQlzQthp6L77+pAjDywHDQC3NIp39BRgIfzY=";
 | |
|     };
 | |
| 
 | |
|     postPatch = ''
 | |
|       sed -e 's/collections.Iterable/collections.abc.Iterable/g' -i nineml/utils/iterables.py
 | |
|       sed -e 's/sympy.numbers/sympy.core.numbers/g' -i nineml/abstraction/componentclass/visitors/validators/general.py
 | |
|     '';
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       pip
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       lxml
 | |
|       pyyaml
 | |
|       h5py
 | |
|       future
 | |
|       sympy
 | |
|       numpy
 | |
|       numpydoc
 | |
|       nose
 | |
|     ];
 | |
|   };
 | |
|   
 | |
|   lazyarray = final-py.buildPythonPackage rec {
 | |
|     pname = "lazyarray";
 | |
|     version = "0.5.2";
 | |
|     
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "NeuralEnsemble";
 | |
|       repo = "lazyarray";
 | |
|       rev = "9d60f2c307a70d7bd65fbfe3cb2a96391fd88bf9";
 | |
|       hash = "sha256-D4KzICEdCoA1S8uKRU76Q6PfcolbuZsLAtDIm4a94wo=";
 | |
|     };
 | |
| 
 | |
|     doCheck = false; # Py2 code
 | |
| 
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       numpy
 | |
|     ];
 | |
|   };
 | |
|   
 | |
|   pynn = final-py.buildPythonPackage rec {
 | |
|     pname = "pyNN";
 | |
|     version = "0.12.1";
 | |
| 
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "NeuralEnsemble";
 | |
|       repo = "PyNN";
 | |
|       rev = "${version}";
 | |
|       hash = "sha256-X7U4aSA6J45++2mTPGWi+N6QtuH0muQtSrH6CWziNJg=";
 | |
|     };
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       pip
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       nineml
 | |
|       numpy
 | |
|       lazyarray
 | |
|       neo
 | |
|       quantities
 | |
|       morphio
 | |
|       brian2
 | |
|       nest
 | |
|       neuronpy
 | |
|     ];
 | |
| 
 | |
|     doCheck = false;
 | |
|   };
 | |
| 
 | |
|   boilerplates = final-py.buildPythonPackage rec {
 | |
|     pname = "boilerplates";
 | |
|     version = "1.1.1";
 | |
| 
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "mbdevpl";
 | |
|       repo = "python-boilerplates";
 | |
|       rev = "v${version}";
 | |
|       hash = "sha256-u6Gdtgqo4s40vMZhgEonil7OWsbOSFbnBO2PgOzWXmY=";
 | |
|     };
 | |
| 
 | |
|     # Fix circular dependency
 | |
|     postPatch = ''
 | |
|       echo "" > ./requirements.txt
 | |
|       echo 'VERSION = "${version}"' > ./boilerplates/_version.py
 | |
|     '';
 | |
| 
 | |
|     disabledTests = [
 | |
|       "test_git_repo"
 | |
|       "test_logging"
 | |
|     ];
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       colorlog
 | |
|       sentry-sdk
 | |
|       executing
 | |
|       pure-eval
 | |
|       asttokens
 | |
|       argcomplete
 | |
|       GitPython
 | |
|       packaging
 | |
|       semver
 | |
|       docutils
 | |
|     ];
 | |
|   };
 | |
|   
 | |
|   version-query = final-py.buildPythonPackage rec {
 | |
|     pname = "version-query";
 | |
|     version = "1.5.5";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "mbdevpl";
 | |
|       repo = "version-query";
 | |
|       rev = "v${version}";
 | |
|       hash = "sha256-b5G1YwT3RSWusNsT4kq8aBCzzs0UfoJrPMUH8KuaqX0=";
 | |
|     };
 | |
| 
 | |
|     postPatch = ''
 | |
|       echo 'VERSION = "${version}"' > ./version_query/_version.py
 | |
|     '';
 | |
| 
 | |
|     doCheck = false;
 | |
| 
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       boilerplates
 | |
|     ];
 | |
|   };
 | |
|   
 | |
|   ebrains-drive = final-py.buildPythonPackage rec {
 | |
|     pname = "ebrains-drive";
 | |
|     version = "20-02-2024";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "HumanBrainProject";
 | |
|       repo = "ebrains-drive";
 | |
|       rev = "3be240da78b23488cf01dc9768423bb962673c8d";
 | |
|       hash = "sha256-eYbAHGu0h9K5FYos10GGUwSMdDgVcslz2wf6XFY5yjo=";
 | |
|     };
 | |
|     
 | |
|     postPatch = ''
 | |
|       sed -e 's/__version__ = predict_version_str()/__version__ = "0.6.0"/g' -i setup.py
 | |
|     '';
 | |
| 
 | |
|     # no more strings.lowercase
 | |
|     doCheck = false;
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       version-query
 | |
|       requests
 | |
|       tqdm
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   SpiNNUtilities = final-py.buildPythonPackage {
 | |
|     pname = "SpiNNUtilities";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "SpiNNUtils";
 | |
|       rev = "37beeec7ad5489af8e644dfdf511108f27146951";
 | |
|       hash = "sha256-oB3uxDTX7CFvftqDxYqJ0A4RLfK4/JH1FVoAJMcUEa4=";
 | |
|     };
 | |
| 
 | |
|     # Tests depend on writable home
 | |
|     postPatch = ''
 | |
|       mkdir $NIX_BUILD_TOP/fake_home
 | |
|       export HOME=$NIX_BUILD_TOP/fake_home
 | |
|       export SKIP_PING_TESTS="true"
 | |
|     '';
 | |
|     
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     disabledTests = [
 | |
|       "test_localhost"
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       httpretty
 | |
|       testfixtures
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       appdirs
 | |
|       numpy
 | |
|       pyyaml
 | |
|       requests
 | |
|       typing-extensions
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   SpiNNMachine = final-py.buildPythonPackage {
 | |
|     pname = "SpiNNMachine";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "SpiNNMachine";
 | |
|       rev = "a798e7b12200d66f6fb9c6ed0af3f0fa85abd7be";
 | |
|       hash = "sha256-+9/ZK72SgI3seSCwCBVMPP1VL6r83SkQ4n3S1WkVCac=";
 | |
|     };
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       testfixtures
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       SpiNNUtilities
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   SpiNNaker_PACMAN = final-py.buildPythonPackage {
 | |
|     pname = "SpiNNaker_PACMAN";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "PACMAN";
 | |
|       rev = "adc5ed196b8ac661365c5ec67b4107932548deab";
 | |
|       hash = "sha256-ITe0fqDg/4r1xwFYXHpl0kL0Ek3d2s+SbQvRtWk1eF4=";
 | |
|     };
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       testfixtures
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       SpiNNMachine
 | |
|       jsonschema
 | |
|     ];
 | |
|   };
 | |
|   
 | |
|   SpiNNMan = final-py.buildPythonPackage {
 | |
|     pname = "SpiNNMan";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "SpiNNMan";
 | |
|       rev = "8b0e8192125c5856769ff302480e2c17b08d1b5f";
 | |
|       hash = "sha256-54JE5Vl1mcdBCHR4HOk4l7muZHePvufrwhgJZ11aX2A=";
 | |
|     };
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       testfixtures
 | |
|     ];
 | |
|     
 | |
|     disabledTests = [
 | |
|       "test_create_job"
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       SpiNNMachine
 | |
|       SpiNNUtilities
 | |
|       websocket-client
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   spalloc = final-py.buildPythonPackage {
 | |
|     pname = "spalloc";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "spalloc";
 | |
|       rev = "25f5d0874269996f2c36175885e9bbe7895ed4af";
 | |
|       hash = "sha256-Tck2VGV5ZO1PKHEY/OLoIVvj5AWCyVqtXca514vWmTA=";
 | |
|     };
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       mock
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       SpiNNUtilities
 | |
|       jsonschema
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   spinnaker_tools = final.stdenv.mkDerivation {
 | |
|     pname = "spinnaker_tools";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "spinnaker_tools";
 | |
|       rev = "26dd8651d7af8371ca1d5927524d1af2527dd041";
 | |
|       hash = "sha256-Ppow52pfzVi9Jh7cVSow6OmNMLmudMq4lRZOeCJyMU8=";
 | |
|     };
 | |
|     propagatedBuildInputs = with final; [
 | |
|       perl
 | |
|       gcc-arm-embedded-10
 | |
|     ];
 | |
|     postPatch = ''
 | |
|       patchShebangs ./tools
 | |
|     '';
 | |
|     preConfigure = ''
 | |
|       export SPINN_DIRS=$PWD
 | |
|       export GNUTOOLS=${final.gcc-arm-embedded-10}
 | |
|       export GNUBIN=$GNUTOOLS/bin
 | |
|       chmod +x ./tools/*
 | |
|     '';
 | |
|     installPhase = ''
 | |
|       mkdir $out
 | |
|       cp -r * $out
 | |
|     '';
 | |
|   };
 | |
| 
 | |
|   spinn_common = final.stdenv.mkDerivation {
 | |
|     pname = "spinn_common";
 | |
|     version = "1!7.1.1";
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "spinn_common";
 | |
|       rev = "fa5f769a7e8bab42b6932557c0deaebc1d7f2016";
 | |
|       hash = "sha256-aQpIkPWhKT+Uw4svKfibR7SEeKwNPqv86skSLNv2Z3Q=";
 | |
|     };
 | |
|     nativeBuildInputs = [
 | |
|       final-py.spinnaker_tools
 | |
|     ];
 | |
|     preConfigure = ''
 | |
|       mkdir SPINN_DIRS
 | |
|       cp -r ${final-py.spinnaker_tools}/* SPINN_DIRS
 | |
|       chmod +rw -R SPINN_DIRS
 | |
|       export SPINN_DIRS=$PWD/SPINN_DIRS
 | |
|       export GNUTOOLS=${final.gcc-arm-embedded-10}
 | |
|       export GNUBIN=$GNUTOOLS/bin
 | |
|     '';
 | |
| 
 | |
|     postInstall = ''
 | |
|       cp -r SPINN_DIRS $out
 | |
|     '';
 | |
|   };
 | |
|     
 | |
|   SpiNNFrontEndCommon = final-py.buildPythonPackage {
 | |
|     pname = "SpiNNFrontEndCommon";
 | |
|     version = "1!7.1.1";
 | |
|     src = SpiNNFrontEndCommon_C_Models;
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       httpretty
 | |
|       testfixtures
 | |
|     ];
 | |
| 
 | |
|     disabledTestPaths = [
 | |
|       "fec_local_tests/test_java_caller.py"
 | |
|       "unittests/interface/test_java_caller.py"
 | |
|     ];
 | |
|     
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       ebrains-drive
 | |
|       scipy
 | |
|       SpiNNMan
 | |
|       SpiNNaker_PACMAN
 | |
|       spalloc
 | |
|       SpiNNFrontEndCommon_C_Models
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   spinnaker_testbase = final-py.buildPythonPackage {
 | |
|     pname = "spinnaker_testbase";
 | |
|     version = "1!7.1.1";
 | |
|     
 | |
|     src = final.fetchFromGitHub {
 | |
|       owner = "SpiNNakerManchester";
 | |
|       repo = "TestBase";
 | |
|       rev = "324aa4c9f8348aa21c88611bb7ccf7585c783415";
 | |
|       hash = "sha256-YBDaFr7oDx53LBQN+V8CXpNTIGSLBDRyq4pNMBxankI=";
 | |
|     };
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       testfixtures
 | |
|     ];
 | |
| 
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       SpiNNFrontEndCommon
 | |
|       matplotlib
 | |
|     ];
 | |
|   };
 | |
| 
 | |
|   spynnaker = final-py.buildPythonPackage {
 | |
|     pname = "spynnaker";
 | |
|     version = "1!7.1.1";
 | |
|     
 | |
|     src = spynnaker_c;
 | |
| 
 | |
|     nativeBuildInputs = with final-py; [
 | |
|       pytestCheckHook
 | |
|     ];
 | |
| 
 | |
|     buildInputs = with final-py; [
 | |
|       testfixtures
 | |
|       spinnaker_testbase
 | |
|     ];
 | |
| 
 | |
|     propagatedBuildInputs = with final-py; [
 | |
|       SpiNNFrontEndCommon
 | |
|       matplotlib
 | |
|       quantities
 | |
|       neo
 | |
|       lazyarray
 | |
|       scipy
 | |
|       csa
 | |
|       pynn
 | |
|     ];
 | |
| 
 | |
|     # All these tests depend on connecting to the SpiNNaker or Network
 | |
|     disabledTestPaths = [
 | |
|       "proxy_integration_tests/"
 | |
|       "spynnaker_integration_tests/"
 | |
|       "test_whole_board/"
 | |
|       "unittests/test_from_file_connector.py"
 | |
|       "unittests/model_tests/"
 | |
|       "unittests/test_using_virtual_board/"
 | |
|       "unittests/test_integration_using_virtual_board/"
 | |
|       "unittests/test_pop_views_assembly/test_getting.py"
 | |
|       "unittests/test_pop_views_assembly/test_idmixin.py"
 | |
|       "unittests/test_pop_views_assembly/test_models.py"
 | |
|       "unittests/test_pop_views_assembly/test_population.py"
 | |
|       "unittests/test_pop_views_assembly/test_record.py"
 | |
|       "unittests/test_pop_views_assembly/test_views.py"
 | |
|       "unittests/test_populations/test_population.py"
 | |
|       "unittests/test_sata_connectors/"
 | |
|       "unittests/test_spinnaker_link_connectors/"
 | |
|       "unittests/test_populations/test_vertex.py"
 | |
|       "unittests/utilities_tests/test_utility_calls.py"
 | |
|     ];
 | |
|   };
 | |
| }
 |