Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
d1762fd
Add iter
jl-wynen Aug 25, 2021
56b5348
Depend on LLNL-Units from conan
jl-wynen Aug 25, 2021
adeb7b0
Handle pulse time offsets using only scipp
jl-wynen Aug 26, 2021
30ed490
Use new scipp API
jl-wynen Aug 26, 2021
e10db0d
Add Azure config for test deployment
jl-wynen Aug 27, 2021
f70b317
Add scipp remote for conan
jl-wynen Aug 27, 2021
8da54b3
Try avoid use of wrong channel?
SimonHeybrock Aug 27, 2021
385a390
Try to use correct conda channel
SimonHeybrock Aug 27, 2021
edd1c5b
Merge branch 'main' into scipp-0.8
SimonHeybrock Sep 2, 2021
d42e62e
Update gcc and env files
SimonHeybrock Sep 2, 2021
1d67334
Remove unused azure parameter
SimonHeybrock Sep 2, 2021
8e09d3b
Use different env for linux
SimonHeybrock Sep 2, 2021
70434b2
Use latest scipp in test envs
SimonHeybrock Sep 2, 2021
3169eb2
Don't use scipp/label/dev
SimonHeybrock Sep 2, 2021
a88c377
Specify languages for cmake
SimonHeybrock Sep 2, 2021
301ff26
Try random things to fix Windows
SimonHeybrock Sep 2, 2021
a717d3b
Revert "Try random things to fix Windows"
SimonHeybrock Sep 2, 2021
1f130c4
Fix pickleable_dict helpers for changes to sc.to_dict
SimonHeybrock Sep 3, 2021
63e5959
Update cmake and conda setup as in scipp
SimonHeybrock Sep 7, 2021
d18bac7
Merge remote-tracking branch 'origin/main' into scipp-0.8
SimonHeybrock Sep 7, 2021
e845604
Set DLL search paths
Tom-Willemsen Sep 7, 2021
db1ecbf
yapf
Tom-Willemsen Sep 7, 2021
f90831e
Set DLL paths at import time
Tom-Willemsen Sep 7, 2021
861a4b9
Merge pull request #156 from scipp/set_dll_search_paths
SimonHeybrock Sep 7, 2021
0015565
Also add scippneutron dll path
Tom-Willemsen Sep 7, 2021
1e10c74
Merge pull request #157 from scipp/add_dll_path_2
SimonHeybrock Sep 7, 2021
f55d592
Add TBB dll path?
Tom-Willemsen Sep 7, 2021
8e5fbfc
Merge pull request #158 from scipp/add_dll_path_3
SimonHeybrock Sep 7, 2021
9b3f4e1
Update build_conda.py
SimonHeybrock Sep 7, 2021
48c8588
Merge pull request #160 from scipp/Remove-bad-hyphen-in-wildcard
SimonHeybrock Sep 7, 2021
3a6cdb0
Merge branch 'main' into scipp-0.8
jl-wynen Sep 9, 2021
fc917ba
Update powder diffraction notebook
SimonHeybrock Sep 13, 2021
39acd1d
Pin ipykernel
SimonHeybrock Sep 13, 2021
4ac087c
Use keyword args in atan2
SimonHeybrock Sep 14, 2021
a446653
Missing keyword arg
SimonHeybrock Sep 14, 2021
c235e4c
Update another docs page
SimonHeybrock Sep 14, 2021
f69a7ea
More docs updates
SimonHeybrock Sep 14, 2021
5bff6fb
Update required scipp version to 0.8
SimonHeybrock Sep 14, 2021
1331817
Update release notes
SimonHeybrock Sep 14, 2021
9fd2246
Remove CI files for "units" pipeline
SimonHeybrock Sep 14, 2021
4580811
Update conda_build_config.yaml
SimonHeybrock Sep 14, 2021
7afd8fa
Make env without gxx
OwenArnold Sep 14, 2021
2125da9
Update docs/about/release-notes.rst
SimonHeybrock Sep 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .azure-pipelines/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ parameters:
displayName: Verbose
type: boolean
default: false
- name: scipp_channel
type: string
default: scipp

# Note: the 'endpoint' refers to the Azure service connection, which can be
# found on the Azure pipelines web interface under
Expand Down Expand Up @@ -43,7 +40,7 @@ extends:
conda_env: 'scippneutron-developer.yml'
osx:
py_versions: ['3.7']
conda_env: 'scippneutron-developer.yml'
conda_env: 'scippneutron-developer-osx.yml'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having all these different env files is becoming a nightmare to maintain. Is there really no alternative to having a new file which is 98% identical to the other env files? Aren't there tags you can add in env file if you want something install only on certain platforms? I thought we did this with some of the data streaming packages which don't install on windows.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See in the conda/meta.yaml file

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having all these different env files is becoming a nightmare to maintain.

Couldn't agree more. Added as item in scipp/scipp#2163.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See in the conda/meta.yaml file

I mainly made this change to ensure that we could complete the CI, i.e. scippneutron worked with 0.8. These only work with the recipe files as far as I can determine. https://conda-devenv.readthedocs.io/en/latest/usage.html is the only other solution i am aware of.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See note I just added in scipp/scipp#2163 (comment), might conda debug be a solution for creating the envs from meta.yml?

Copy link
Contributor

@OwenArnold OwenArnold Sep 15, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might conda debug be a solution for creating the envs from meta.yml?

It could work, but seems that you need to source the environment script from within a conda working directory, that is to say, it doesn't look like the most convenient thing to use as a developer, but I do like the fact that this might result in us being able to discard our environment files all-together.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you need to have a base env with (I presume) conda-build installed. But then something like this may work:

eval "$(conda debug -c conda-forge -a .)"

I suppose there could be a helper script shipped with the repo that does this.

windows:
py_versions: ['3.7']
conda_env: 'scippneutron-developer-no-mantid.yml'
Expand Down
2 changes: 1 addition & 1 deletion .azure-pipelines/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ extends:
conda_env: 'scippneutron-developer.yml'
osx:
py_versions: ['3.7']
conda_env: 'scippneutron-developer.yml'
conda_env: 'scippneutron-developer-osx.yml'
windows:
py_versions: ['3.7']
conda_env: 'scippneutron-developer-no-mantid.yml'
2 changes: 1 addition & 1 deletion .azure-pipelines/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ extends:
conda_env: 'scippneutron-developer.yml'
osx:
py_versions: ['3.7', '3.8']
conda_env: 'scippneutron-developer.yml'
conda_env: 'scippneutron-developer-osx.yml'
windows:
py_versions: ['3.7', '3.8']
conda_env: 'scippneutron-developer-no-mantid.yml'
Expand Down
12 changes: 10 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ execute_process(
OUTPUT_VARIABLE SCIPPNEUTRON_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
project(scippneutron VERSION ${SCIPPNEUTRON_VERSION})
project(
scippneutron
VERSION ${SCIPPNEUTRON_VERSION}
LANGUAGES CXX
)

if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
Expand Down Expand Up @@ -75,6 +79,9 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})

conan_cmake_autodetect(conan_settings)
conan_add_remote(
NAME scipp URL https://artifactoryconan.esss.dk/artifactory/api/conan/scipp
)
conan_cmake_install(
PATH_OR_REFERENCE ${CMAKE_SOURCE_DIR} SETTINGS ${conan_settings} BUILD
outdated
Expand All @@ -86,7 +93,8 @@ find_package(Eigen3 REQUIRED)
find_package(GTest CONFIG REQUIRED)
find_package(Python 3.7 REQUIRED COMPONENTS Interpreter Development)
find_package(pybind11 CONFIG REQUIRED)
find_package(scipp 0.7 REQUIRED)
find_package(scipp 0.8 REQUIRED)
find_package(LLNL-Units REQUIRED)

# MP : Parallel compile, add before any targets so all use it
add_compile_options($<$<CXX_COMPILER_ID:MSVC>:-MP>)
Expand Down
7 changes: 6 additions & 1 deletion cmake/scipp-install.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ function(scipp_install_component)
PARSE_ARGV 0 SCIPP_INSTALL_COMPONENT "${options}" "${oneValueArgs}" ""
)
if(DYNAMIC_LIB)
install(TARGETS ${SCIPP_INSTALL_COMPONENT_TARGET} EXPORT ${EXPORT_NAME})
install(
TARGETS ${SCIPP_INSTALL_COMPONENT_TARGET}
EXPORT ${EXPORT_NAME}
RUNTIME DESTINATION Lib/scippneutron
ARCHIVE DESTINATION Lib
)
install(DIRECTORY include/ DESTINATION ${INCLUDEDIR})
if(${SCIPP_INSTALL_COMPONENT_INSTALL_GENERATED})
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
Expand Down
7 changes: 6 additions & 1 deletion conanfile.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ benchmark/1.5.3
boost/1.76.0
eigen/3.3.9
gtest/1.11.0
LLNL-Units/0.5.0@scipp/stable
pybind11/2.6.2

