-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NameError: No providing class for property #133
Comments
This is possibly not very well explained in the current documentation but live calculations, such as the one you are trying to do, are not allowed to use particle data. Only the 'batch'-type database updates can access particle data. You should find that you can write |
I tried that and I'm still getting the same error. Specifically I am seeing the following (base) [luh60@astro ~]$ export TANGOS_PROPERTY_MODULES=testproperty
(base) [luh60@astro ~]$ tangos write mypropertyp
2021-01-28 21:51:58,907 : Processing <TimeStep 'tutorial_gadget/snapshot_010' z=6.07 t=0.94 Gyr>
Traceback (most recent call last):
File "/home/luh60/anaconda3/bin/tangos", line 8, in <module>
sys.exit(main())
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/scripts/__init__.py", line 49, in main
args.func(args)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/tools/__init__.py", line 54, in run
parallel_tasks.launch(obj.run_calculation_loop, 2, [])
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/parallel_tasks/__init__.py", line 56, in launch
function(*args)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/tools/property_writer.py", line 514, in run_calculation_loop
self.run_timestep_calculation(f_obj)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/tools/property_writer.py", line 458, in run_timestep_calculation
self._property_calculator_instances = properties.instantiate_classes(db_timestep.simulation, self.options.properties)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/properties/__init__.py", line 450, in instantiate_classes
instances.append(providing_class(property_identifier, handler_class, silent_fail)(simulation))
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/properties/__init__.py", line 405, in providing_class
raise NameError("No providing class for property " + property_name)
NameError: No providing class for property mypropertyp |
This must be a different problem I think. Do you see mypropertyp if you do tangos list-possible-properties? |
I get the following (base) [luh60@astro ~]$ tangos list-possible-properties
name | handler | property class
-------------------------------+-----------------+-------------------------------------------------------------
BH_central_distance | PynbodyInputHan | tangos.properties.pynbody.BH.BH
BH_central_offset | PynbodyInputHan | tangos.properties.pynbody.BH.BH
BH_mass | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mass | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mdot | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mdot | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mdot_ave | PynbodyInputHan | tangos.properties.pynbody.BH.BH
BH_mdot_histogram | HandlerBase | tangos.properties.pynbody.BH.BHAccHistogram
BH_mdot_histogram_all | PynbodyInputHan | tangos.properties.pynbody.BH.BHAccHistogramMerged
BH_mdot_std | PynbodyInputHan | tangos.properties.pynbody.BH.BH
NDM | live | tangos.properties.intrinsic.IntrinsicProperties
NGas | live | tangos.properties.intrinsic.IntrinsicProperties
NStar | live | tangos.properties.intrinsic.IntrinsicProperties
SFR_100Myr | PynbodyInputHan | tangos.properties.pynbody.SF.StarForm
SFR_10Myr | PynbodyInputHan | tangos.properties.pynbody.SF.StarForm
SFR_histogram | PynbodyInputHan | tangos.properties.pynbody.SF.StarFormHistogram
a | live | tangos.properties.intrinsic.IntrinsicProperties
at | live | tangos.properties.live_profiles.AtPosition
bh | live | tangos.properties.pynbody.BH.BHGal
bhcenter | live | tangos.properties.pynbody.BH.BHCentral
contamination_fraction | PynbodyInputHan | tangos.properties.pynbody.zoom.Contamination
dbid | live | tangos.properties.intrinsic.IntrinsicProperties
dm_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
dm_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
dm_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
dm_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
finder_dm_mass | PynbodyInputHan | tangos.properties.pynbody.mass.MassBreakdown
finder_gas_mass | PynbodyInputHan | tangos.properties.pynbody.mass.MassBreakdown
finder_id | live | tangos.properties.intrinsic.IntrinsicProperties
finder_mass | PynbodyInputHan | tangos.properties.pynbody.mass.Masses
finder_star_mass | PynbodyInputHan | tangos.properties.pynbody.mass.MassBreakdown
gas_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
gas_map | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
gas_map_faceon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
gas_map_sideon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
gas_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
halo_number | live | tangos.properties.intrinsic.IntrinsicProperties
max | live | tangos.properties.live_profiles.MaxMinProperty
max_radius | PynbodyInputHan | tangos.properties.pynbody.centring.CentreAndRadius
max_radius_comoving | live | tangos.properties.pynbody.centring.CentreAndRadiusComoving
mean_rho | PynbodyInputHan | tangos.properties.pynbody.gas.MeanGasProperties
mean_temp | PynbodyInputHan | tangos.properties.pynbody.gas.MeanGasProperties
min | live | tangos.properties.live_profiles.MaxMinProperty
path | live | tangos.properties.intrinsic.IntrinsicProperties
posmax | live | tangos.properties.live_profiles.MaxMinProperty
posmin | live | tangos.properties.live_profiles.MaxMinProperty
shrink_center | PynbodyInputHan | tangos.properties.pynbody.centring.CentreAndRadius
shrink_center_comoving | live | tangos.properties.pynbody.centring.CentreAndRadiusComoving
star_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
star_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
step_path | live | tangos.properties.intrinsic.IntrinsicProperties
t | live | tangos.properties.intrinsic.IntrinsicProperties
type | live | tangos.properties.intrinsic.IntrinsicProperties
uvi_image | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
uvi_image_faceon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
uvi_image_sideon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
z | live | tangos.properties.intrinsic.IntrinsicProperties
I am having issues with |
Yes, this confirms that tangos isn't importing your module. That's why you can't get tangos write to work either. Is the module definitely somewhere python can see it, eg in the folder you are executing from, or on your PYTHONPATH ? |
Yes I have the file Is tangos having issues finding |
Yes. To be sure you could try putting a print statement in myproperty.py so you can easily see if/when it gets found. I don't think tangos is finding it. |
I found the issue with Unfortunately I am still having issue with |
Are you saying Perhaps post the full code in your module, hopefully I can spot the issue. |
Ive renamed (base) [luh60@astro ~]$ export TANGOS_PROPERTY_MODULES=veldisp
(base) [luh60@astro ~]$ tangos write veldisp
2021-02-01 15:43:50,199 : Processing <TimeStep 'tutorial_gadget/snapshot_010' z=6.07 t=0.94 Gyr>
Traceback (most recent call last):
File "/home/luh60/anaconda3/bin/tangos", line 8, in <module>
sys.exit(main())
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/scripts/__init__.py", line 49, in main
args.func(args)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/tools/__init__.py", line 54, in run
parallel_tasks.launch(obj.run_calculation_loop, 2, [])
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/parallel_tasks/__init__.py", line 56, in launch
function(*args)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/tools/property_writer.py", line 514, in run_calculation_loop
self.run_timestep_calculation(f_obj)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/tools/property_writer.py", line 458, in run_timestep_calculation
self._property_calculator_instances = properties.instantiate_classes(db_timestep.simulation, self.options.properties)
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/properties/__init__.py", line 450, in instantiate_classes
instances.append(providing_class(property_identifier, handler_class, silent_fail)(simulation))
File "/home/luh60/anaconda3/lib/python3.8/site-packages/tangos/properties/__init__.py", line 405, in providing_class
raise NameError("No providing class for property " + property_name)
NameError: No providing class for property veldisp Here is what I had a little earlier - (base) [luh60@astro ~]$ export TANGOS_PROPERTY_MODULES=myproperty
(base) [luh60@astro ~]$ tangos write myproperty --for tutorial_changa
2021-02-01 15:42:33,509 : Processing <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000384' z=4.57 t=1.31 Gyr>
2021-02-01 15:42:33,626 : Gathering existing properties for all halos in timestep <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000384' z=4.57 t=1.31 Gyr>
2021-02-01 15:42:34,609 : Successfully gathered existing properties; calculating halo properties now...
2021-02-01 15:42:34,609 : 362 halos to consider; 1 property calculations for each of them
2021-02-01 15:42:34,656 : Done with <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000384' z=4.57 t=1.31 Gyr>
2021-02-01 15:42:34,677 : Succeeded: 362 property calculations
2021-02-01 15:42:34,677 : Errored: 0 property calculations
2021-02-01 15:42:34,677 : Errored during load: 0 property calculations
2021-02-01 15:42:34,678 : Already exists: 0 property calculations
2021-02-01 15:42:34,678 : Missing pre-requisite: 0 property calculations
2021-02-01 15:42:34,678 : Processing <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000448' z=4.03 t=1.53 Gyr>
2021-02-01 15:42:34,678 : Gathering existing properties for all halos in timestep <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000448' z=4.03 t=1.53 Gyr>
2021-02-01 15:42:35,680 : Successfully gathered existing properties; calculating halo properties now...
2021-02-01 15:42:35,680 : 408 halos to consider; 1 property calculations for each of them
2021-02-01 15:42:35,727 : Done with <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000448' z=4.03 t=1.53 Gyr>
2021-02-01 15:42:35,748 : Succeeded: 408 property calculations
2021-02-01 15:42:35,748 : Errored: 0 property calculations
2021-02-01 15:42:35,748 : Errored during load: 0 property calculations
2021-02-01 15:42:35,748 : Already exists: 0 property calculations
2021-02-01 15:42:35,748 : Missing pre-requisite: 0 property calculations
2021-02-01 15:42:35,749 : Processing <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000640' z=2.96 t=2.17 Gyr>
2021-02-01 15:42:35,749 : Gathering existing properties for all halos in timestep <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000640' z=2.96 t=2.17 Gyr>
2021-02-01 15:42:37,077 : Successfully gathered existing properties; calculating halo properties now...
2021-02-01 15:42:37,077 : 545 halos to consider; 1 property calculations for each of them
2021-02-01 15:42:37,157 : Done with <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000640' z=2.96 t=2.17 Gyr>
2021-02-01 15:42:37,178 : Succeeded: 545 property calculations
2021-02-01 15:42:37,178 : Errored: 0 property calculations
2021-02-01 15:42:37,178 : Errored during load: 0 property calculations
2021-02-01 15:42:37,178 : Already exists: 0 property calculations
2021-02-01 15:42:37,178 : Missing pre-requisite: 0 property calculations
2021-02-01 15:42:37,178 : Processing <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000832' z=2.32 t=2.82 Gyr>
2021-02-01 15:42:37,179 : Gathering existing properties for all halos in timestep <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000832' z=2.32 t=2.82 Gyr>
2021-02-01 15:42:38,778 : Successfully gathered existing properties; calculating halo properties now...
2021-02-01 15:42:38,778 : 666 halos to consider; 1 property calculations for each of them
2021-02-01 15:42:38,836 : Done with <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000832' z=2.32 t=2.82 Gyr>
2021-02-01 15:42:38,860 : Succeeded: 666 property calculations
2021-02-01 15:42:38,860 : Errored: 0 property calculations
2021-02-01 15:42:38,860 : Errored during load: 0 property calculations
2021-02-01 15:42:38,860 : Already exists: 0 property calculations
2021-02-01 15:42:38,860 : Missing pre-requisite: 0 property calculations
2021-02-01 15:42:38,860 : Processing <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000960' z=2.02 t=3.25 Gyr>
2021-02-01 15:42:38,861 : Gathering existing properties for all halos in timestep <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000960' z=2.02 t=3.25 Gyr>
2021-02-01 15:42:40,626 : Successfully gathered existing properties; calculating halo properties now...
2021-02-01 15:42:40,626 : 719 halos to consider; 1 property calculations for each of them
2021-02-01 15:42:40,707 : Done with <TimeStep 'tutorial_changa/pioneer50h128.1536gst1.bwK1.000960' z=2.02 t=3.25 Gyr>
2021-02-01 15:42:40,734 : Succeeded: 719 property calculations
2021-02-01 15:42:40,734 : Errored: 0 property calculations
2021-02-01 15:42:40,734 : Errored during load: 0 property calculations
2021-02-01 15:42:40,734 : Already exists: 0 property calculations
2021-02-01 15:42:40,734 : Missing pre-requisite: 0 property calculations
2021-02-01 15:42:40,734 : Attempting to commit 2700 halo properties...
2021-02-01 15:42:46,016 : 2700 properties were committed
2021-02-01 15:42:46,019 : CUMULATIVE RUNNING TIMES (just this node)
2021-02-01 15:42:46,020 : ExampleHaloProperty 0.0s | 100.0%
(base) [luh60@astro ~]$ tangos list-possible-properties
name | handler | property class
-------------------------------+-----------------+-------------------------------------------------------------
BH_central_distance | PynbodyInputHan | tangos.properties.pynbody.BH.BH
BH_central_offset | PynbodyInputHan | tangos.properties.pynbody.BH.BH
BH_mass | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mass | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mdot | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mdot | PynbodyInputHan | tangos.properties.pynbody.BH.BH
| EagleLikeInputH | tangos.properties.pynbody.eagle.EagleBH
BH_mdot_ave | PynbodyInputHan | tangos.properties.pynbody.BH.BH
BH_mdot_histogram | HandlerBase | tangos.properties.pynbody.BH.BHAccHistogram
BH_mdot_histogram_all | PynbodyInputHan | tangos.properties.pynbody.BH.BHAccHistogramMerged
BH_mdot_std | PynbodyInputHan | tangos.properties.pynbody.BH.BH
NDM | live | tangos.properties.intrinsic.IntrinsicProperties
NGas | live | tangos.properties.intrinsic.IntrinsicProperties
NStar | live | tangos.properties.intrinsic.IntrinsicProperties
SFR_100Myr | PynbodyInputHan | tangos.properties.pynbody.SF.StarForm
SFR_10Myr | PynbodyInputHan | tangos.properties.pynbody.SF.StarForm
SFR_histogram | PynbodyInputHan | tangos.properties.pynbody.SF.StarFormHistogram
a | live | tangos.properties.intrinsic.IntrinsicProperties
at | live | tangos.properties.live_profiles.AtPosition
bh | live | tangos.properties.pynbody.BH.BHGal
bhcenter | live | tangos.properties.pynbody.BH.BHCentral
contamination_fraction | PynbodyInputHan | tangos.properties.pynbody.zoom.Contamination
dbid | live | tangos.properties.intrinsic.IntrinsicProperties
dm_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
dm_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
dm_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
dm_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.HaloDensityProfile
| YtInputHandler | tangos.properties.yt.HaloDensityProfile
finder_dm_mass | PynbodyInputHan | tangos.properties.pynbody.mass.MassBreakdown
finder_gas_mass | PynbodyInputHan | tangos.properties.pynbody.mass.MassBreakdown
finder_id | live | tangos.properties.intrinsic.IntrinsicProperties
finder_mass | PynbodyInputHan | tangos.properties.pynbody.mass.Masses
finder_star_mass | PynbodyInputHan | tangos.properties.pynbody.mass.MassBreakdown
gas_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
gas_map | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
gas_map_faceon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
gas_map_sideon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
gas_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
halo_number | live | tangos.properties.intrinsic.IntrinsicProperties
max | live | tangos.properties.live_profiles.MaxMinProperty
max_radius | PynbodyInputHan | tangos.properties.pynbody.centring.CentreAndRadius
max_radius_comoving | live | tangos.properties.pynbody.centring.CentreAndRadiusComoving
mean_rho | PynbodyInputHan | tangos.properties.pynbody.gas.MeanGasProperties
mean_temp | PynbodyInputHan | tangos.properties.pynbody.gas.MeanGasProperties
min | live | tangos.properties.live_profiles.MaxMinProperty
myproperty | live | myproperty.ExampleHaloProperty
path | live | tangos.properties.intrinsic.IntrinsicProperties
posmax | live | tangos.properties.live_profiles.MaxMinProperty
posmin | live | tangos.properties.live_profiles.MaxMinProperty
shrink_center | PynbodyInputHan | tangos.properties.pynbody.centring.CentreAndRadius
shrink_center_comoving | live | tangos.properties.pynbody.centring.CentreAndRadiusComoving
star_density_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
star_mass_profile | PynbodyInputHan | tangos.properties.pynbody.profile.BaryonicHaloDensityProfile
step_path | live | tangos.properties.intrinsic.IntrinsicProperties
t | live | tangos.properties.intrinsic.IntrinsicProperties
type | live | tangos.properties.intrinsic.IntrinsicProperties
uvi_image | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
uvi_image_faceon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
uvi_image_sideon | PynbodyInputHan | tangos.properties.pynbody.images.BaryonicImages
z | live | tangos.properties.intrinsic.IntrinsicProperties
|
I'm afraid I don't understand that test and what you were hoping it to show. Please just post the code. If tangos is definitely importing the module but can't see the property then I can probably spot the problem. |
Below is the file from tangos.properties.pynbody import PynbodyPropertyCalculation
import numpy as np
class ExampleHaloProperty(PynbodyPropertyCalculation):
names = "veldisp"
def calculate(self, particle_data, existing_properties):
return np.std(particle_data['vel']) |
Thanks! I don't see any problem with this and I was able to make it work:
This confirms tangos can see the property. So I am not really sure what is going on in your case -- are you certain the |
@Mirror-Knight did you manage to solve this issue? |
Not yet. I'm suspecting the issue to be with the server I'm working on, considering its working on your end but not my end. I fully reinstalled anaconda, tangos and pynbody and still had the same issues. I'll try installing tangos and running things on my local linux machine some time over the next few days to see if that works |
I believe I've found a a makeshift solution. If I navigate to This seems like manually doing some process meant to be automated by tangos when I set the environment variable and such. |
Great - but that definitely shouldn't be necessary. It would be good if you find out where things are going wrong, but without direct access to your system I don't have any real suggestions for how to proceed. Hard to see how this inconsistent behaviour could arise! |
I'm running in to this issue as well. I'm running python 3.11.2 and commit 3067d93 for tangos. I did exactly what you showed in your February 2nd comment, and I do not see the veldisp as an available property. I'm going to look into debugging this a bit to try and get to the bottom of it. |
Alright, I've found the source of the issue and a workaround. The issue is that in |
Thanks Ben! But doesn't python always pick up modules in the current working directory? (Source: https://docs.python.org/3/tutorial/modules.html#the-module-search-path) This is how it seems to behave for me. I'm confused... |
I don't think it does prepend the current working default to It looks like keeping the current working directory in If I run this in the REPL it prints
But if I write those lines to a script ( |
I'm a beginner and I'm trying to write some simple properties to calculate for the tutorial data. I am running into the following error when I define a property that requires particle data
The property I'm testing is the property provided in the example (velocity dispersion). I named it "mypropertyp" since I have another "myproperty" that just returns 42 (another example provided in the tutorial docs)
In this case my code is simply
This issue does not arise when pynbody particle data is not called. I have also tried adding my testproperty2.py to tangos by setting the environment variable TANGOS_PROPERTY_MODULES but that has not worked for me. Also when I tried to run the following
I would still get the same NameError. I am running tangos on a remote server (specifically the McMaster Astro server).
Thanks
The text was updated successfully, but these errors were encountered: