2017-04-28 18:14:51 +02:00
|
|
|
Index: libvirt-3.3.0/configure.ac
|
2011-09-16 20:53:58 +02:00
|
|
|
===================================================================
|
2017-04-28 18:14:51 +02:00
|
|
|
--- libvirt-3.3.0.orig/configure.ac
|
|
|
|
+++ libvirt-3.3.0/configure.ac
|
2017-04-03 06:57:47 +02:00
|
|
|
@@ -256,6 +256,7 @@ LIBVIRT_ARG_LIBSSH
|
2017-01-19 19:52:37 +01:00
|
|
|
LIBVIRT_ARG_LIBXML
|
|
|
|
LIBVIRT_ARG_MACVTAP
|
|
|
|
LIBVIRT_ARG_NETCF
|
|
|
|
+LIBVIRT_ARG_NETCONTROL
|
|
|
|
LIBVIRT_ARG_NSS
|
|
|
|
LIBVIRT_ARG_NUMACTL
|
|
|
|
LIBVIRT_ARG_OPENWSMAN
|
2017-04-03 06:57:47 +02:00
|
|
|
@@ -296,6 +297,7 @@ LIBVIRT_CHECK_LIBSSH
|
2017-01-19 19:52:37 +01:00
|
|
|
LIBVIRT_CHECK_LIBXML
|
|
|
|
LIBVIRT_CHECK_MACVTAP
|
2013-01-30 19:45:29 +01:00
|
|
|
LIBVIRT_CHECK_NETCF
|
|
|
|
+LIBVIRT_CHECK_NETCONTROL
|
|
|
|
LIBVIRT_CHECK_NUMACTL
|
2017-01-19 19:52:37 +01:00
|
|
|
LIBVIRT_CHECK_NWFILTER
|
2013-01-30 19:45:29 +01:00
|
|
|
LIBVIRT_CHECK_OPENWSMAN
|
2017-04-28 18:14:51 +02:00
|
|
|
@@ -969,6 +971,7 @@ LIBVIRT_RESULT_LIBXL
|
2017-01-19 19:52:37 +01:00
|
|
|
LIBVIRT_RESULT_LIBXML
|
|
|
|
LIBVIRT_RESULT_MACVTAP
|
2013-01-30 19:45:29 +01:00
|
|
|
LIBVIRT_RESULT_NETCF
|
|
|
|
+LIBVIRT_RESULT_NETCONTROL
|
2017-01-19 19:52:37 +01:00
|
|
|
LIBVIRT_RESULT_NSS
|
2013-01-30 19:45:29 +01:00
|
|
|
LIBVIRT_RESULT_NUMACTL
|
|
|
|
LIBVIRT_RESULT_OPENWSMAN
|
2017-04-28 18:14:51 +02:00
|
|
|
Index: libvirt-3.3.0/src/Makefile.am
|
2011-09-16 20:53:58 +02:00
|
|
|
===================================================================
|
2017-04-28 18:14:51 +02:00
|
|
|
--- libvirt-3.3.0.orig/src/Makefile.am
|
|
|
|
+++ libvirt-3.3.0/src/Makefile.am
|
|
|
|
@@ -1034,6 +1034,10 @@ if WITH_NETCF
|
2013-01-22 05:02:42 +01:00
|
|
|
INTERFACE_DRIVER_SOURCES += \
|
|
|
|
interface/interface_backend_netcf.c
|
- Update to libvirt 1.1.4
- Add support for AArch64 architecture
- Various improvements on test code and test driver
- Don't link virt-login-shell against libvirt.so
- Close all non-stdio FDs in virt-login-shell
- Only allow 'stderr' log output when running setuid
- Fix perms for virConnectDomainXML{To,From}Native
- Many incremental improvements and bug fixes, see
http://libvirt.org/news.html
- Drop upstream patches: e7f400a1-CVE-2013-4296.patch,
2dba0323-CVE-2013-4297.patch, db7a5688-CVE-2013-4311.patch,
e65667c0-CVE-2013-4311.patch, 922b7fda-CVE-2013-4311.patch,
e4697b92-CVE-2013-4311.patch, 8294aa0c-CVE-2013-4399.patch,
484cc321-fix-spice-migration.patch,
79552754-libvirtd-chardev-crash.patch,
57687fd6-CVE-2013-4401.patch, ae53e5d1-CVE-2013-4400.patch,
8c3586ea-CVE-2013-4400.patch, b7fcc799a-CVE-2013-4400.patch,
3e2f27e1-CVE-2013-4400.patch, 5a0ea4b7-CVE-2013-4400.patch,
843bdb2f-CVE-2013-4400.patch,
bd773e74-lxc-terminate-machine.patch,
e350826c-python-fix-fd-passing.patch
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=329
2013-11-20 21:02:26 +01:00
|
|
|
endif WITH_NETCF
|
2011-09-16 20:53:58 +02:00
|
|
|
+if WITH_NETCONTROL
|
2013-01-22 05:02:42 +01:00
|
|
|
+INTERFACE_DRIVER_SOURCES += \
|
|
|
|
+ interface/interface_backend_netcf.c
|
2015-01-20 14:32:02 +01:00
|
|
|
+endif WITH_NETCONTROL
|
2013-01-30 19:45:29 +01:00
|
|
|
if WITH_UDEV
|
2013-01-22 05:02:42 +01:00
|
|
|
INTERFACE_DRIVER_SOURCES += \
|
|
|
|
interface/interface_backend_udev.c
|
2017-04-28 18:14:51 +02:00
|
|
|
@@ -1702,6 +1706,10 @@ if WITH_NETCF
|
2013-01-22 05:02:42 +01:00
|
|
|
libvirt_driver_interface_la_CFLAGS += $(NETCF_CFLAGS)
|
|
|
|
libvirt_driver_interface_la_LIBADD += $(NETCF_LIBS)
|
2015-04-02 18:20:09 +02:00
|
|
|
endif WITH_NETCF
|
2013-01-22 05:02:42 +01:00
|
|
|
+if WITH_NETCONTROL
|
|
|
|
+libvirt_driver_interface_la_CFLAGS += $(NETCONTROL_CFLAGS)
|
|
|
|
+libvirt_driver_interface_la_LIBADD += $(NETCONTROL_LIBS)
|
2015-04-02 18:20:09 +02:00
|
|
|
+endif WITH_NETCONTROL
|
2013-01-30 19:45:29 +01:00
|
|
|
if WITH_UDEV
|
2013-01-22 05:02:42 +01:00
|
|
|
libvirt_driver_interface_la_CFLAGS += $(UDEV_CFLAGS)
|
|
|
|
libvirt_driver_interface_la_LIBADD += $(UDEV_LIBS)
|
2017-04-28 18:14:51 +02:00
|
|
|
Index: libvirt-3.3.0/tools/virsh.c
|
2011-09-16 20:53:58 +02:00
|
|
|
===================================================================
|
2017-04-28 18:14:51 +02:00
|
|
|
--- libvirt-3.3.0.orig/tools/virsh.c
|
|
|
|
+++ libvirt-3.3.0/tools/virsh.c
|
|
|
|
@@ -567,6 +567,8 @@ virshShowVersion(vshControl *ctl ATTRIBU
|
2013-01-30 19:45:29 +01:00
|
|
|
vshPrint(ctl, " Interface");
|
|
|
|
# if defined(WITH_NETCF)
|
2012-09-26 00:22:08 +02:00
|
|
|
vshPrint(ctl, " netcf");
|
2012-11-02 18:55:26 +01:00
|
|
|
+# elif defined(WITH_NETCONTROL)
|
|
|
|
+ vshPrint(ctl, " netcontrol");
|
2013-01-30 19:45:29 +01:00
|
|
|
# elif defined(WITH_UDEV)
|
|
|
|
vshPrint(ctl, " udev");
|
2012-09-26 00:22:08 +02:00
|
|
|
# endif
|
2017-04-28 18:14:51 +02:00
|
|
|
Index: libvirt-3.3.0/src/interface/interface_backend_netcf.c
|
2012-09-26 00:22:08 +02:00
|
|
|
===================================================================
|
2017-04-28 18:14:51 +02:00
|
|
|
--- libvirt-3.3.0.orig/src/interface/interface_backend_netcf.c
|
|
|
|
+++ libvirt-3.3.0/src/interface/interface_backend_netcf.c
|
2012-09-26 00:22:08 +02:00
|
|
|
@@ -23,7 +23,12 @@
|
2011-09-16 20:53:58 +02:00
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
2012-09-26 00:22:08 +02:00
|
|
|
-#include <netcf.h>
|
2011-09-16 20:53:58 +02:00
|
|
|
+#ifdef WITH_NETCONTROL
|
2012-09-26 00:22:08 +02:00
|
|
|
+# include <netcontrol/netcf.h>
|
|
|
|
+# include <netcontrol/logger.h>
|
2011-09-16 20:53:58 +02:00
|
|
|
+#else
|
2012-09-26 00:22:08 +02:00
|
|
|
+# include <netcf.h>
|
2011-09-16 20:53:58 +02:00
|
|
|
+#endif
|
|
|
|
|
2013-01-30 19:45:29 +01:00
|
|
|
#include "virerror.h"
|
2011-09-16 20:53:58 +02:00
|
|
|
#include "datatypes.h"
|
2017-04-03 06:57:47 +02:00
|
|
|
@@ -66,6 +71,37 @@ VIR_ONCE_GLOBAL_INIT(virNetcfDriverState
|
- Update to libvirt 1.1.4
- Add support for AArch64 architecture
- Various improvements on test code and test driver
- Don't link virt-login-shell against libvirt.so
- Close all non-stdio FDs in virt-login-shell
- Only allow 'stderr' log output when running setuid
- Fix perms for virConnectDomainXML{To,From}Native
- Many incremental improvements and bug fixes, see
http://libvirt.org/news.html
- Drop upstream patches: e7f400a1-CVE-2013-4296.patch,
2dba0323-CVE-2013-4297.patch, db7a5688-CVE-2013-4311.patch,
e65667c0-CVE-2013-4311.patch, 922b7fda-CVE-2013-4311.patch,
e4697b92-CVE-2013-4311.patch, 8294aa0c-CVE-2013-4399.patch,
484cc321-fix-spice-migration.patch,
79552754-libvirtd-chardev-crash.patch,
57687fd6-CVE-2013-4401.patch, ae53e5d1-CVE-2013-4400.patch,
8c3586ea-CVE-2013-4400.patch, b7fcc799a-CVE-2013-4400.patch,
3e2f27e1-CVE-2013-4400.patch, 5a0ea4b7-CVE-2013-4400.patch,
843bdb2f-CVE-2013-4400.patch,
bd773e74-lxc-terminate-machine.patch,
e350826c-python-fix-fd-passing.patch
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=329
2013-11-20 21:02:26 +01:00
|
|
|
|
2014-12-15 15:16:23 +01:00
|
|
|
static virNetcfDriverStatePtr driver;
|
2011-09-16 20:53:58 +02:00
|
|
|
|
|
|
|
+#ifdef WITH_NETCONTROL
|
2013-07-11 00:06:19 +02:00
|
|
|
+static void
|
2015-01-20 15:17:38 +01:00
|
|
|
+interface_nc_log_driver(const char *category ATTRIBUTE_UNUSED,
|
2013-07-11 00:06:19 +02:00
|
|
|
+ int priority,
|
|
|
|
+ const char *func,
|
|
|
|
+ const char *file,
|
|
|
|
+ long long line,
|
|
|
|
+ const char *msg,
|
|
|
|
+ size_t len ATTRIBUTE_UNUSED)
|
2011-09-16 20:53:58 +02:00
|
|
|
+{
|
2013-07-11 00:06:19 +02:00
|
|
|
+ int vp;
|
2011-09-16 20:53:58 +02:00
|
|
|
+
|
2015-01-20 14:32:02 +01:00
|
|
|
+ switch (priority) {
|
2011-09-16 20:53:58 +02:00
|
|
|
+ case NC_LOG_FATAL:
|
|
|
|
+ case NC_LOG_ERROR:
|
|
|
|
+ vp = VIR_LOG_ERROR;
|
2013-07-11 00:06:19 +02:00
|
|
|
+ break;
|
2011-09-16 20:53:58 +02:00
|
|
|
+ case NC_LOG_WARN:
|
|
|
|
+ vp = VIR_LOG_WARN;
|
2013-07-11 00:06:19 +02:00
|
|
|
+ break;
|
2011-09-16 20:53:58 +02:00
|
|
|
+ case NC_LOG_INFO:
|
|
|
|
+ vp = VIR_LOG_INFO;
|
2013-07-11 00:06:19 +02:00
|
|
|
+ break;
|
2011-09-16 20:53:58 +02:00
|
|
|
+ case NC_LOG_DEBUG:
|
|
|
|
+ default:
|
|
|
|
+ vp = VIR_LOG_DEBUG;
|
2013-07-11 00:06:19 +02:00
|
|
|
+ break;
|
2011-09-16 20:53:58 +02:00
|
|
|
+ }
|
2014-04-02 14:48:46 +02:00
|
|
|
+ virLogMessage(&virLogSelf, vp, file, line, func, 0, "%s", msg);
|
2011-09-16 20:53:58 +02:00
|
|
|
+}
|
|
|
|
+#endif
|
- Update to libvirt 1.1.4
- Add support for AArch64 architecture
- Various improvements on test code and test driver
- Don't link virt-login-shell against libvirt.so
- Close all non-stdio FDs in virt-login-shell
- Only allow 'stderr' log output when running setuid
- Fix perms for virConnectDomainXML{To,From}Native
- Many incremental improvements and bug fixes, see
http://libvirt.org/news.html
- Drop upstream patches: e7f400a1-CVE-2013-4296.patch,
2dba0323-CVE-2013-4297.patch, db7a5688-CVE-2013-4311.patch,
e65667c0-CVE-2013-4311.patch, 922b7fda-CVE-2013-4311.patch,
e4697b92-CVE-2013-4311.patch, 8294aa0c-CVE-2013-4399.patch,
484cc321-fix-spice-migration.patch,
79552754-libvirtd-chardev-crash.patch,
57687fd6-CVE-2013-4401.patch, ae53e5d1-CVE-2013-4400.patch,
8c3586ea-CVE-2013-4400.patch, b7fcc799a-CVE-2013-4400.patch,
3e2f27e1-CVE-2013-4400.patch, 5a0ea4b7-CVE-2013-4400.patch,
843bdb2f-CVE-2013-4400.patch,
bd773e74-lxc-terminate-machine.patch,
e350826c-python-fix-fd-passing.patch
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=329
2013-11-20 21:02:26 +01:00
|
|
|
|
|
|
|
static void
|
|
|
|
virNetcfDriverStateDispose(void *obj)
|
2017-04-03 06:57:47 +02:00
|
|
|
@@ -88,6 +124,10 @@ netcfStateInitialize(bool privileged ATT
|
2014-12-15 15:16:23 +01:00
|
|
|
if (!(driver = virObjectLockableNew(virNetcfDriverStateClass)))
|
- Update to libvirt 1.1.4
- Add support for AArch64 architecture
- Various improvements on test code and test driver
- Don't link virt-login-shell against libvirt.so
- Close all non-stdio FDs in virt-login-shell
- Only allow 'stderr' log output when running setuid
- Fix perms for virConnectDomainXML{To,From}Native
- Many incremental improvements and bug fixes, see
http://libvirt.org/news.html
- Drop upstream patches: e7f400a1-CVE-2013-4296.patch,
2dba0323-CVE-2013-4297.patch, db7a5688-CVE-2013-4311.patch,
e65667c0-CVE-2013-4311.patch, 922b7fda-CVE-2013-4311.patch,
e4697b92-CVE-2013-4311.patch, 8294aa0c-CVE-2013-4399.patch,
484cc321-fix-spice-migration.patch,
79552754-libvirtd-chardev-crash.patch,
57687fd6-CVE-2013-4401.patch, ae53e5d1-CVE-2013-4400.patch,
8c3586ea-CVE-2013-4400.patch, b7fcc799a-CVE-2013-4400.patch,
3e2f27e1-CVE-2013-4400.patch, 5a0ea4b7-CVE-2013-4400.patch,
843bdb2f-CVE-2013-4400.patch,
bd773e74-lxc-terminate-machine.patch,
e350826c-python-fix-fd-passing.patch
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=329
2013-11-20 21:02:26 +01:00
|
|
|
return -1;
|
2011-09-16 20:53:58 +02:00
|
|
|
|
|
|
|
+#ifdef WITH_NETCONTROL
|
|
|
|
+ nc_logger_redirect_to(interface_nc_log_driver);
|
2015-03-18 19:17:20 +01:00
|
|
|
+#endif
|
2011-09-16 20:53:58 +02:00
|
|
|
+
|
|
|
|
/* open netcf */
|
2014-12-15 15:16:23 +01:00
|
|
|
if (ncf_init(&driver->netcf, NULL) != 0) {
|
- Update to libvirt 1.1.4
- Add support for AArch64 architecture
- Various improvements on test code and test driver
- Don't link virt-login-shell against libvirt.so
- Close all non-stdio FDs in virt-login-shell
- Only allow 'stderr' log output when running setuid
- Fix perms for virConnectDomainXML{To,From}Native
- Many incremental improvements and bug fixes, see
http://libvirt.org/news.html
- Drop upstream patches: e7f400a1-CVE-2013-4296.patch,
2dba0323-CVE-2013-4297.patch, db7a5688-CVE-2013-4311.patch,
e65667c0-CVE-2013-4311.patch, 922b7fda-CVE-2013-4311.patch,
e4697b92-CVE-2013-4311.patch, 8294aa0c-CVE-2013-4399.patch,
484cc321-fix-spice-migration.patch,
79552754-libvirtd-chardev-crash.patch,
57687fd6-CVE-2013-4401.patch, ae53e5d1-CVE-2013-4400.patch,
8c3586ea-CVE-2013-4400.patch, b7fcc799a-CVE-2013-4400.patch,
3e2f27e1-CVE-2013-4400.patch, 5a0ea4b7-CVE-2013-4400.patch,
843bdb2f-CVE-2013-4400.patch,
bd773e74-lxc-terminate-machine.patch,
e350826c-python-fix-fd-passing.patch
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=329
2013-11-20 21:02:26 +01:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
2017-04-28 18:14:51 +02:00
|
|
|
@@ -1143,6 +1183,19 @@ static virStateDriver interfaceStateDriv
|
2015-03-25 17:02:37 +01:00
|
|
|
|
|
|
|
int netcfIfaceRegister(void)
|
|
|
|
{
|
|
|
|
+ struct netcf *netcf;
|
|
|
|
+
|
|
|
|
+ /* Initialization of libnetcontrol will fail if NetworkManager is enabled.
|
|
|
|
+ * Skip registration if ncf_init fails.
|
|
|
|
+ * TODO: finer-grained check? E.g. is_nm_enabled()
|
|
|
|
+ */
|
|
|
|
+ if (ncf_init(&netcf, NULL) != 0) {
|
|
|
|
+ VIR_WARN("Failed to intialize libnetcontrol. Management of interface devices is disabled");
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ncf_close(netcf);
|
|
|
|
+
|
|
|
|
if (virSetSharedInterfaceDriver(&interfaceDriver) < 0)
|
|
|
|
return -1;
|
|
|
|
if (virRegisterStateDriver(&interfaceStateDriver) < 0)
|
2017-04-28 18:14:51 +02:00
|
|
|
Index: libvirt-3.3.0/src/interface/interface_driver.c
|
2013-01-22 05:02:42 +01:00
|
|
|
===================================================================
|
2017-04-28 18:14:51 +02:00
|
|
|
--- libvirt-3.3.0.orig/src/interface/interface_driver.c
|
|
|
|
+++ libvirt-3.3.0/src/interface/interface_driver.c
|
2014-04-08 19:20:15 +02:00
|
|
|
@@ -30,8 +30,15 @@ interfaceRegister(void)
|
2013-01-22 05:02:42 +01:00
|
|
|
if (netcfIfaceRegister() == 0)
|
|
|
|
return 0;
|
|
|
|
#endif /* WITH_NETCF */
|
|
|
|
+#ifdef WITH_NETCONTROL
|
|
|
|
+ /* Attempt to load the netcontrol based backend, which is a slightly
|
|
|
|
+ patched netcf backend */
|
|
|
|
+ if (netcfIfaceRegister() == 0)
|
|
|
|
+ return 0;
|
|
|
|
+#endif /* WITH_NETCONTROL */
|
2013-01-30 19:45:29 +01:00
|
|
|
#if WITH_UDEV
|
2013-01-22 05:02:42 +01:00
|
|
|
- /* If there's no netcf or it failed to load, register the udev backend */
|
2013-01-30 19:45:29 +01:00
|
|
|
+ /* If there's no netcf or netcontrol, or it failed to load, register the
|
|
|
|
+ udev backend */
|
2013-01-22 05:02:42 +01:00
|
|
|
if (udevIfaceRegister() == 0)
|
|
|
|
return 0;
|
2013-01-30 19:45:29 +01:00
|
|
|
#endif /* WITH_UDEV */
|
2017-04-28 18:14:51 +02:00
|
|
|
Index: libvirt-3.3.0/m4/virt-netcontrol.m4
|
2013-01-30 19:45:29 +01:00
|
|
|
===================================================================
|
|
|
|
--- /dev/null
|
2017-04-28 18:14:51 +02:00
|
|
|
+++ libvirt-3.3.0/m4/virt-netcontrol.m4
|
2017-01-19 19:52:37 +01:00
|
|
|
@@ -0,0 +1,39 @@
|
2013-01-30 19:45:29 +01:00
|
|
|
+dnl The libnetcontrol library
|
|
|
|
+dnl
|
|
|
|
+dnl Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
|
|
|
+dnl
|
|
|
|
+dnl This library is free software; you can redistribute it and/or
|
|
|
|
+dnl modify it under the terms of the GNU Lesser General Public
|
|
|
|
+dnl License as published by the Free Software Foundation; either
|
|
|
|
+dnl version 2.1 of the License, or (at your option) any later version.
|
|
|
|
+dnl
|
|
|
|
+dnl This library is distributed in the hope that it will be useful,
|
|
|
|
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
+dnl Lesser General Public License for more details.
|
|
|
|
+dnl
|
|
|
|
+dnl You should have received a copy of the GNU Lesser General Public
|
|
|
|
+dnl License along with this library. If not, see
|
|
|
|
+dnl <http://www.gnu.org/licenses/>.
|
|
|
|
+dnl
|
|
|
|
+
|
2017-01-19 19:52:37 +01:00
|
|
|
+AC_DEFUN([LIBVIRT_ARG_NETCONTROL],[
|
|
|
|
+ LIBVIRT_ARG_WITH_FEATURE([NETCONTROL], [netcontrol], [check], [0.2.0])
|
|
|
|
+])
|
|
|
|
+
|
2013-01-30 19:45:29 +01:00
|
|
|
+AC_DEFUN([LIBVIRT_CHECK_NETCONTROL],[
|
|
|
|
+ LIBVIRT_CHECK_PKG([NETCONTROL], [netcontrol], [0.2.0])
|
|
|
|
+
|
|
|
|
+ if test "$with_netcontrol" = "yes" ; then
|
|
|
|
+ old_CFLAGS="$CFLAGS"
|
|
|
|
+ old_LIBS="$CFLAGS"
|
|
|
|
+ CFLAGS="$CFLAGS $NETCONTROL_CFLAGS"
|
|
|
|
+ LIBS="$LIBS $NETCONTROL_LIBS"
|
|
|
|
+ CFLAGS="$old_CFLAGS"
|
|
|
|
+ LIBS="$old_LIBS"
|
|
|
|
+ fi
|
|
|
|
+])
|
|
|
|
+
|
|
|
|
+AC_DEFUN([LIBVIRT_RESULT_NETCONTROL],[
|
|
|
|
+ LIBVIRT_RESULT_LIB([NETCONTROL])
|
|
|
|
+])
|