#
06f8874f |
| 24-Oct-2024 |
George Liu <liuxiwei@ieisystem.com> |
Fix create sensor failure after process restart
When the virtual-sensor process is intentionally restarted, the createVirtualSensors method will only create sensors with Type equal to ModifiedMedian
Fix create sensor failure after process restart
When the virtual-sensor process is intentionally restarted, the createVirtualSensors method will only create sensors with Type equal to ModifiedMedian, so if other types of sensors (eg: Sum, Minimum, Maximum, etc.) are configured in EM.json, they will not be loaded.
This commit will remove the `Type` and create the sensor by traversing the calculationIfaces when parsing to 'Config: D-Bus'.
Change-Id: I4a22bd2eef26e745e770acb260616374b5aba89b Signed-off-by: George Liu <liuxiwei@ieisystem.com>
show more ...
|
#
d98174e9 |
| 25-Oct-2024 |
George Liu <liuxiwei@ieisystem.com> |
Add the main.cpp file
Separate the main method from virtualSensor.cpp and add it to the main.cpp file.
Change-Id: Ife3dd9bb6dee552d944399bcc769fc6c4ba54a4b Signed-off-by: George Liu <liuxiwei@ieisy
Add the main.cpp file
Separate the main method from virtualSensor.cpp and add it to the main.cpp file.
Change-Id: Ife3dd9bb6dee552d944399bcc769fc6c4ba54a4b Signed-off-by: George Liu <liuxiwei@ieisystem.com>
show more ...
|
#
7f41a0d4 |
| 28-Aug-2024 |
George Liu <liuxiwei@ieisystem.com> |
Refactor virtual sensor calculation logic
Refactor the calculation method to calculate.cpp and use std::map instead of std::array, and other algorithms will be added to calculate.cpp in the future.
Refactor virtual sensor calculation logic
Refactor the calculation method to calculate.cpp and use std::map instead of std::array, and other algorithms will be added to calculate.cpp in the future.
Signed-off-by: George Liu <liuxiwei@ieisystem.com> Change-Id: I6dcf5119140a5acdf334ebb280dd0b458da1e3ea
show more ...
|
#
a630f081 |
| 28-Aug-2024 |
George Liu <liuxiwei@ieisystem.com> |
Remove DEBUG flag
Since lg2 already supports the debug log level and the log level can be modified in journald-maxlevel-policy.conf [1], there is no need to add the DEBUG flag in this repo.
[1]: ht
Remove DEBUG flag
Since lg2 already supports the debug log level and the log level can be modified in journald-maxlevel-policy.conf [1], there is no need to add the DEBUG flag in this repo.
[1]: https://github.com/openbmc/openbmc/blob/master/meta-phosphor/recipes-core/systemd/phosphor-systemd-policy/journald-maxlevel-policy.conf
Signed-off-by: George Liu <liuxiwei@ieisystem.com> Change-Id: I8a4a0564707478b8f8fdbbd128a2e2f7908c2ce6
show more ...
|
#
150d5f6a |
| 16-Aug-2024 |
Patrick Williams <patrick@stwcx.xyz> |
clang-format: re-format for clang-18
clang-format-18 isn't compatible with the clang-format-17 output, so we need to reformat the code with the latest version. The way clang-18 handles lambda forma
clang-format: re-format for clang-18
clang-format-18 isn't compatible with the clang-format-17 output, so we need to reformat the code with the latest version. The way clang-18 handles lambda formatting also changed, so we have made changes to the organization default style format to better handle lambda formatting.
See I5e08687e696dd240402a2780158664b7113def0e for updated style. See Iea0776aaa7edd483fa395e23de25ebf5a6288f71 for clang-18 enablement.
Change-Id: I85f99c9dfb356b15f40667aa920fbaff1af015a3 Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
show more ...
|
#
9358f6bd |
| 14-Mar-2024 |
Konstantin Aladyshev <aladyshev22@gmail.com> |
Add fan_pwm to the possible sensors
Add fan PWM output to the list of supported sensor types.
Change-Id: Ia0c7970934fe403d4e6e0142af78b7815bcff0c9 Signed-off-by: Konstantin Aladyshev <aladyshev22@g
Add fan_pwm to the possible sensors
Add fan PWM output to the list of supported sensor types.
Change-Id: Ia0c7970934fe403d4e6e0142af78b7815bcff0c9 Signed-off-by: Konstantin Aladyshev <aladyshev22@gmail.com>
show more ...
|
#
f2e94221 |
| 31-Oct-2023 |
Tao Lin <lintao.lc@ieisystem.com> |
UpdateVirtualSensor uses information from signals
UpdateVirtualSensor uses information obtained from signals to avoid extensive dbus queries.
Tested: 1:Execute DBus cmd to see if VirtualSensor can
UpdateVirtualSensor uses information from signals
UpdateVirtualSensor uses information obtained from signals to avoid extensive dbus queries.
Tested: 1:Execute DBus cmd to see if VirtualSensor can correctly obtain the value of DbusSensor busctl tree xyz.openbmc_project.VirtualSensor busctl introspect xyz.openbmc_project.VirtualSensor xxx 2:Waiting for the value change of DbusSensor,Check if the value of the virtual sensor has changed after the dbusSensor changes.
Fixes openbmc/phosphor-virtual-sensor#1
Change-Id: If11f9017b31ce5cf06f910a38c65637c55d74b24 Signed-off-by: Tao Lin <lintao.lc@ieisystem.com>
show more ...
|
#
ae10c529 |
| 20-Oct-2023 |
Patrick Williams <patrick@stwcx.xyz> |
clang-format: copy latest and re-format
clang-format-17 has some backwards incompatible changes that require additional settings for best compatibility and re-running the formatter. Copy the latest
clang-format: copy latest and re-format
clang-format-17 has some backwards incompatible changes that require additional settings for best compatibility and re-running the formatter. Copy the latest .clang-format from the docs repository and reformat the repository.
Change-Id: I2c290b16ee59b4768ba96642db5c9317b8311ba3 Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
show more ...
|
#
c77b6b3f |
| 08-Jun-2023 |
Lei YU <yulei.sh@bytedance.com> |
exprkt: Add ifNan to ignore the NaN value
Arithmetic with `nan` values is not expected in virtual sensor's case.
Adding a new exprkt function `ifNan` to handle this case, that if a value is `nan`,
exprkt: Add ifNan to ignore the NaN value
Arithmetic with `nan` values is not expected in virtual sensor's case.
Adding a new exprkt function `ifNan` to handle this case, that if a value is `nan`, then use the other value.
Example usage in json config: ``` "Expression": "ifNan(maxIgnoreNaN(T0, T1), T2)" ```
The above expression get max value of T0, T1 ignoring nan, and if it's still nana, it uses the value T2.
Signed-off-by: Lei YU <yulei.sh@bytedance.com> Change-Id: Ib323f6e18ef9f3317437753018857ad53732f54b
show more ...
|
#
87d35115 |
| 24-Oct-2022 |
Lei YU <yulei.sh@bytedance.com> |
exprkt: Add sumIgnoreNaN to ignore the NaN value
Arithmetic with `nan` values is not expected in virtual sensor's case.
Adding a new exprkt function `sumIgnoreNaN` to handle this case, that it igno
exprkt: Add sumIgnoreNaN to ignore the NaN value
Arithmetic with `nan` values is not expected in virtual sensor's case.
Adding a new exprkt function `sumIgnoreNaN` to handle this case, that it ignores all `nan` values. If all values are `nan` then it returns `nan`, otherwise it returns the sum of the valid values.
Example usage in json config: ``` "Expression": "sumIgnoreNaN(T0, T1, T2, T3)" ```
Signed-off-by: Lei YU <yulei.sh@bytedance.com> Change-Id: I0cbd87f038499b4ea3ab722c003adc795a11c2b3
show more ...
|
#
0ab9d838 |
| 19-Jul-2022 |
Lei YU <yulei.sh@bytedance.com> |
exprkt: Add maxIgnoreNaN to ignore the NaN value
The max function in exprtk uses std::max() to get the max value. Comparing a value with nan has special rule and is not expected in virtual sensor's
exprkt: Add maxIgnoreNaN to ignore the NaN value
The max function in exprtk uses std::max() to get the max value. Comparing a value with nan has special rule and is not expected in virtual sensor's case. E.g. `max(nan, 1)` gives `nan`.
Adding a new exprkt function `maxIgnoreNaN` to handle the above case so that it ignores all `nan` values. If all values are `nan` then it returns `nan`, otherwise it returns the max value of the valid values.
Example usage in json config: ``` "Expression": "maxIgnoreNaN(T0, T1, T2, T3)" ```
Signed-off-by: Lei YU <yulei.sh@bytedance.com> Change-Id: Idd345cd2ce325e5a186b9816458ba3d3bc66a187
show more ...
|
#
2db8d41f |
| 21-Aug-2023 |
George Liu <liuxiwei@inspur.com> |
Optimize the createVirtualSensorsFromDBus method logic
Signed-off-by: George Liu <liuxiwei@inspur.com> Change-Id: I56a7a229a8d5a6f414b2ba036627e4e7a8185bbd
|
#
94921490 |
| 21-Aug-2023 |
George Liu <liuxiwei@inspur.com> |
hardcode dbus name
The busName variable is only used as the request_name parameter in the main method, so there is no need to explicitly declare a static variable.
Signed-off-by: George Liu <liuxiw
hardcode dbus name
The busName variable is only used as the request_name parameter in the main method, so there is no need to explicitly declare a static variable.
Signed-off-by: George Liu <liuxiwei@inspur.com> Change-Id: Ice0ef649e6bb648707bd36687fafdeb095254e40
show more ...
|
#
1226f208 |
| 10-May-2023 |
Patrick Williams <patrick@stwcx.xyz> |
clang-format: copy latest and re-format
clang-format-16 has some backwards incompatible changes that require additional settings for best compatibility and re-running the formatter. Copy the latest
clang-format: copy latest and re-format
clang-format-16 has some backwards incompatible changes that require additional settings for best compatibility and re-running the formatter. Copy the latest .clang-format from the docs repository and reformat the repository.
Change-Id: Ia9a79a850d4ae8d576f052bb552a83429b792ddb Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
show more ...
|
#
32dff21b |
| 09-Feb-2023 |
Patrick Williams <patrick@stwcx.xyz> |
config-file: search multiple directories
Restricting the config file to `/usr/share` makes testing difficult and prevents the config file from being present on a, typically for the BMC, read-write v
config-file: search multiple directories
Restricting the config file to `/usr/share` makes testing difficult and prevents the config file from being present on a, typically for the BMC, read-write volume. Change the config loading code to search:
1. pwd 2. /var/lib/phosphor-virtual-sensor 3. /usr/share/phosphor-virtual-sensor
Tested:
Ran strace on the changes and observed the expected file search. ``` getcwd("pwd/phosphor-virtual-sensor/builddir", 4096) = 75 newfstatat(AT_FDCWD, "pwd/phosphor-virtual-sensor/builddir/virtual_sensor_config.json", 0x7fff60a0af90, 0) = -1 ENOENT (No such file or directory) newfstatat(AT_FDCWD, "/var/lib/phosphor-virtual-sensor/virtual_sensor_config.json", 0x7fff60a0af90, 0) = -1 ENOENT (No such file or directory) newfstatat(AT_FDCWD, "/usr/share/phosphor-virtual-sensor/virtual_sensor_config.json", 0x7fff60a0af90, 0) = -1 ENOENT (No such file or directory) ```
Signed-off-by: Patrick Williams <patrick@stwcx.xyz> Change-Id: I70854d565a3b13cd48c27a80da84de54c00a0603
show more ...
|
#
a291ce1a |
| 06-Feb-2023 |
Matt Spinler <spinler@us.ibm.com> |
Fixes around persisting values in entity-manager
This fixes three problems that were causing "Faild to set dbus property." error traces to show up.
1. In VirtualSensor::createThresholds() the setEn
Fixes around persisting values in entity-manager
This fixes three problems that were causing "Faild to set dbus property." error traces to show up.
1. In VirtualSensor::createThresholds() the setEntityPath() and setEntityInterfaceHigh/Low() calls have to be made on the threshold objects before the critical/warning/High/Low() functions are called so that the path and interface is known for the property set call. Reorder the code so this is the case.
2. Saving the value in entity-manager only works when the virtual sensor config was obtained from entity-manager D-Bus objects, and not when it was obtained from virtual_sensor_config.json. In the latter case, the 'entityPath' variable won't have a value, so check for that before trying to set a property on entity-manager.
3. If either a 'high' or 'low' threshold property isn't set, then the 'entityInterfaceHigh/Low' variable will be empty. Also skip the property write in that case.
Tested: No more error traces, and verified that changing a threshold value on a virtual sensor is still reflected in entity-manager when its config was from EM in the first place.
Change-Id: I67dc35fb4b8f4c1367231e22ddde91fbd1bb354d Signed-off-by: Matt Spinler <spinler@us.ibm.com>
show more ...
|
#
f6b7e0a4 |
| 08-Oct-2022 |
Tao Lin <lintao.lc@inspur.com> |
Add func for Maximum when sensor from DBus
Add function to calculate the maximum value.
Tested: in entity-manager/baseboard.json: add virtual sensor use Type=Maximum: ``` { "Exposes": [
Add func for Maximum when sensor from DBus
Add function to calculate the maximum value.
Tested: in entity-manager/baseboard.json: add virtual sensor use Type=Maximum: ``` { "Exposes": [ { "Name": "NVMe MAX Temp", "Sensors": [ "NVMe 0 Temp", "NVMe 1 Temp", "NVMe 2 Temp", "NVMe 3 Temp", "NVMe 4 Temp" ], "Thresholds": [ { "Direction": "greater than", "Name": "upper critical", "Severity": 1, "Value": 116 }, { "Direction": "less than", "Name": "lower critical", "Severity": 1, "Value": 1 } ], "Type": "Maximum", "Units": "DegreesC" } ], "Logging": "Off", "Name": "NVMe MAX", "Probe": "TRUE", "Type": "NVMe", "xyz.openbmc_project.Inventory.Item.Chassis": {} } ```
in phosphor-virtual-sensor/virtual_sensor_config.json ``` { "Desc": { "Config": "D-Bus", "Type": "Maximum" } } ```
root@NULL:~# busctl tree xyz.openbmc_project.VirtualSensor `-/xyz `-/xyz/openbmc_project `-/xyz/openbmc_project/sensors/temperature |-/xyz/openbmc_project/sensors/temperature/NVMe_MAX_Temp root@NULL:~# ipmitool sensor list | grep -i NVMe NVMe_MAX_Temp |70| degrees C |na| na|1.000|6.000|111.000|116.000|na root@NULL:~#
Signed-off-by: Tao Lin <lintao.lc@inspur.com> Change-Id: I620a0ee3c3cc4dbae6485c77fe4e47c62a04a804
show more ...
|
#
91799dbd |
| 27-Jul-2022 |
Tao Lin <lintao.lc@inspur.com> |
Update threshold to entity-manager
Save path&interface when creating thresholds,and then set DBUS value corresponding to path&interface when setting thresholds;
I have a requirement to set the thre
Update threshold to entity-manager
Save path&interface when creating thresholds,and then set DBUS value corresponding to path&interface when setting thresholds;
I have a requirement to set the threshold to restart without losing. In addition, I can see that the threshold can be saved in the file in the entity-manager, which can meet my requirements.
Data flow: Old version: IPMI set threshold -> virtualsensors (DBUS) What I want to achieve: IPMI set threshold -> virtualsensors (DBUS) -> filesystem
I found that it can be implemented as follows: IPMI set threshold -> virtual-sensors (DBUS) -> entitymanager -> filesystem
Because the threshold setting in dbus-sensors is: IPMI set threshold -> dbus-sensors (DBUS) -> entitymanager -> filesystem
Tested:
The following print result shows this process: IPMI set threshold -> virtual sensors (DBUS) -> entitymanager
root@NULL:~# busctl introspect xyz.openbmc_project.EntityManager /xyz/openbmc_project/inventory/system/nvme/NVMe_MAX/NVMe_MAX_Temp xyz.openbmc_project.Configuration.ModifiedMedian.Thresholds0 NAME TYPE SIGNATURE RESULT/VALUE FLAGS .Delete method - - - .Direction property s "greater than" emits-change writable .Name property s "upper critical" emits-change writable .Severity property d 1 emits-change writable .Value property d 116 emits-change writable root@NULL:~# ipmitool sensor list | grep NVM NVMe_MAX_Temp | na | degrees C | na | na | 1.000 | 6.000 | 111.000 | 116.000 | na root@NULL:~# ipmitool sensor thresh NVMe_MAX_Temp ucr 119 Locating sensor record 'NVMe_MAX_Temp'... Setting sensor "NVMe_MAX_Temp" Upper Critical threshold to 119.000 root@NULL:~# ipmitool sensor list | grep NVM NVMe_MAX_Temp | na | degrees C | na | na | 1.000 | 6.000 | 111.000 | 119.000 | na root@NULL:~# busctl introspect xyz.openbmc_project.EntityManager /xyz/openbmc_project/inventory/system/nvme/NVMe_MAX/NVMe_MAX_Temp xyz.openbmc_project.Configuration.ModifiedMedian.Thresholds0 NAME TYPE SIGNATURE RESULT/VALUE FLAGS .Delete method - - - .Direction property s "greater than" emits-change writable .Name property s "upper critical" emits-change writable .Severity property d 1 emits-change writable .Value property d 119 emits-change writable root@NULL:~# busctl introspect xyz.openbmc_project.EntityManager /xyz/openbmc_project/inventory/system/nvme/NVMe_MAX/NVMe_MAX_Temp xyz.openbmc_project.Configuration.ModifiedMedian.Thresholds0 NAME TYPE SIGNATURE RESULT/VALUE FLAGS .Delete method - - - .Direction property s "greater than" emits-change writable .Name property s "upper critical" emits-change writable .Severity property d 1 emits-change writable .Value property d 119 emits-change writable root@NULL:~#
Signed-off-by: Tao Lin <lintao.lc@inspur.com> Change-Id: I0f5eeb06d0b3aaf4f5806bfa68672dedcb087f26
show more ...
|
#
71b9c116 |
| 18-Oct-2022 |
Matt Spinler <spinler@us.ibm.com> |
Throw the exception on the EM D-Bus fail
Throw the exception that occurs when there is a D-Bus failure when trying to talk to entity-manager instead of the name of the exception, and also add a trac
Throw the exception on the EM D-Bus fail
Throw the exception that occurs when there is a D-Bus failure when trying to talk to entity-manager instead of the name of the exception, and also add a trace that says entity-manager is the culprit.
Nothing was actually printing the exception name on the crash, it would just have: terminate called after throwing an instance of 'char const*'
Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I91eb65468a9a799bcd7256aae24a1121164b59b9
show more ...
|
#
f7ec40aa |
| 04-Oct-2022 |
Ed Tanous <edtanous@google.com> |
Move objectmanager into the PDI-specified location
PDI specifies that the ObjectManager for sensors should be hosted at the sensor root. This commit makes that a reality.
Tested: Could use some he
Move objectmanager into the PDI-specified location
PDI specifies that the ObjectManager for sensors should be hosted at the sensor root. This commit makes that a reality.
Tested: Could use some help here. I don't use phosphor-virtual-sensors, but other similar changes made to other daemons have been tested, along with the other patches in this topic.
[1] https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Sensor/Value.interface.yaml#L18
Signed-off-by: Ed Tanous <edtanous@google.com> Change-Id: I45cead6eaa841140dd88364131b94d628ccfdaa8
show more ...
|
#
f6825b91 |
| 20-Sep-2022 |
Nan Zhou <nanzhoumails@gmail.com> |
virtualSensor: change EM's ObjectManager path
EntityManager moves its ObjectManager in commit [1], this patch is to change accordingly. Please see [1] for why we made that change.
[1] https://gerri
virtualSensor: change EM's ObjectManager path
EntityManager moves its ObjectManager in commit [1], this patch is to change accordingly. Please see [1] for why we made that change.
[1] https://gerrit.openbmc.org/c/openbmc/entity-manager/+/57279
Tested: code compiles. I don't have a system with this repo enabled. But code inspection can show that only ObjectManager path changed.
Signed-off-by: Nan Zhou <nanzhoumails@gmail.com> Change-Id: Ib5460433558d9d9d5e12465fe3d78a92159c573b
show more ...
|
#
dc777015 |
| 27-Jul-2022 |
Tao Lin <lintao.lc@inspur.com> |
Association not created when sensors from DBus
Save the path when create virtual sensors from DBus. Main functions after saving: * Set the threshold on the path corresponding to entity-manager * Cre
Association not created when sensors from DBus
Save the path when create virtual sensors from DBus. Main functions after saving: * Set the threshold on the path corresponding to entity-manager * Create an association
I found that the sensor created by reading virtual_sensor_config.json will create association. However,the virtual sensor created from DBus has no association, so I added this. In this way, my web/redfish can display this virtual sensor.
``` root@NULL:~# busctl introspect xyz.openbmc_project.VirtualSensor /xyz/openbmc_project/sensors/temperature/NVMe_MAX_Temp xyz.openbmc_project.Association.Definitions NAME TYPE SIGNATURE RESULT/VALUE FLAGS .Associations property a(sss) 1 "chassis" "all_sensors" "/xyz/openbmc_project/inventory/system/nvme/NVMe_MAX" emits-change writable ```
The BMC web will find my all_sensor according to the following steps:
``` root@NULL:~# busctl call xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/object_mapper xyz.openbmc_project.ObjectMapper GetSubTreePaths sias /xyz/openbmc_project/inventory 0 2 xyz.openbmc_project.Inventory.Item.Board xyz.openbmc_project.Inventory.Item.Chassis --verbose MESSAGE "as" { ARRAY "s" { STRING "/xyz/openbmc_project/inventory/system/board/FP5280G2_Motherboard"; STRING "/xyz/openbmc_project/inventory/system/chassis"; STRING "/xyz/openbmc_project/inventory/system/nvme/NVMe_MAX"; }; };
root@NULL:~# busctl call xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/inventory/system/nvme/NVMe_MAX/all_sensors org.freedesktop.DBus.Properties Get ss xyz.openbmc_project.Association endpoints --verbose MESSAGE "v" { VARIANT "as" { ARRAY "s" { STRING "/xyz/openbmc_project/sensors/temperature/NVMe_MAX_Temp"; }; }; }; ```
Signed-off-by: Tao Lin <lintao.lc@inspur.com> Change-Id: I5ab8ce532dde9cff837f85d1e27a0a420942a8ce
show more ...
|
#
e667239d |
| 02-Sep-2022 |
Patrick Williams <patrick@stwcx.xyz> |
remove dependency on sdeventplus
This repository doesn't really use sdeventplus, other than for running the dbus-loop, but there is already trivial code in sdbusplus for that. Simplify and remove t
remove dependency on sdeventplus
This repository doesn't really use sdeventplus, other than for running the dbus-loop, but there is already trivial code in sdbusplus for that. Simplify and remove the dependency.
Signed-off-by: Patrick Williams <patrick@stwcx.xyz> Change-Id: I8af7ad87a4fd87df400e810941fe58e412aedb24
show more ...
|
#
26959667 |
| 28-Jul-2022 |
George Liu <liuxiwei@inspur.com> |
Update to latest clang-format
Refer:https://github.com/openbmc/docs/blob/ac5d544553934f8083c61c5986a1420261bc8a4c/style/cpp/.clang-format
Signed-off-by: George Liu <liuxiwei@inspur.com> Change-Id:
Update to latest clang-format
Refer:https://github.com/openbmc/docs/blob/ac5d544553934f8083c61c5986a1420261bc8a4c/style/cpp/.clang-format
Signed-off-by: George Liu <liuxiwei@inspur.com> Change-Id: I80f24d12c18074b3294b158c2a2a515d548aa0e1
show more ...
|
#
8e11cccb |
| 22-Jul-2022 |
Patrick Williams <patrick@stwcx.xyz> |
sdbusplus: use shorter type aliases
The sdbusplus headers provide shortened aliases for many types. Switch to using them to provide better code clarity and shorter lines. Possible replacements are
sdbusplus: use shorter type aliases
The sdbusplus headers provide shortened aliases for many types. Switch to using them to provide better code clarity and shorter lines. Possible replacements are for: * bus_t * exception_t * manager_t * match_t * message_t * object_t * slot_t
Signed-off-by: Patrick Williams <patrick@stwcx.xyz> Change-Id: I8c73d8de128b218ee4885a5e133314ad5d9a0ff8
show more ...
|