Northy1717/SWE-bench-Live huggingface dataset:
Repository: joke2k/faker

Issue:
hu-Hu localization gives back non-capitalized city names
* Faker version: 23.2.1
* OS: Ubuntu 22.04.3 LTS

Faker with hu-HU localization gives back non-capitalized cities, when it has either a city_prefix or city_part used in its format.

### Steps to reproduce

1. `Faker.seed(1234)`
1. `Faker("hu-HU").city()`

### Expected behavior

'Györgyháza'

### Actual behavior

'györgyháza'



Discussion:
Feel free to submit a corresponding PR.



Patch:
diff --git a/faker/providers/address/hu_HU/__init__.py b/faker/providers/address/hu_HU/__init__.py
index 990f6379b8..54c7150dda 100644
--- a/faker/providers/address/hu_HU/__init__.py
+++ b/faker/providers/address/hu_HU/__init__.py
@@ -467,3 +467,13 @@ def street_name(self) -> str:
     def building_number(self) -> str:
         numeric_part = super().random_int(1, 250)
         return str(numeric_part) + "."
+
+    # method added to fix #1996:
+    # for hu_Hu locale city_part could be first or second component of city,
+    # so city_parts tuple should contain lower-cased strings. Thus city might be lower-cased and should be capitalized
+    def city(self) -> str:
+        """
+        :example: 'Györgyháza'
+        """
+        pattern: str = self.random_element(self.city_formats)
+        return self.generator.parse(pattern).capitalize()


Test patch:
diff --git a/tests/providers/test_address.py b/tests/providers/test_address.py
index fa8ebf29b3..4125438b3a 100644
--- a/tests/providers/test_address.py
+++ b/tests/providers/test_address.py
@@ -2159,6 +2159,20 @@ def test_building_number(self, faker, num_samples):
             match = re.fullmatch(r"\d{0,3}.", building_number)
             assert match
 
+    def test_city(self, faker, num_samples):
+        # generating possible variations for cities for hu_Hu locale
+        real_cities = [city.lower() for city in HuHuAddressProvider.real_city_names]
+        cities_part_suffix = [''.join([part, suffix]) for part in HuHuAddressProvider.city_parts
+                              for suffix in HuHuAddressProvider.city_suffixes]
+        cities_prefix_part_suffix = [''.join([pref, part_suffix]) for pref in HuHuAddressProvider.city_prefs
+                                     for part_suffix in cities_part_suffix]
+        cities = real_cities + cities_part_suffix + cities_prefix_part_suffix
+        for _ in range(num_samples):
+            city = faker.city()
+            assert isinstance(city, str)
+            assert city.lower() in cities
+            assert city[0].isupper()
+
 
 class TestIdId:
     """Test id_ID address provider methods"""
Repository: amoffat/sh

Issue:
Need way for await sh.command to return RunningCommand
I'm finally porting [Carthage](https://github.com/hadron/carthage)  from sh 1.x to sh 2.x. We had our own hack to enable async for sh, and we had a lot of code that did things like
```python
result = await sh.ssh(...)
```
And then for example looked at `result.stdout`.
So, part of this can be handled by setting `_return_cmd=True`, but the definition of `RunningCommand.__await__` is hard-coded to return `str(self)`.
Obviously, I can do something like
```python
result = sh.ssh(...)
await result
```
But that feels clumsy.
I'd like a kwarg that returns a RunningCommand even on async await.
My preference would be to try and convince you that `_return_cmd` should affect await as well as __call__, but if you are concerned about the API instability, I'm happy with anything that I can pass into bake.

Thanks for your consideration.



Discussion:
I think that's a reasonable request, and the way the api should work. The fact that it doesn't seems to be incorrect behavior. Do you feel comfortable making this change?

Yes. I'll send in a pull request tomorrow.
The change is trivial, learning your test system enough to propose tests
will take most of the time.
But I've been working with sh long enough I should go learn the test
system anyway.




Patch:
diff --git a/sh.py b/sh.py
index d52d8b60..b02d6e16 100644
--- a/sh.py
+++ b/sh.py
@@ -889,7 +889,10 @@ def __next__(self):
     def __await__(self):
         async def wait_for_completion():
             await self.aio_output_complete.wait()
-            return str(self)
+            if self.call_args["return_cmd"]:
+                return self
+            else:
+                return str(self)
 
         return wait_for_completion().__await__()
 


Test patch:
diff --git a/tests/sh_test.py b/tests/sh_test.py
index 8a87fd69..0fe03111 100644
--- a/tests/sh_test.py
+++ b/tests/sh_test.py
@@ -1732,7 +1732,7 @@ def test_async_exc(self):
         py = create_tmp_test("""exit(34)""")
 
         async def producer():
-            await python(py.name, _async=True)
+            await python(py.name, _async=True, _return_cmd=False)
 
         self.assertRaises(sh.ErrorReturnCode_34, asyncio.run, producer())
 
@@ -1786,6 +1786,22 @@ async def producer():
 
         self.assertRaises(sh.ErrorReturnCode_34, asyncio.run, producer())
 
+    def test_async_return_cmd(self):
+        py = create_tmp_test(
+            """
+import sys
+sys.exit(0)
+"""
+        )
+
+        async def main():
+            result = await python(py.name, _async=True, _return_cmd=True)
+            self.assertIsInstance(result, sh.RunningCommand)
+            result_str = await python(py.name, _async=True, _return_cmd=False)
+            self.assertIsInstance(result_str, str)
+
+        asyncio.run(main())
+
     def test_handle_both_out_and_err(self):
         py = create_tmp_test(
             """
Repository: bridgecrewio/checkov

Issue:
CKV_GCP_79 SQL Server latest version is 2022 instead of 2019
**Describe the issue**
The `CKV_GCP_79` about SQL server is pinned at 2019 but 2022 is the latest version : 
https://learn.microsoft.com/en-us/troubleshoot/sql/releases/download-and-install-latest-updates

**Examples**
Related to this files : 

https://github.com/bridgecrewio/checkov/blob/master/checkov/terraform/checks/resource/gcp/CloudSqlMajorVersion.py

https://github.com/bridgecrewio/checkov/blob/d07fdc994015772a9fa0dc1a12d1391b5765916c/tests/terraform/checks/resource/gcp/example_CloudSqlMajorVersion/main.tf#L213


Discussion:

Patch:
diff --git a/checkov/terraform/checks/resource/gcp/CloudSqlMajorVersion.py b/checkov/terraform/checks/resource/gcp/CloudSqlMajorVersion.py
index 96bf503c3e..4df7105ccd 100644
--- a/checkov/terraform/checks/resource/gcp/CloudSqlMajorVersion.py
+++ b/checkov/terraform/checks/resource/gcp/CloudSqlMajorVersion.py
@@ -14,8 +14,8 @@ def get_inspected_key(self):
         return 'database_version'
 
     def get_expected_values(self):
-        return ["POSTGRES_15", "MYSQL_8_0", "SQLSERVER_2019_STANDARD", "SQLSERVER_2019_WEB",
-                "SQLSERVER_2019_ENTERPRISE", "SQLSERVER_2019_EXPRESS"]
+        return ["POSTGRES_15", "MYSQL_8_0", "SQLSERVER_2022_STANDARD", "SQLSERVER_2022_WEB",
+                "SQLSERVER_2022_ENTERPRISE", "SQLSERVER_2022_EXPRESS"]
 
 
 check = CloudSqlMajorVersion()


Test patch:
diff --git a/tests/terraform/checks/resource/gcp/example_CloudSqlMajorVersion/main.tf b/tests/terraform/checks/resource/gcp/example_CloudSqlMajorVersion/main.tf
index 0f8ff31f73..431cf323c6 100644
--- a/tests/terraform/checks/resource/gcp/example_CloudSqlMajorVersion/main.tf
+++ b/tests/terraform/checks/resource/gcp/example_CloudSqlMajorVersion/main.tf
@@ -154,7 +154,7 @@ resource "google_sql_database_instance" "pass2" {
 }
 
 resource "google_sql_database_instance" "fail3" {
-  database_version = "SQLSERVER_2017_STANDARD"
+  database_version = "SQLSERVER_2019_STANDARD"
   name             = "general-sqlserver12"
   project          = "gcp-bridgecrew-deployment"
   region           = "us-central1"
@@ -210,7 +210,7 @@ resource "google_sql_database_instance" "fail3" {
 }
 
 resource "google_sql_database_instance" "pass3" {
-  database_version = "SQLSERVER_2019_STANDARD"
+  database_version = "SQLSERVER_2022_STANDARD"
   name             = "general-sqlserver12"
   project          = "gcp-bridgecrew-deployment"
   region           = "us-central1"
Repository: keras-team/keras

Issue:
Wrong model outputs type after from_config(get_config())
When model have multiple outputs formed as a tuple and we are doing something like this `model2 = models.Model.from_config(model1.get_config())` the output of new model is a list (not tuple).

Example
https://colab.research.google.com/drive/1U_WyL2pyHYqK1zRPDlgVFxuHwvruHgIy#scrollTo=7ah8CZ9fZuPj


Discussion:
In the case when original model outputs a dict, restored model outputs dict too (as it should be).



Patch:
diff --git a/keras/src/models/functional.py b/keras/src/models/functional.py
index 810f7dfcbe29..97c8e8e518d7 100644
--- a/keras/src/models/functional.py
+++ b/keras/src/models/functional.py
@@ -532,6 +532,8 @@ def map_tensors(tensors):
             return get_tensor(*tensors)
         if isinstance(tensors, dict):
             return {k: map_tensors(v) for k, v in tensors.items()}
+        if isinstance(tensors, tuple):
+            return tuple([map_tensors(v) for v in tensors])
         return [map_tensors(v) for v in tensors]
 
     input_tensors = map_tensors(config["input_layers"])


Test patch:
diff --git a/keras/src/models/functional_test.py b/keras/src/models/functional_test.py
index a68ebe996b52..553d352ac555 100644
--- a/keras/src/models/functional_test.py
+++ b/keras/src/models/functional_test.py
@@ -3,6 +3,7 @@
 
 import numpy as np
 import pytest
+from absl.testing import parameterized
 
 from keras.src import applications
 from keras.src import backend
@@ -16,7 +17,7 @@
 from keras.src.models import Sequential
 
 
-class FunctionalTest(testing.TestCase):
+class FunctionalTest(testing.TestCase, parameterized.TestCase):
     @pytest.mark.requires_trainable_backend
     def test_basic_flow_multi_input(self):
         input_a = Input(shape=(3,), batch_size=2, name="input_a")
@@ -180,6 +181,32 @@ def test_input_dict_with_extra_field(self):
             out_val = model(in_val)
             self.assertEqual(out_val.shape, (2, 3))
 
+    @parameterized.named_parameters(
+        ("list", list),
+        ("tuple", tuple),
+        ("dict", dict),
+    )
+    def test_restored_multi_output_type(self, out_type):
+        inputs = Input(shape=(3,), batch_size=2, name="input")
+        x = layers.Dense(5)(inputs)
+        output_a = layers.Dense(4)(x)
+        output_b = layers.Dense(5)(x)
+        if dict == out_type:
+            outputs = {"a": output_a, "b": output_b}
+        else:
+            outputs = out_type([output_a, output_b])
+        model = Functional(inputs, outputs)
+        model_restored = Functional.from_config(model.get_config())
+
+        # Eager call
+        in_val = np.random.random((2, 3))
+        out_val = model_restored(in_val)
+        self.assertIsInstance(out_val, out_type)
+
+        # Symbolic call
+        out_val = model_restored(Input(shape=(3,), batch_size=2))
+        self.assertIsInstance(out_val, out_type)
+
     @pytest.mark.requires_trainable_backend
     def test_layer_getters(self):
         # Test mixing ops and layers
Repository: keras-team/keras

Issue:
Scatter update variable in TF optimizer
In TensorFlow there is a cool (fast) variable update operation - scatter_update (like "assign" for dense variables).
It would be cool if you override assign operation for such cases (i think it should looks like https://github.com/keras-team/keras/blob/master/keras/backend/tensorflow/optimizer.py#L45 )

P.S.
Found such case during migration of Keras v2 custom optimizer.


Discussion:

Patch:
diff --git a/keras/backend/tensorflow/optimizer.py b/keras/backend/tensorflow/optimizer.py
index 967c4e4d2a8b..1b2d3f5fcd2c 100644
--- a/keras/backend/tensorflow/optimizer.py
+++ b/keras/backend/tensorflow/optimizer.py
@@ -42,6 +42,15 @@ def stateless_apply(self, optimizer_variables, grads, trainable_variables):
             "(as it is incompatible with tf.distribute)."
         )
 
+    def assign(self, variable, value):
+        if isinstance(variable, KerasVariable):
+            variable = variable.value
+        value = tf.cast(value, variable.dtype)
+        if isinstance(value, tf.IndexedSlices):
+            variable.scatter_update(value)
+        else:
+            variable.assign(value)
+
     def assign_add(self, variable, value):
         if isinstance(variable, KerasVariable):
             variable = variable.value


Test patch:
diff --git a/keras/optimizers/optimizer_sparse_test.py b/keras/optimizers/optimizer_sparse_test.py
index 1e5a6b86564b..a398c53009f8 100644
--- a/keras/optimizers/optimizer_sparse_test.py
+++ b/keras/optimizers/optimizer_sparse_test.py
@@ -8,6 +8,26 @@
 from keras import optimizers
 from keras import testing
 
+
+class ScatterUpdateOptimizer(optimizers.Optimizer):
+    def __init__(self):
+        super().__init__(learning_rate=0.001)
+
+    def build(self, variables):
+        if self.built:
+            return
+        super().build(variables)
+        self.momentums = [
+            self.add_variable_from_reference(v, name="momentum")
+            for v in variables
+        ]
+
+    def update_step(self, grad, variable, learning_rate):
+        momentum = self.momentums[self._get_variable_index(variable)]
+        self.assign(momentum, ops.cast(grad, momentum.dtype))
+        self.assign(variable, ops.cast(grad, variable.dtype))
+
+
 TEST_CASES = [
     {
         "testcase_name": "adadelta",
@@ -97,6 +117,12 @@
         "optimizer_class": optimizers.SGD,
         "init_kwargs": {"momentum": 0.05, "nesterov": True},
     },
+    {
+        "testcase_name": "scatter_update",
+        "optimizer_class": ScatterUpdateOptimizer,
+        "expect_model_sparse_variable_updates": True,
+        "expect_optimizer_sparse_variable_updates": True,
+    },
 ]
Repository: python-babel/babel

Issue:
`parse_time` raises when a format doesn't contain seconds
## Overview Description

`parse_time` raises a `ValueError` when the given time format doesn't contain seconds e.g. `H:mm`.

## Steps to Reproduce

```python
>>> from babel.dates import parse_time
>>> parse_time('9:30', 'cs_CZ', 'short')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/dev/babel/babel/dates.py", line 1292, in parse_time
    sec_idx = format_str.index('s')
              ^^^^^^^^^^^^^^^^^^^^^
ValueError: substring not found
```

This happens because the `parse_time` function expects the format to have seconds, but some locales do not have those.
For example this is the CLDR definition for the `short` format in Czech:

```xml
<timeFormatLength type="short">
	<timeFormat>
		<pattern>H:mm</pattern>
		<datetimeSkeleton>Hmm</datetimeSkeleton>
	</timeFormat>
</timeFormatLength>
```

I think the obvious fix is to make the seconds optional and default to zero.



Discussion:
@akx Let me know if this is worth fixing, happy to send a PR :)
@tomasr8 It definitely is worth fixing if a CLDR preset entry does this! We should also probably add more smoke tests to test all of the CLDR presets..?
> We should also probably add more smoke tests to test all of the CLDR presets..?

That would definitely be nice! I bet there are a lot of surprises lurking in some less used parts/locales of CLDR :smile: 



Patch:
diff --git a/babel/dates.py b/babel/dates.py
index 30321b767..2f1b116e4 100644
--- a/babel/dates.py
+++ b/babel/dates.py
@@ -17,6 +17,7 @@
 
 from __future__ import annotations
 
+import math
 import re
 import warnings
 from functools import lru_cache
@@ -1281,7 +1282,9 @@ def parse_time(
     if hour_idx < 0:
         hour_idx = format_str.index('k')
     min_idx = format_str.index('m')
-    sec_idx = format_str.index('s')
+    # format might not contain seconds
+    if (sec_idx := format_str.find('s')) < 0:
+        sec_idx = math.inf
 
     indexes = sorted([(hour_idx, 'H'), (min_idx, 'M'), (sec_idx, 'S')])
     indexes = {item[1]: idx for idx, item in enumerate(indexes)}


Test patch:
diff --git a/tests/test_dates.py b/tests/test_dates.py
index 549929be7..fef68ae73 100644
--- a/tests/test_dates.py
+++ b/tests/test_dates.py
@@ -679,6 +679,14 @@ def test_parse_time(input, expected):
     assert dates.parse_time(input, locale='en_US') == expected
 
 
+def test_parse_time_no_seconds_in_format():
+    # parse time using a time format which does not include seconds
+    locale = 'cs_CZ'
+    fmt = 'short'
+    assert dates.get_time_format(format=fmt, locale=locale).pattern == 'H:mm'
+    assert dates.parse_time('9:30', locale=locale, format=fmt) == time(9, 30)
+
+
 def test_parse_time_alternate_characters(monkeypatch):
     # 'K' can be used as an alternative to 'H'
     def get_time_format(*args, **kwargs):
Repository: jupyterlab/jupyter-ai

Issue:
Index folder created in data-dir should explicitly set permission modes
## Description

The index folder for `/learn` is created in the `jupyter_data_dir()`:

https://github.com/jupyterlab/jupyter-ai/blob/2019571d916549262d04b3c02ec13e043935a7d4/packages/jupyter-ai/jupyter_ai/chat_handlers/learn.py#L28

which by default has `0o700` mode (see [definition in `jupyter-core`](https://github.com/jupyter/jupyter_core/blob/fa513c1550bbd1ebcc14a4a79eb8c5d95e3e23c9/jupyter_core/application.py#L101-L106)).

However, the code in jupyter-ai does not explicitly impose this restriction which may be worrying to some users: 

https://github.com/jupyterlab/jupyter-ai/blob/2019571d916549262d04b3c02ec13e043935a7d4/packages/jupyter-ai/jupyter_ai/chat_handlers/learn.py#L66-L67

This is because `os.makedirs` uses very lenient `0o777` mode by default ([ref](https://docs.python.org/3/library/os.html#os.makedirs)).

On some file systems this may lead to undesirable file permissions. Being explicit ensures that files are only accessible to the single user on multi-tenant systems.

## Context

`main` at https://github.com/jupyterlab/jupyter-ai/commit/2019571d916549262d04b3c02ec13e043935a7d4


Discussion:

Patch:
diff --git a/packages/jupyter-ai/jupyter_ai/chat_handlers/learn.py b/packages/jupyter-ai/jupyter_ai/chat_handlers/learn.py
index 2d09aa9a5..8d6fb09aa 100644
--- a/packages/jupyter-ai/jupyter_ai/chat_handlers/learn.py
+++ b/packages/jupyter-ai/jupyter_ai/chat_handlers/learn.py
@@ -19,6 +19,7 @@
     IndexMetadata,
 )
 from jupyter_core.paths import jupyter_data_dir
+from jupyter_core.utils import ensure_dir_exists
 from langchain.schema import BaseRetriever, Document
 from langchain.text_splitter import (
     LatexTextSplitter,
@@ -97,11 +98,12 @@ def __init__(self, *args, **kwargs):
         self.metadata = IndexMetadata(dirs=[])
         self.prev_em_id = None
 
-        if not os.path.exists(INDEX_SAVE_DIR):
-            os.makedirs(INDEX_SAVE_DIR)
-
+        self._ensure_dirs()
         self._load()
 
+    def _ensure_dirs(self):
+        ensure_dir_exists(INDEX_SAVE_DIR, mode=0o700)
+
     def _load(self):
         """Loads the vector store."""
         if self.index is not None:


Test patch:
diff --git a/packages/jupyter-ai/jupyter_ai/tests/test_handlers.py b/packages/jupyter-ai/jupyter_ai/tests/test_handlers.py
index 0194dec73..496cde371 100644
--- a/packages/jupyter-ai/jupyter_ai/tests/test_handlers.py
+++ b/packages/jupyter-ai/jupyter_ai/tests/test_handlers.py
@@ -1,3 +1,24 @@
+import os
+import stat
+from unittest import mock
+
+from jupyter_ai.chat_handlers import learn
+
+
+class MockLearnHandler(learn.LearnChatHandler):
+    def __init__(self):
+        pass
+
+
+def test_learn_index_permissions(tmp_path):
+    test_dir = tmp_path / "test"
+    with mock.patch.object(learn, "INDEX_SAVE_DIR", new=test_dir):
+        handler = MockLearnHandler()
+        handler._ensure_dirs()
+        mode = os.stat(test_dir).st_mode
+        assert stat.filemode(mode) == "drwx------"
+
+
 # TODO
 # import json
Repository: beeware/briefcase

Issue:
Creating a new project using quoted inputs results in an invalid pyproject.toml
### Describe the bug

Several of the user inputs for the `briefcase new` command are inserted verbatim in to the `pyproject.toml`. This TOML document uses double quotes to enclose these strings; therefore, if the user inputs contain double quotes, the TOML will be invalid.

While entering text with double quotes in to the prompts wouldn't normally be expected, at least for some of the fields, such as name (perhaps for a quoted nickname) or the description, this character should be supported.

### Steps to reproduce

1. Run `briefcase new`
2. For the author, enter `Harald "Bluetooth" Gormsson`
3. Run `briefcase dev` in the project

### Expected behavior

`pyproject.toml` is valid.

A similar tactic to https://github.com/beeware/briefcase-template/pull/66 seems reasonable.

### Screenshots

_No response_

### Environment

- Operating System: pop os 22.04
- Python version: 3.10.14
- Software versions:
  - Briefcase: `0.3.18.dev206+g38fbb22b.d20240422`


### Logs

```console
❯ briefcase dev

Briefcase configuration error: Invalid pyproject.toml: Expected newline or end of document after a statement (at line 8, column 19)
```

### Additional context

_No response_


Discussion:
Working on this at PyconUS 2024 sprints.
The supporting template pull request is [https://github.com/beeware/briefcase-template/pull/125](https://github.com/beeware/briefcase-template/pull/125)
Can we close this issue, or are some more changes required?
@mhsmith This also needs #1811, which is currently waiting for CI to complete.



Patch:
diff --git a/changes/1746.bugfix.rst b/changes/1746.bugfix.rst
new file mode 100644
index 000000000..0c9d3a96f
--- /dev/null
+++ b/changes/1746.bugfix.rst
@@ -0,0 +1,1 @@
+Escaping of quotation marks in TOML templates was corrected.
diff --git a/src/briefcase/integrations/cookiecutter.py b/src/briefcase/integrations/cookiecutter.py
index 25c0e5868..3c66ffd06 100644
--- a/src/briefcase/integrations/cookiecutter.py
+++ b/src/briefcase/integrations/cookiecutter.py
@@ -62,7 +62,7 @@ def __init__(self, environment):
 
         def escape_toml(obj):
             """Escapes double quotes and backslashes."""
-            return obj.replace('"', '"').replace("\\", "\\\\")
+            return obj.replace("\\", "\\\\").replace('"', '\\"')
 
         def escape_non_ascii(obj):
             """Quotes obj if non ascii characters are present."""


Test patch:
diff --git a/tests/integrations/cookiecutter/test_TOMLEscape.py b/tests/integrations/cookiecutter/test_TOMLEscape.py
index e80adc335..a3e6d05f5 100644
--- a/tests/integrations/cookiecutter/test_TOMLEscape.py
+++ b/tests/integrations/cookiecutter/test_TOMLEscape.py
@@ -10,7 +10,7 @@
     [
         # Single digit minor
         ("Hello World", "Hello World"),
-        ('Hello " World', 'Hello " World'),
+        ('Hello " World', 'Hello \\" World'),
         ("Hello \\ World", "Hello \\\\ World"),
     ],
 )
Repository: jazzband/tablib

Issue:
ODS loading issue - ValueError: 'value' is not in list
When saving data containing the empty string to ODS format, the resulting ODS file is not loadable by tablib. The code below reproduces the problem.

```python
book = tablib.Databook()
book.load(
    tablib.Databook(sets=[tablib.Dataset(("",))]).export("ods"),
    format="ods",
)
```

If the empty string is replaced with `None` the problem does not occur.

Would it be possible for tablib to handle this situation in a more robust manner?


Discussion:
Certainly! Would you be able to explore a bit what's happening and maybe suggest a fix?
Sure. I've created a pull request. Let me know what you think.



Patch:
diff --git a/src/tablib/formats/_ods.py b/src/tablib/formats/_ods.py
index adab7e18..f30c0f29 100644
--- a/src/tablib/formats/_ods.py
+++ b/src/tablib/formats/_ods.py
@@ -155,7 +155,10 @@ def convert_date(val):
         if not cell.childNodes:
             value = getattr(cell, 'data', None)
             if value is None:
-                value = cell.getAttribute('value')
+                try:
+                    value = cell.getAttribute('value')
+                except ValueError:
+                    pass
             if value is None:
                 return ''
             if value_type == 'float':
@@ -165,9 +168,7 @@ def convert_date(val):
             return value  # Any other type default to 'string'
 
         for subnode in cell.childNodes:
-            value = cls.read_cell(subnode, value_type)
-            if value:
-                return value
+            return cls.read_cell(subnode, value_type)
 
     @classmethod
     def import_set(cls, dset, in_stream, headers=True, skip_lines=0):


Test patch:
diff --git a/tests/test_tablib.py b/tests/test_tablib.py
index 32119918..4b0500d9 100755
--- a/tests/test_tablib.py
+++ b/tests/test_tablib.py
@@ -1182,9 +1182,18 @@ def test_ods_export_import_set(self):
         date = dt.date(2019, 10, 4)
         date_time = dt.datetime(2019, 10, 4, 12, 30, 8)
         time = dt.time(14, 30)
-        data.append(('string', '004', 42, 21.55, Decimal('34.5'), date, time, date_time, None))
+        data.append(('string', '004', 42, 21.55, Decimal('34.5'), date, time, date_time, None, ''))
         data.headers = (
-            'string', 'start0', 'integer', 'float', 'decimal', 'date', 'time', 'date/time', 'None'
+            'string',
+            'start0',
+            'integer',
+            'float',
+            'decimal',
+            'date',
+            'time',
+            'date/time',
+            'None',
+            'empty',
         )
         _ods = data.ods
         data.ods = _ods
@@ -1197,6 +1206,7 @@ def test_ods_export_import_set(self):
         self.assertEqual(data.dict[0]['time'], time)
         self.assertEqual(data.dict[0]['date/time'], date_time)
         self.assertEqual(data.dict[0]['None'], '')
+        self.assertEqual(data.dict[0]['empty'], '')
 
     def test_ods_export_display(self):
         """Test that exported datetime types are displayed correctly in office software"""
Repository: aws-cloudformation/cfn-lint

Issue:
[Potential Issue] E1051 Dynamic reference to secret in Parameters section
### CloudFormation Lint Version

1.14.1

### What operating system are you using?

Mac

### Describe the bug

cfn-lint raises a `E1051` on a dynamic reference to a secret within the Parameters section of a template.
The secret is being read successfully by the consuming resource so I am unsure why this error occurs. The template is using 
`Transform: AWS::Serverless-2016-10-31` and judging by the docs, the secret is resolved post-transformation.
Any assistance on this would be greatly appreciated -thanks. 

### Expected behavior

cfn-lint to run without errors.

### Reproduction template

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Parameters:
  Secret:
    Type: String
    Description: A test secret
    Default: '{{resolve:secretsmanager:/applications/testing/secret/internal}}'

Resources:
  Lambda:
    Type: AWS::Serverless::Function
   """ other config """
    Properties:
      Environment:
        Variables:
          SECRET: !Ref Secret



Discussion:

Patch:
diff --git a/src/cfnlint/rules/functions/DynamicReferenceSecretsManagerPath.py b/src/cfnlint/rules/functions/DynamicReferenceSecretsManagerPath.py
index 11ba63e9ab..d45de05073 100644
--- a/src/cfnlint/rules/functions/DynamicReferenceSecretsManagerPath.py
+++ b/src/cfnlint/rules/functions/DynamicReferenceSecretsManagerPath.py
@@ -29,6 +29,12 @@ def validate(self, validator: Validator, s: Any, instance: Any, schema: Any):
             ):
                 return
 
+            if (
+                validator.context.path.path[0] == "Parameters"
+                and validator.context.path.path[2] == "Default"
+            ):
+                return
+
         yield ValidationError(
             (
                 f"Dynamic reference {instance!r} to secrets manager can only be "


Test patch:
diff --git a/test/unit/rules/functions/test_dynamic_reference_secrets_manager_path.py b/test/unit/rules/functions/test_dynamic_reference_secrets_manager_path.py
index fcaaebf714..1186a2f6fc 100644
--- a/test/unit/rules/functions/test_dynamic_reference_secrets_manager_path.py
+++ b/test/unit/rules/functions/test_dynamic_reference_secrets_manager_path.py
@@ -42,6 +42,12 @@ def context(cfn):
             ["Resources", "MyResource", "Properties", "LoginProfile", "Password"],
             [],
         ),
+        (
+            "Valid secrets manager",
+            "{{resolve:secretsmanager:Parameter}}",
+            ["Parameters", "MyParameter", "Default"],
+            [],
+        ),
         (
             "Short list",
             "{{resolve:secretsmanager:Parameter}}",
Repository: aws-cloudformation/cfn-lint

Issue:
E8001 "_" in Condition name does not match regex pattern
### CloudFormation Lint Version

1.29.0

### What operating system are you using?

ubuntu

### Describe the bug

A Condition with an "_" in the name violates the cfn-lint reported regex pattern  '^[a-zA-Z0-9&]{1,255}$'



### Expected behavior

Adjust the cfn-lint expected regex pattern to accept "_" also since cloudformation has no issues with this


### Reproduction template

Conditions:
      DeployAz_A:
        Fn::Equals:
          - "true"
          - "false"


Discussion:

Patch:
diff --git a/src/cfnlint/data/schemas/other/conditions/conditions.json b/src/cfnlint/data/schemas/other/conditions/conditions.json
index 17eb19d3e0..1ba1a5b5bc 100644
--- a/src/cfnlint/data/schemas/other/conditions/conditions.json
+++ b/src/cfnlint/data/schemas/other/conditions/conditions.json
@@ -1,7 +1,7 @@
 {
  "additionalProperties": false,
  "patternProperties": {
-  "^[a-zA-Z0-9&]{1,255}$": {
+  "^[a-zA-Z0-9&_]{1,255}$": {
    "type": "boolean"
   }
  },


Test patch:
diff --git a/test/unit/rules/conditions/test_conditions.py b/test/unit/rules/conditions/test_conditions.py
index 28d41234cb..66d7e3684b 100644
--- a/test/unit/rules/conditions/test_conditions.py
+++ b/test/unit/rules/conditions/test_conditions.py
@@ -32,7 +32,7 @@ def test_condition(self):
                     path=deque(["bar"]),
                     rule=Configuration(),
                     schema_path=deque(
-                        ["patternProperties", "^[a-zA-Z0-9&]{1,255}$", "type"]
+                        ["patternProperties", "^[a-zA-Z0-9&_]{1,255}$", "type"]
                     ),
                     validator="type",
                     validator_value="boolean",
Repository: jpadilla/pyjwt

Issue:
Consider cryptography 42.x.x new validation
In `cryptography` `42.x.x`, this library introduces a new parsing validation that raises a `ValueError` when `load_pem_public_key` is called with an invalid `PEM`. This affects the `JWS` decode function, as `PyJWT` does not currently handle this exception. Does it make sense to address this scenario?

`PyJWT` unmanaged exception point:
https://github.com/jpadilla/pyjwt/blob/12420204cfef8fea7644532b9ca82c0cc5ca3abe/jwt/algorithms.py#L346

`cryptography` new validation: https://github.com/pyca/cryptography/blob/b507701ab4c14c345fd036c20ec7b95dae78c1a4/src/rust/src/error.rs#L12

Thank you.


Discussion:
Of course! Can you make a PR?
Hi 👋 

I opened a PR that I think would handle this case.

https://github.com/jpadilla/pyjwt/pull/952



Patch:
diff --git a/jwt/algorithms.py b/jwt/algorithms.py
index ece86b4d..2c45fa70 100644
--- a/jwt/algorithms.py
+++ b/jwt/algorithms.py
@@ -21,7 +21,7 @@
 )
 
 try:
-    from cryptography.exceptions import InvalidSignature
+    from cryptography.exceptions import InvalidSignature, UnsupportedAlgorithm
     from cryptography.hazmat.backends import default_backend
     from cryptography.hazmat.primitives import hashes
     from cryptography.hazmat.primitives.asymmetric import padding
@@ -343,7 +343,10 @@ def prepare_key(self, key: AllowedRSAKeys | str | bytes) -> AllowedRSAKeys:
                         RSAPrivateKey, load_pem_private_key(key_bytes, password=None)
                     )
             except ValueError:
-                return cast(RSAPublicKey, load_pem_public_key(key_bytes))
+                try:
+                    return cast(RSAPublicKey, load_pem_public_key(key_bytes))
+                except (ValueError, UnsupportedAlgorithm):
+                    raise InvalidKeyError("Could not parse the provided public key.")
 
         @overload
         @staticmethod


Test patch:
diff --git a/tests/test_algorithms.py b/tests/test_algorithms.py
index 1a395527..337de96a 100644
--- a/tests/test_algorithms.py
+++ b/tests/test_algorithms.py
@@ -1100,3 +1100,14 @@ def test_hmac_can_compute_digest(self):
         algo = HMACAlgorithm(HMACAlgorithm.SHA256)
         computed_hash = algo.compute_hash_digest(b"foo")
         assert computed_hash == foo_hash
+
+    @crypto_required
+    def test_rsa_prepare_key_raises_invalid_key_error_on_invalid_pem(self):
+        algo = RSAAlgorithm(RSAAlgorithm.SHA256)
+        invalid_key = "invalid key"
+
+        with pytest.raises(InvalidKeyError) as excinfo:
+            algo.prepare_key(invalid_key)
+
+        # Check that the exception message is correct
+        assert "Could not parse the provided public key." in str(excinfo.value)
Repository: urllib3/urllib3

Issue:
Add check for correct h2 version range
Similar to our other third-party package support, we should be checking which version of h2 is installed and raise an error in the case we get an unsupported version. We know that h2 uses semver, so we can check the major version is in our desired range.


Discussion:
@sethmlarson Took the freedom to create the check. Looking forward to some feedback.



Patch:
diff --git a/changelog/3290.feature.rst b/changelog/3290.feature.rst
new file mode 100644
index 0000000000..4f351b9a43
--- /dev/null
+++ b/changelog/3290.feature.rst
@@ -0,0 +1,3 @@
+Added version checking for ``h2`` (https://pypi.org/project/h2/) usage.
+
+Now only accepting supported h2 major version 4.x.x.
\ No newline at end of file
diff --git a/src/urllib3/http2/__init__.py b/src/urllib3/http2/__init__.py
index b27045322a..133e1d8f23 100644
--- a/src/urllib3/http2/__init__.py
+++ b/src/urllib3/http2/__init__.py
@@ -1,5 +1,7 @@
 from __future__ import annotations
 
+from importlib.metadata import version
+
 __all__ = [
     "inject_into_urllib3",
     "extract_from_urllib3",
@@ -11,6 +13,15 @@
 
 
 def inject_into_urllib3() -> None:
+    # First check if h2 version is valid
+    h2_version = version("h2")
+    if not h2_version.startswith("4."):
+        raise ImportError(
+            "urllib3 v2 supports h2 version 4.x.x, currently "
+            f"the 'h2' module is compiled with {h2_version!r}. "
+            "See: https://github.com/urllib3/urllib3/issues/3290"
+        )
+
     # Import here to avoid circular dependencies.
     from .. import connection as urllib3_connection
     from .. import util as urllib3_util


Test patch:
diff --git a/test/test_compatibility.py b/test/test_compatibility.py
index f18b0035ce..95dea64fc4 100644
--- a/test/test_compatibility.py
+++ b/test/test_compatibility.py
@@ -2,7 +2,11 @@
 
 import http.cookiejar
 import urllib
+from unittest import mock
 
+import pytest
+
+import urllib3.http2
 from urllib3.response import HTTPResponse
 
 
@@ -20,3 +24,25 @@ def test_extract(self) -> None:
             response.headers.add("set-cookie", c)
         cookiejar.extract_cookies(response, request)  # type: ignore[arg-type]
         assert len(cookiejar) == len(cookies)
+
+
+class TestInitialization:
+    @mock.patch("urllib3.http2.version")
+    def test_h2_version_check(self, mock_version: mock.MagicMock) -> None:
+        try:
+            mock_version.return_value = "4.1.0"
+            urllib3.http2.inject_into_urllib3()
+
+            mock_version.return_value = "3.9.9"
+            with pytest.raises(
+                ImportError, match="urllib3 v2 supports h2 version 4.x.x.*"
+            ):
+                urllib3.http2.inject_into_urllib3()
+
+            mock_version.return_value = "5.0.0"
+            with pytest.raises(
+                ImportError, match="urllib3 v2 supports h2 version 4.x.x.*"
+            ):
+                urllib3.http2.inject_into_urllib3()
+        finally:
+            urllib3.http2.extract_from_urllib3()
Repository: streamlink/streamlink

Issue:
plugins.vidio: 403 Client Error on stream token acquirement
### Checklist

- [X] This is a [plugin issue](https://streamlink.github.io/plugins.html) and not [a different kind of issue](https://github.com/streamlink/streamlink/issues/new/choose)
- [X] [I have read the contribution guidelines](https://github.com/streamlink/streamlink/blob/master/CONTRIBUTING.md#contributing-to-streamlink)
- [X] [I have checked the list of open and recently closed plugin issues](https://github.com/streamlink/streamlink/issues?q=is%3Aissue+label%3A%22plugin+issue%22)
- [X] [I have checked the commit log of the master branch](https://github.com/streamlink/streamlink/commits/master)

### Streamlink version

Unable to open URL: https://www.vidio.com/live/204/tokens (403 Client Error: Forbidden for url: https://www.vidio.com/live/204/tokens?type=hls)

### Description

The live stream:  https://www.vidio.com/live/204-sctv
the output: https://www.vidio.com/live/204/tokens (403 Client Error: Forbidden for url: https://www.vidio.com/live/204/tokens?type=hls)

It is missing sctv

### Debug log

```text
streamlink https://www.vidio.com/live/204-sctv best
[cli][info] Found matching plugin vidio for URL https://www.vidio.com/live/204-sctv
error: Unable to open URL: https://www.vidio.com/live/204/tokens (403 Client Error: Forbidden for url: https://www.vidio.com/live/204/tokens?type=hls)
```



Discussion:

Patch:
diff --git a/src/streamlink/plugins/vidio.py b/src/streamlink/plugins/vidio.py
index 50b05a46466..11b8ced64a5 100644
--- a/src/streamlink/plugins/vidio.py
+++ b/src/streamlink/plugins/vidio.py
@@ -6,6 +6,7 @@
 import logging
 import re
 from urllib.parse import urlsplit, urlunsplit
+from uuid import uuid4
 
 from streamlink.plugin import Plugin, pluginmatcher
 from streamlink.plugin.api import validate
@@ -17,7 +18,7 @@
 
 
 @pluginmatcher(re.compile(
-    r"https?://(?:www\.)?vidio\.com/",
+    r"https?://(?:www\.)?vidio\.com/.+",
 ))
 class Vidio(Plugin):
     tokens_url = "https://www.vidio.com/live/{id}/tokens"
@@ -28,6 +29,10 @@ def _get_stream_token(self, stream_id, stream_type):
             self.tokens_url.format(id=stream_id),
             params={"type": stream_type},
             headers={"Referer": self.url},
+            cookies={
+                "ahoy_visit": str(uuid4()),
+                "ahoy_visitor": str(uuid4()),
+            },
             schema=validate.Schema(
                 validate.parse_json(),
                 {"token": str},


Test patch:
diff --git a/tests/plugins/test_vidio.py b/tests/plugins/test_vidio.py
index 970dd45594b..4fdf269ce45 100644
--- a/tests/plugins/test_vidio.py
+++ b/tests/plugins/test_vidio.py
@@ -12,6 +12,5 @@ class TestPluginCanHandleUrlVidio(PluginCanHandleUrl):
     ]
 
     should_not_match = [
-        "http://www.vidio.com",
-        "https://www.vidio.com",
+        "https://www.vidio.com/",
     ]
Repository: aws-cloudformation/cfn-lint

Issue:
E1030 error on Fn::Length while comparing with a number using Fn::Equals 
### CloudFormation Lint Version

1.5.0

### What operating system are you using?

Mac, Linux

### Describe the bug

I am trying to add a condition where it compare if a CommaDelimitedList parameters had two elements.
```yaml
Conditions:  
   TwoVpcConfig: !Equals [ Fn::Length: !Ref VpcCIDRs, 2 ]
```
and I get the following error:
```
[cfn-lint] E1030: {'Fn::Length': {'Ref': 'VpcCIDRs'}} is not of type 'string'
```

However this errors started few days ago with an update of cfn-lint.

AWS Documentation states that Equals should accept any type of value and CommaDelimitedList is actually and array so `Fn::Equals` and `Fn::Length` should not complain.

If I ignore **E1030** from cfn-lint the template deploys correctly with no issue.

### Expected behavior

It should not complain

### Reproduction template

```yaml
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
...
Parameters:
  VpcCIDRs:
    Type: CommaDelimitedList

Conditions:  
   TwoVpcConfig: !Equals [ Fn::Length: !Ref VpcCIDRs, 2 ]
...
```


Discussion:

Patch:
diff --git a/src/cfnlint/rules/functions/_BaseFn.py b/src/cfnlint/rules/functions/_BaseFn.py
index cc48f886eb..2e4e118997 100644
--- a/src/cfnlint/rules/functions/_BaseFn.py
+++ b/src/cfnlint/rules/functions/_BaseFn.py
@@ -8,7 +8,7 @@
 from collections import namedtuple
 from typing import Any, Tuple
 
-from cfnlint.helpers import ToPy, ensure_list
+from cfnlint.helpers import ToPy, ensure_list, is_types_compatible
 from cfnlint.jsonschema import ValidationError, ValidationResult, Validator
 from cfnlint.rules import CloudFormationLintRule
 
@@ -118,7 +118,7 @@ def validate_fn_output_types(
     ) -> ValidationResult:
         tS = self.resolve_type(validator, s)
         if tS:
-            if not any(t in self.types for t in tS):
+            if not is_types_compatible(self.types, tS):
                 reprs = ", ".join(repr(type) for type in tS)
                 yield ValidationError(f"{instance!r} is not of type {reprs}")
 


Test patch:
diff --git a/test/unit/rules/functions/test_length.py b/test/unit/rules/functions/test_length.py
index 9f9eb70205..a6b88a4bb0 100644
--- a/test/unit/rules/functions/test_length.py
+++ b/test/unit/rules/functions/test_length.py
@@ -113,6 +113,13 @@ def context(cfn):
             {"transforms": Transforms(["AWS::LanguageExtensions"])},
             [],
         ),
+        (
+            "Fn::Length output while a number can be a string",
+            {"Fn::Length": []},
+            {"type": "string"},
+            {"transforms": Transforms(["AWS::LanguageExtensions"])},
+            [],
+        ),
     ],
 )
 def test_validate(name, instance, schema, context_evolve, expected, rule, context, cfn):
Repository: fonttools/fonttools

Issue:
Visitor pattern does not search inheritance chain
Unfortunately, I can't do this:

```python
from fontTools.feaLib import ast

@GlyphFilterVisitor.register(ast.Statement)
def visit(visitor, statement, *args, **kwargs):
    print("This never fires")
```

This is because the visitor looks for a registered `visitor` function for the exact class name of the object, and does not search the class hierarchy to find any superclass visitors.


Discussion:
I thought we do that. I'll take a look.
Any idea why this doesn't do it?
```
    @classmethod 
    def _visitorsFor(celf, thing, _default={}): 
        typ = type(thing) 
 
        for celf in celf.mro(): 
            _visitors = getattr(celf, "_visitors", None) 
            if _visitors is None: 
                break 
 
            m = celf._visitors.get(typ, None) 
            if m is not None: 
                return m 
 
        return _default 
```
Oh nevermind. I see. That's just walking up the visitor class, not the object. Lemme think about it.
I got it, PR incoming.



Patch:
diff --git a/Lib/fontTools/misc/visitor.py b/Lib/fontTools/misc/visitor.py
index d289895467..6de432ef93 100644
--- a/Lib/fontTools/misc/visitor.py
+++ b/Lib/fontTools/misc/visitor.py
@@ -61,9 +61,10 @@ def _visitorsFor(celf, thing, _default={}):
             if _visitors is None:
                 break
 
-            m = celf._visitors.get(typ, None)
-            if m is not None:
-                return m
+            for base in typ.mro():
+                m = celf._visitors.get(base, None)
+                if m is not None:
+                    return m
 
         return _default
 


Test patch:
diff --git a/Tests/misc/visitor_test.py b/Tests/misc/visitor_test.py
index 268cc716d7..eb1969ea86 100644
--- a/Tests/misc/visitor_test.py
+++ b/Tests/misc/visitor_test.py
@@ -24,6 +24,10 @@ def __init__(self):
         self.a = A()
 
 
+class C(B):
+    pass
+
+
 class TestVisitor(Visitor):
     def __init__(self):
         self.value = []
@@ -71,3 +75,9 @@ def test_visitor(self):
         visitor.defaultStop = True
         visitor.visit(b)
         assert visitor.value == ["B", "B a"]
+
+    def test_visitor_inheritance(self):
+        b = C()  # Should behave just like a B()
+        visitor = TestVisitor()
+        visitor.visit(b)
+        assert visitor.value == ["B", "B a", "A", 1, 2, 3, 5, 7, "e", E.E2, 10]
Repository: streamlink/streamlink

Issue:
plugins.nicolive: Community has been deprecated
### Checklist

- [X] This is a [plugin issue](https://streamlink.github.io/plugins.html) and not [a different kind of issue](https://github.com/streamlink/streamlink/issues/new/choose)
- [X] [I have read the contribution guidelines](https://github.com/streamlink/streamlink/blob/master/CONTRIBUTING.md#contributing-to-streamlink)
- [X] [I have checked the list of open and recently closed plugin issues](https://github.com/streamlink/streamlink/issues?q=is%3Aissue+label%3A%22plugin+issue%22)
- [X] [I have checked the commit log of the master branch](https://github.com/streamlink/streamlink/commits/master)

### Collaboration

- [X] [I will provide feedback should a pull request be opened with a fix for the plugin](https://github.com/streamlink/streamlink/blob/master/CONTRIBUTING.md#pull-request-feedback)

### Streamlink version

6.8.3

### Description

The static room url format is changed as nico community has been deprecated.

before: https://live.nicovideo.jp/watch/coXXXXXXXX
now: https://live.nicovideo.jp/watch/user/XXXXXXXXX

### Debug log

```text
/
```



Discussion:
Plugin is fixed now. Please don't post any NSFW links in the future, thanks.



Patch:
diff --git a/src/streamlink/plugins/nicolive.py b/src/streamlink/plugins/nicolive.py
index 514114638bb..45596cc6ffe 100644
--- a/src/streamlink/plugins/nicolive.py
+++ b/src/streamlink/plugins/nicolive.py
@@ -116,9 +116,9 @@ def set_wsclient(self, wsclient: NicoLiveWsClient):
         self.wsclient = wsclient
 
 
-@pluginmatcher(re.compile(
-    r"https?://(?P<domain>live\d*\.nicovideo\.jp)/watch/(lv|co)\d+",
-))
+@pluginmatcher(
+    re.compile(r"https?://(?P<domain>live\d*\.nicovideo\.jp)/watch/(lv|co|user/)\d+"),
+)
 @pluginargument(
     "email",
     sensitive=True,


Test patch:
diff --git a/tests/plugins/test_nicolive.py b/tests/plugins/test_nicolive.py
index 9e4b8eb03ac..6be23fa00d1 100644
--- a/tests/plugins/test_nicolive.py
+++ b/tests/plugins/test_nicolive.py
@@ -10,12 +10,12 @@ class TestPluginCanHandleUrlNicoLive(PluginCanHandleUrl):
     __plugin__ = NicoLive
 
     should_match = [
-        "https://live2.nicovideo.jp/watch/lv534562961",
-        "http://live2.nicovideo.jp/watch/lv534562961",
-        "https://live.nicovideo.jp/watch/lv534562961",
-        "https://live2.nicovideo.jp/watch/lv534562961?ref=rtrec&zroute=recent",
-        "https://live.nicovideo.jp/watch/co2467009?ref=community",
-        "https://live.nicovideo.jp/watch/co2619719",
+        "https://live.nicovideo.jp/watch/lv123",
+        "https://live2.nicovideo.jp/watch/lv123",
+        "https://live2.nicovideo.jp/watch/lv123?ref=rtrec&zroute=recent",
+        "https://live.nicovideo.jp/watch/co456?ref=community",
+        "https://live.nicovideo.jp/watch/co456",
+        "https://live.nicovideo.jp/watch/user/789",
     ]