[options]
benchmark:shared=False
boost:header_only=True
gtest:shared=False
benchmark:shared=False
LLNL-Units:shared=False
LLNL-Units:fPIC=True
LLNL-Units:base_type=uint64_t
LLNL-Units:namespace=llnl::units

[generators]
cmake_find_package_multi
2 changes: 1 addition & 1 deletion conda/conda_build_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ python:
- 3.7

scipp:
- 0.7
- 0.8
3 changes: 2 additions & 1 deletion conda/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ source:
requirements:
build:
- cmake
- gxx_linux-64 9.3.* [linux64]
- gxx_linux-64 11.1.* [linux64]
- git
- ninja
- python {{ python }}
Expand All @@ -26,6 +26,7 @@ test:
- neutron
requires:
- h5py
- ipykernel = 6.3.1 # see https://github.com/ipython/ipykernel/issues/771
- ipywidgets
- matplotlib-base
- psutil
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably need to pin scipp to 0.8 in the conda_build_config.yaml file.

Expand Down
26 changes: 16 additions & 10 deletions docs/about/release-notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
Release Notes
=============

Since v0.2.0
Since v0.3.0
------------

v0.3.0 (September 2021)
-----------------------

* ``load_nexus`` will read ub_matrix and orientation_matrix information from nexus files. Likewise, the Mantid converters will propagate the same information if present.

Features
Expand All @@ -16,14 +19,16 @@ Features
Breaking changes
~~~~~~~~~~~~~~~~

* `load_nexus` will now add a single TOF bin around event data

Contributors
~~~~~~~~~~~~

Owen Arnold,
Simon Heybrock,
Matthew D. Jones,
Neil Vaytet,
and Jan-Lukas Wynen
Owen Arnold :sup:`b, c`\ ,
Simon Heybrock :sup:`a`\ ,
Neil Vaytet :sup:`a`\ ,
Tom Willemsen :sup:`b, c`\ ,
and Jan-Lukas Wynen :sup:`a`\

v0.2.0 (June 2021)
-------------------
Expand Down Expand Up @@ -85,7 +90,8 @@ Breaking changes
Previously the conversion mode was determined automatically based on the presence of a ``sample_position`` coordinate.
This is error prone hidden/implicit behavior, which is now avoided.

Contributors
~~~~~~~~~~~~

Everyone contributing originally to ``scipp.neutron``.
Contributing Organizations
--------------------------
* :sup:`a`\ `European Spallation Source ERIC <https://europeanspallationsource.se/>`_, Sweden
* :sup:`b`\ `Science and Technology Facilities Council <https://www.ukri.org/councils/stfc/>`_, UK
* :sup:`c`\ `Tessella <https://www.tessella.com/>`_, UK
1 change: 1 addition & 0 deletions docs/environments/scippneutron-latest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ channels:
dependencies:
- ess-dmsc::ess-streaming-data-types
- h5py
- ipykernel = 6.3.1 # see https://github.com/ipython/ipykernel/issues/771
Copy link
Member

