103 lines
20 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

DEBUG  tests.conftest:conftest.py:51 Running fixture setup: test_id
DEBUG  tests.conftest:conftest.py:57 Running test: test_publish_on_multiple_content_topics_and_only_after_fetch_them[content_topic_list1] with id: 2026-03-12_04-38-47__e9b0d828-2d45-4038-8d71-2fe384cab304
DEBUG  src.steps.common:common.py:19 Running fixture setup: common_setup
DEBUG  src.steps.relay:relay.py:28 Running fixture setup: relay_setup
DEBUG  src.steps.sharding:sharding.py:30 Running fixture setup: sharding_setup
DEBUG  src.node.docker_mananger:docker_mananger.py:19 Docker client initialized with image wakuorg/nwaku:latest
DEBUG  src.node.waku_node:waku_node.py:86 WakuNode instance initialized with log path ./log/docker/node1_2026-03-12_04-38-47__e9b0d828-2d45-4038-8d71-2fe384cab304__wakuorg_nwaku:latest.log
DEBUG  src.node.waku_node:waku_node.py:90 Starting Node...
DEBUG  src.node.docker_mananger:docker_mananger.py:22 Attempting to create or retrieve network waku
DEBUG  src.node.docker_mananger:docker_mananger.py:25 Network waku already exists
DEBUG  src.node.docker_mananger:docker_mananger.py:108 Generated random external IP 172.18.156.18
DEBUG  src.node.docker_mananger:docker_mananger.py:101 Generated ports ['7262', '7263', '7264', '7265', '7266']
DEBUG  src.node.waku_node:waku_node.py:439 RLN credentials were not set
INFO  src.node.waku_node:waku_node.py:176 RLN credentials not set or credential store not available, starting without RLN
DEBUG  src.node.waku_node:waku_node.py:178 Using volumes []
DEBUG  src.node.docker_mananger:docker_mananger.py:49 docker run -i -t -p 7262:7262 -p 7263:7263 -p 7264:7264 -p 7265:7265 -p 7266:7266 wakuorg/nwaku:latest --listen-address=0.0.0.0 --rest=true --rest-admin=true --websocket-support=true --log-level=TRACE --rest-relay-cache-capacity=100 --websocket-port=7264 --rest-port=7262 --tcp-port=7263 --discv5-udp-port=7265 --rest-address=0.0.0.0 --nat=extip:172.18.156.18 --peer-exchange=true --discv5-discovery=true --cluster-id=2 --nodekey=a6f1ae9e1f41808bb1327d67f0f307ac2de3aa5f3bf8f20ddbc1be5ba5dcdfa3 --shard=0 --metrics-server=true --metrics-server-address=0.0.0.0 --metrics-server-port=7266 --metrics-logging=true --relay=true --filter=true --content-topic=/myapp/1/latest/proto --num-shards-in-network=8
ERROR  src.node.docker_mananger:docker_mananger.py:89 Max retries reached for container 50efa2f2b756. Exiting log stream.
DEBUG  src.node.docker_mananger:docker_mananger.py:55 docker network connect --ip 172.18.156.18 waku 80c040f5cc7107507fa4e98d13af87c056e8c09c555ef9db97abb5fa97fc769b
DEBUG  src.node.docker_mananger:docker_mananger.py:58 Container started with ID 80c040f5cc71. Setting up logs at ./log/docker/node1_2026-03-12_04-38-47__e9b0d828-2d45-4038-8d71-2fe384cab304__wakuorg_nwaku:latest.log
DEBUG  src.node.waku_node:waku_node.py:190 Started container from image wakuorg/nwaku:latest. REST: 7262
DEBUG  src.libs.common:common.py:47 Sleeping for 1 seconds
ERROR  src.node.docker_mananger:docker_mananger.py:89 Max retries reached for container dc12f1f5d8f1. Exiting log stream.
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:7262/health" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"nodeHealth":"INITIALIZING","connectionStatus":"Disconnected","protocolsHealth":[]}'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:7262/health" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"nodeHealth":"READY","connectionStatus":"PartiallyConnected","protocolsHealth":[{"Relay":"READY"},{"Lightpush":"NOT_MOUNTED"},{"Legacy Lightpush":"NOT_MOUNTED"},{"Filter":"READY"},{"Store":"NOT_MOUNTED"},{"Legacy Store":"NOT_MOUNTED"},{"Peer Exchange":"READY"},{"Rendezvous":"NOT_READY","desc":"No Rendezvous peers are available yet"},{"Mix":"NOT_MOUNTED"},{"Lightpush Client":"READY"},{"Legacy Lightpush Client":"READY"},{"Store Client":"READY"},{"Legacy Store Client":"NOT_READY","desc":"No Legacy Store service peers are available yet, neither Store service set up for the node"},{"Filter Client":"READY"},{"Rln Relay":"NOT_MOUNTED"}]}'
INFO  src.node.waku_node:waku_node.py:287 Node protocols are initialized !!
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:7262/debug/v1/info" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"listenAddresses":["/ip4/172.18.156.18/tcp/7263/p2p/16Uiu2HAm7gM2DiPu3s9QNqfWPMR5QFKCGmiDQ1vC7mEm1pFQpR3S","/ip4/172.18.156.18/tcp/7264/ws/p2p/16Uiu2HAm7gM2DiPu3s9QNqfWPMR5QFKCGmiDQ1vC7mEm1pFQpR3S"],"enrUri":"enr:-L24QHXLzJXSABaL-RxEew2eiJ2nFAWCPMktZIljw0flQDvALa8Zr50TjDR8a4tRM_wNwFpcn92nYN7h6YeVRWFqX1QCgmlkgnY0gmlwhKwSnBKKbXVsdGlhZGRyc5YACASsEpwSBhxfAAoErBKcEgYcYN0DgnJzhQACAQAAiXNlY3AyNTZrMaECtg6E6YUv1pOug7HZa_WFDmBEILnf2Imr4oTKgzDC-DWDdGNwghxfg3VkcIIcYYV3YWt1MgU"}'
INFO  src.node.waku_node:waku_node.py:292 REST service is ready !!
DEBUG  src.node.docker_mananger:docker_mananger.py:19 Docker client initialized with image wakuorg/nwaku:latest
DEBUG  src.node.waku_node:waku_node.py:86 WakuNode instance initialized with log path ./log/docker/node2_2026-03-12_04-38-47__e9b0d828-2d45-4038-8d71-2fe384cab304__wakuorg_nwaku:latest.log
DEBUG  src.node.waku_node:waku_node.py:90 Starting Node...
DEBUG  src.node.docker_mananger:docker_mananger.py:22 Attempting to create or retrieve network waku
DEBUG  src.node.docker_mananger:docker_mananger.py:25 Network waku already exists
DEBUG  src.node.docker_mananger:docker_mananger.py:108 Generated random external IP 172.18.131.248
DEBUG  src.node.docker_mananger:docker_mananger.py:101 Generated ports ['1377', '1378', '1379', '1380', '1381']
DEBUG  src.node.waku_node:waku_node.py:439 RLN credentials were not set
INFO  src.node.waku_node:waku_node.py:176 RLN credentials not set or credential store not available, starting without RLN
DEBUG  src.node.waku_node:waku_node.py:178 Using volumes []
DEBUG  src.node.docker_mananger:docker_mananger.py:49 docker run -i -t -p 1377:1377 -p 1378:1378 -p 1379:1379 -p 1380:1380 -p 1381:1381 wakuorg/nwaku:latest --listen-address=0.0.0.0 --rest=true --rest-admin=true --websocket-support=true --log-level=TRACE --rest-relay-cache-capacity=100 --websocket-port=1379 --rest-port=1377 --tcp-port=1378 --discv5-udp-port=1380 --rest-address=0.0.0.0 --nat=extip:172.18.131.248 --peer-exchange=true --discv5-discovery=true --cluster-id=2 --nodekey=efee0ef8edeb2ced7fd5cb9ecfebd2a9ccecf20086befa8dd4ac12ac62b8d2d6 --shard=0 --metrics-server=true --metrics-server-address=0.0.0.0 --metrics-server-port=1381 --metrics-logging=true --relay=true --discv5-bootstrap-node=enr:-L24QHXLzJXSABaL-RxEew2eiJ2nFAWCPMktZIljw0flQDvALa8Zr50TjDR8a4tRM_wNwFpcn92nYN7h6YeVRWFqX1QCgmlkgnY0gmlwhKwSnBKKbXVsdGlhZGRyc5YACASsEpwSBhxfAAoErBKcEgYcYN0DgnJzhQACAQAAiXNlY3AyNTZrMaECtg6E6YUv1pOug7HZa_WFDmBEILnf2Imr4oTKgzDC-DWDdGNwghxfg3VkcIIcYYV3YWt1MgU --content-topic=/myapp/1/latest/proto --num-shards-in-network=8
DEBUG  src.node.docker_mananger:docker_mananger.py:55 docker network connect --ip 172.18.131.248 waku 527e3d7515ebdfe897677af50cf0510be96ab831eb33557efaa57093e5514fa0
DEBUG  src.node.docker_mananger:docker_mananger.py:58 Container started with ID 527e3d7515eb. Setting up logs at ./log/docker/node2_2026-03-12_04-38-47__e9b0d828-2d45-4038-8d71-2fe384cab304__wakuorg_nwaku:latest.log
DEBUG  src.node.waku_node:waku_node.py:190 Started container from image wakuorg/nwaku:latest. REST: 1377
DEBUG  src.libs.common:common.py:47 Sleeping for 1 seconds
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/health" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"nodeHealth":"INITIALIZING","connectionStatus":"Disconnected","protocolsHealth":[]}'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/health" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"nodeHealth":"INITIALIZING","connectionStatus":"Disconnected","protocolsHealth":[]}'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/health" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"nodeHealth":"READY","connectionStatus":"PartiallyConnected","protocolsHealth":[{"Relay":"READY"},{"Lightpush":"NOT_MOUNTED"},{"Legacy Lightpush":"NOT_MOUNTED"},{"Filter":"NOT_MOUNTED"},{"Store":"NOT_MOUNTED"},{"Legacy Store":"NOT_MOUNTED"},{"Peer Exchange":"READY"},{"Rendezvous":"NOT_READY","desc":"No Rendezvous peers are available yet"},{"Mix":"NOT_MOUNTED"},{"Lightpush Client":"READY"},{"Legacy Lightpush Client":"READY"},{"Store Client":"READY"},{"Legacy Store Client":"NOT_READY","desc":"No Legacy Store service peers are available yet, neither Store service set up for the node"},{"Filter Client":"READY"},{"Rln Relay":"NOT_MOUNTED"}]}'
INFO  src.node.waku_node:waku_node.py:287 Node protocols are initialized !!
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/debug/v1/info" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'{"listenAddresses":["/ip4/172.18.131.248/tcp/1378/p2p/16Uiu2HAmLbzMtdMbjhmaKXq8kC5tBhLauC4ABdpUHmhMgEuAeFJp","/ip4/172.18.131.248/tcp/1379/ws/p2p/16Uiu2HAmLbzMtdMbjhmaKXq8kC5tBhLauC4ABdpUHmhMgEuAeFJp"],"enrUri":"enr:-L24QH0otm9tdvPyLXvy_JPjC4DhVjmm91iZzWgMAi7CtNxqQgm7eZmCkW5Hs-e1ugLAaapmXaJD6rFk8Jc9ceVpG_QCgmlkgnY0gmlwhKwSg_iKbXVsdGlhZGRyc5YACASsEoP4BgViAAoErBKD-AYFY90DgnJzhQACAQAAiXNlY3AyNTZrMaEDdhjDw3Rd-p-r2h8vi3DaJfaCebTclwAOwECEgigMLJmDdGNwggVig3VkcIIFZIV3YWt1MgE"}'
INFO  src.node.waku_node:waku_node.py:292 REST service is ready !!
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:1377/admin/v1/peers" -H "Content-Type: application/json" -d '["/ip4/172.18.156.18/tcp/7263/p2p/16Uiu2HAm7gM2DiPu3s9QNqfWPMR5QFKCGmiDQ1vC7mEm1pFQpR3S"]'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/subscriptions" -H "Content-Type: application/json" -d '["/myapp/1/latest/proto", "/waku/2/content/test.js", "/app/22/sometopic/someencoding", "/toychat/2/huilong/proto", "/statusim/1/community/cbor", "/app/27/sometopic/someencoding", "/app/29/sometopic/someencoding", "/app/20/sometopic/someencoding"]'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:1377/relay/v1/auto/subscriptions" -H "Content-Type: application/json" -d '["/myapp/1/latest/proto", "/waku/2/content/test.js", "/app/22/sometopic/someencoding", "/toychat/2/huilong/proto", "/statusim/1/community/cbor", "/app/27/sometopic/someencoding", "/app/29/sometopic/someencoding", "/app/20/sometopic/someencoding"]'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L215YXBwLzEvbGF0ZXN0L3Byb3Rv", "contentTopic": "/myapp/1/latest/proto", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L3dha3UvMi9jb250ZW50L3Rlc3QuanM=", "contentTopic": "/waku/2/content/test.js", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L2FwcC8yMi9zb21ldG9waWMvc29tZWVuY29kaW5n", "contentTopic": "/app/22/sometopic/someencoding", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L3RveWNoYXQvMi9odWlsb25nL3Byb3Rv", "contentTopic": "/toychat/2/huilong/proto", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L3N0YXR1c2ltLzEvY29tbXVuaXR5L2Nib3I=", "contentTopic": "/statusim/1/community/cbor", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L2FwcC8yNy9zb21ldG9waWMvc29tZWVuY29kaW5n", "contentTopic": "/app/27/sometopic/someencoding", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L2FwcC8yOS9zb21ldG9waWMvc29tZWVuY29kaW5n", "contentTopic": "/app/29/sometopic/someencoding", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X POST "http://127.0.0.1:7262/relay/v1/auto/messages" -H "Content-Type: application/json" -d '{"payload": "L2FwcC8yMC9zb21ldG9waWMvc29tZWVuY29kaW5n", "contentTopic": "/app/20/sometopic/someencoding", "timestamp": '$(date +%s%N)'}'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'OK'
DEBUG  src.libs.common:common.py:47 Sleeping for 0.1 seconds
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fmyapp%2F1%2Flatest%2Fproto" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L215YXBwLzEvbGF0ZXN0L3Byb3Rv","contentTopic":"/myapp/1/latest/proto","version":0,"timestamp":1773290330395035981,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fwaku%2F2%2Fcontent%2Ftest.js" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L3dha3UvMi9jb250ZW50L3Rlc3QuanM=","contentTopic":"/waku/2/content/test.js","version":0,"timestamp":1773290330405298582,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fapp%2F22%2Fsometopic%2Fsomeencoding" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L2FwcC8yMi9zb21ldG9waWMvc29tZWVuY29kaW5n","contentTopic":"/app/22/sometopic/someencoding","version":0,"timestamp":1773290330415590856,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Ftoychat%2F2%2Fhuilong%2Fproto" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L3RveWNoYXQvMi9odWlsb25nL3Byb3Rv","contentTopic":"/toychat/2/huilong/proto","version":0,"timestamp":1773290330426204232,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fstatusim%2F1%2Fcommunity%2Fcbor" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L3N0YXR1c2ltLzEvY29tbXVuaXR5L2Nib3I=","contentTopic":"/statusim/1/community/cbor","version":0,"timestamp":1773290330436840368,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fapp%2F27%2Fsometopic%2Fsomeencoding" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L2FwcC8yNy9zb21ldG9waWMvc29tZWVuY29kaW5n","contentTopic":"/app/27/sometopic/someencoding","version":0,"timestamp":1773290330448618932,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fapp%2F29%2Fsometopic%2Fsomeencoding" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L2FwcC8yOS9zb21ldG9waWMvc29tZWVuY29kaW5n","contentTopic":"/app/29/sometopic/someencoding","version":0,"timestamp":1773290330461012991,"ephemeral":false,"proof":""}]'
INFO  src.node.api_clients.base_client:base_client.py:37 curl -v -X GET "http://127.0.0.1:1377/relay/v1/auto/messages/%2Fapp%2F20%2Fsometopic%2Fsomeencoding" -H "Content-Type: application/json" -d 'None'
INFO  src.node.api_clients.base_client:base_client.py:22 Response status code: 200. Response content: b'[{"payload":"L2FwcC8yMC9zb21ldG9waWMvc29tZWVuY29kaW5n","contentTopic":"/app/20/sometopic/someencoding","version":0,"timestamp":1773290330474399576,"ephemeral":false,"proof":""}]'
DEBUG  tests.conftest:conftest.py:59 Running fixture teardown: test_setup
DEBUG  tests.conftest:conftest.py:83 Running fixture teardown: close_open_nodes
DEBUG  src.node.waku_node:waku_node.py:234 Stopping container with id 80c040f5cc71
DEBUG  src.node.waku_node:waku_node.py:241 Container stopped.
DEBUG  src.node.waku_node:waku_node.py:234 Stopping container with id 527e3d7515eb
DEBUG  src.node.waku_node:waku_node.py:241 Container stopped.
DEBUG  tests.conftest:conftest.py:98 Running fixture teardown: check_waku_log_errors
DEBUG  src.node.docker_mananger:docker_mananger.py:144 No errors found in the waku logs.
DEBUG  src.node.docker_mananger:docker_mananger.py:144 No errors found in the waku logs.