@nvaytet nvaytet Sep 15, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually don't think these files (in the environments folder) are used anywhere? It's probably safe to remove them?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah, that's what they are used for! Thanks!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And these won't work for windows, etc...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But once again we risk those being out of sync with https://github.com/scipp/scippneutron/blob/main/scippneutron-developer.yml and https://github.com/scipp/scippneutron/blob/main/scippneutron-developer-no-mantid.yml

Not really, because the purpose is different: The user-envs do not include dev dependencies. And valid versions for actual dependencies should be setup correctly in meta.yml so we do not have to re-specify this here. The user env files are basically just "get me scippneutron and useful basics (jupyterlab, ...)". The fact that they contain ipykernel now is because of the lack of proper pinning in our package, I think (or maybe just redundant, but I wanted to be on the safe side)?

- ipympl
- ipython
- ipywidgets
Expand Down
1 change: 1 addition & 0 deletions docs/environments/scippneutron.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ channels:
dependencies:
- ess-dmsc::ess-streaming-data-types
- h5py
- ipykernel = 6.3.1 # see https://github.com/ipython/ipykernel/issues/771
- ipympl
- ipython
- ipywidgets
Expand Down
7 changes: 2 additions & 5 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ Provides "unit conversions" and technique specific tools based on physics of (ti
News
----

- Just like scipp, scippneutron has switched from GPLv3 to the more permissive BSD-3 license which fits better into the Python eco system.
- [September 2021] `scipp-0.8 <https://scipp.github.io/about/release-notes.html#v0-8-0-september-2021>`_ has been released.
- [June 2021] `scippneutron-0.2 <https://scipp.github.io/scippneutron/about/release-notes.html#v0-2-0-june-2021>`_ has been released.
- [June 2021] `scipp-0.7 <https://scipp.github.io/about/release-notes.html#v0-7-0-june-2021>`_ has been released.
- [March 2021] `scippneutron-0.1 <https://scipp.github.io/scippneutron/about/release-notes.html#v0-1-0-march-2021>`_ has been released.
- [March 2021] `scipp-0.6 <https://scipp.github.io/about/release-notes.html#v0-6-0-march-2021>`_ has been released.
The `What's new <https://scipp.github.io/about/whats-new/whats-new-0.6.0.html>`_ notebook provides an overview of the highlights and major changes in both scipp and scippneutron.
- Just like scipp, scippneutron has switched from GPLv3 to the more permissive BSD-3 license which fits better into the Python eco system.

Where can I get help?
---------------------
Expand Down
4 changes: 2 additions & 2 deletions docs/tutorials/exploring-data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
Expand All @@ -401,7 +401,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
"version": "3.8.10"
}
},
"nbformat": 4,
Expand Down
42 changes: 27 additions & 15 deletions docs/tutorials/powder-diffraction.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@
"source": [
"sample.coords['two_theta'] = scn.two_theta(sample)\n",
"vanadium.coords['two_theta'] = scn.two_theta(vanadium)\n",
"two_theta_bins = sc.Variable(['two_theta'],\n",
"two_theta_bins = sc.Variable(dims=['two_theta'],\n",
" unit=sc.units.rad,\n",
" values=np.linspace(0.0, np.pi, num=2000))"
]
Expand Down Expand Up @@ -266,6 +266,23 @@
"mon"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We intend to normalize each event to the relative monitor counts (compared to the total monitor counts).\n",
"We use `sum` to compute the total monitor counts and obtain the relative counts using division:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mon /= mon.sum('wavelength')"
]
},
{
"cell_type": "markdown",
"metadata": {},
Expand Down Expand Up @@ -331,12 +348,9 @@
"metadata": {},
"outputs": [],
"source": [
"dspacing_bins = sc.Variable(\n",
" ['dspacing'],\n",
" values=np.arange(0.3, 2.0, 0.001),\n",
" unit=sc.units.angstrom)\n",
"hist = sc.Dataset({'sample':sc.histogram(dspacing_sample, dspacing_bins),\n",
" 'vanadium':sc.histogram(dspacing_vanadium, dspacing_bins)})\n",
"dspacing_bins = sc.arange(dim='dspacing', start=0.3, stop=2.0, step=0.001, unit=sc.units.angstrom)\n",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think arange falls into the category of position-only arguments because the meaning of the numerical arguments changes depending on how many there are. (Not including unit, of course.)

I mention this because someone had posted a link to position-only arguments at some point and it sounded like there was interest in them,

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only start appears to be position-only: arange(start, /, stop=None, step=1, *, dtype=None, device=None) in https://data-apis.org/array-api/latest/API_specification/creation_functions.html.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

start is used as stop if it's the only one that is specified

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. We need to decide how to handle those in our arange considering that we have the additional dimension arg. I personally, prefer not naming arguments of arange. But we can still make the docs reflect the current status of the API. So I am fine with leaving it.

"hist = sc.Dataset(data={'sample':sc.histogram(dspacing_sample, bins=dspacing_bins),\n",
" 'vanadium':sc.histogram(dspacing_vanadium, bins=dspacing_bins)})\n",
"sc.show(hist['spectrum', 0:3]['dspacing', 0:7])"
]
},
Expand Down Expand Up @@ -396,15 +410,13 @@
"metadata": {},
"outputs": [],
"source": [
"two_theta = sc.Variable(['two_theta'],\n",
" unit=sc.units.rad,\n",
" values=np.linspace(0.0, np.pi, num=16))\n",
"two_theta = sc.linspace(dim='two_theta', unit='rad', start=0.0, stop=np.pi, num=16)\n",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as arange above. And there are more cases in other notebooks.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

linspace(start, stop, /, num, *, dtype=None, device=None, endpoint=True) from Array API standard.

But we should also keep in mind that scipp requires an extra dim argument, so we cannot necessarily adopt this 1:1

"\n",
"focussed_sample = sc.groupby(dspacing_sample, 'two_theta', bins=two_theta).bins.concatenate('spectrum')\n",
"focussed_vanadium = sc.groupby(dspacing_vanadium, 'two_theta', bins=two_theta).bins.concatenate('spectrum')\n",
"norm = sc.histogram(focussed_vanadium, dspacing_bins)\n",
"norm = sc.histogram(focussed_vanadium, bins=dspacing_bins)\n",
"focussed_sample.bins /= sc.lookup(func=norm, dim='dspacing')\n",
"normalized = sc.histogram(focussed_sample, dspacing_bins)"
"normalized = sc.histogram(focussed_sample, bins=dspacing_bins)"
]
},
{
Expand All @@ -420,7 +432,7 @@
"metadata": {},
"outputs": [],
"source": [
"sc.plot(normalized, vmin=0, vmax=2)"
"sc.plot(normalized, vmin=sc.scalar(0), vmax=sc.scalar(0.4))"
]
},
{
Expand All @@ -447,7 +459,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
Expand All @@ -461,7 +473,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
"version": "3.8.10"
}
},
"nbformat": 4,
Expand Down
4 changes: 2 additions & 2 deletions docs/tutorials/working-with-masks.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@
"- Mask a scattering-angle ($\\theta$) range.\n",
" Hint: The scattering angle can be computed as `theta = 0.5 * scn.two_theta(data)`\n",
"- Mask a wedge.\n",
" Hint: `phi = sc.atan2(y,x)`"
" Hint: `phi = sc.atan2(y=y,x=x)`"
]
},
{
Expand All @@ -213,7 +213,7 @@
"theta = 0.5 * scn.two_theta(data)\n",
"data.masks['theta'] = (0.03 * sc.units.rad < theta) & (theta < 0.04 * sc.units.rad)\n",
"\n",
"phi = sc.atan2(y,x) * ((180.0 * sc.units.deg) / (np.pi * sc.units.rad))\n",
"phi = sc.atan2(y=y,x=x) * ((180.0 * sc.units.deg) / (np.pi * sc.units.rad))\n",
"data.masks['wedge'] = (10.0 * sc.units.deg < phi) & (phi < 20.0 * sc.units.deg)\n",
"\n",
"scn.instrument_view(sc.sum(data, 'tof'), norm='log')"
Expand Down
Loading