{"id":102509,"date":"2021-12-07T15:37:11","date_gmt":"2021-12-07T13:37:11","guid":{"rendered":"https:\/\/prohoster.info\/blog\/novosti-interneta\/tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust"},"modified":"2021-12-07T15:37:11","modified_gmt":"2021-12-07T13:37:11","slug":"tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/news\/tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust","title":{"rendered":"Tercera edici\u00f3n de parches para el n\u00facleo de Linux con soporte para el lenguaje Rust","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Miguel Ojeda, autor del proyecto Rust-for-Linux, ha propuesto a los desarrolladores del n\u00facleo de Linux una tercera opci\u00f3n de componentes para el desarrollo de controladores de dispositivos en el lenguaje Rust. El soporte para Rust se considera experimental, pero ya se ha acordado su inclusi\u00f3n en la rama linux-next. El desarrollo est\u00e1 financiado por Google y la organizaci\u00f3n ISRG (Internet Security Research Group), que es la fundadora del proyecto Let's Encrypt y promueve el uso de HTTPS y el desarrollo de tecnolog\u00edas para aumentar la seguridad de internet.            <\/p>\n<p>Recordemos que los cambios propuestos permiten usar Rust como segundo lenguaje para el desarrollo de controladores y m\u00f3dulos del n\u00facleo. El soporte para Rust se presenta como una opci\u00f3n, no activada por defecto y no provoca la inclusi\u00f3n de Rust entre las dependencias de construcci\u00f3n obligatorias del n\u00facleo. Usar Rust para el desarrollo de controladores permitir\u00e1 crear controladores seguros y de mayor calidad con un esfuerzo m\u00ednimo, libre de problemas como el acceso a \u00e1reas de memoria despu\u00e9s de su liberaci\u00f3n, la desreferencia de punteros nulos y la salida de los l\u00edmites del b\u00fafer.    <\/p>\n<p>El manejo seguro de la memoria se garantiza en Rust durante la compilaci\u00f3n a trav\u00e9s de la verificaci\u00f3n de referencias, el seguimiento de la propiedad de los objetos y la consideraci\u00f3n del tiempo de vida de los objetos (\u00e1reas de visibilidad), as\u00ed como mediante la evaluaci\u00f3n de la correcci\u00f3n del acceso a la memoria durante la ejecuci\u00f3n del c\u00f3digo. Rust tambi\u00e9n proporciona medios para proteger contra desbordamientos enteros, requiere la inicializaci\u00f3n obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca est\u00e1ndar, aplica el concepto de inmutabilidad (immutable) de referencias y variables por defecto, y ofrece una fuerte tipificaci\u00f3n est\u00e1tica para minimizar errores l\u00f3gicos.    <\/p>\n<p>En la nueva versi\u00f3n de los parches se ha continuado la eliminaci\u00f3n de los comentarios realizados durante la discusi\u00f3n de la primera y segunda versiones de los parches. Los cambios m\u00e1s notables son:  <\/p>\n<ul>\n<li class=\"l\"> Se ha realizado la transici\u00f3n a utilizar la versi\u00f3n estable 1.57 de Rust como compilador de referencia y se ha vinculado a la edici\u00f3n estabilizada del lenguaje Rust 2021. Anteriormente, los parches estaban vinculados a la rama Beta de Rust y utilizaban algunas caracter\u00edsticas del lenguaje que pertenecen a la categor\u00eda de inestables. La transici\u00f3n a la especificaci\u00f3n Rust 2021 ha permitido iniciar el trabajo para eliminar del c\u00f3digo de los parches caracter\u00edsticas inestables como const_fn_transmute, const_panic, const_unreachable_unchecked y core_panic y try_reserve.\n<li class=\"l\"> Contin\u00faa el desarrollo de la variante de la biblioteca Rust alloc que forma parte de los parches, modificada para eliminar funciones de distribuci\u00f3n de memoria que podr\u00edan generar estados de \"panic\" al ocurrir errores, como la falta de memoria. La nueva versi\u00f3n incorpora las opciones \"no_rc\" y \"no_sync\" para desactivar la funcionalidad no utilizada en el c\u00f3digo Rust del n\u00facleo, lo que hace que la biblioteca sea m\u00e1s modular. Se sigue trabajando con los desarrolladores principales de alloc, centrado en trasladar los cambios necesarios para el n\u00facleo al conjunto principal de la biblioteca. La opci\u00f3n \"no_fp_fmt_parse\", necesaria para el funcionamiento de la biblioteca a nivel de n\u00facleo, se ha trasladado a la biblioteca base de Rust (core).\n<li class=\"l\"> Se ha realizado una limpieza del c\u00f3digo para eliminar posibles advertencias del compilador al compilar el n\u00facleo en modo CONFIG_WERROR. Durante la compilaci\u00f3n del c\u00f3digo en Rust se han incluido modos de diagn\u00f3stico adicionales del compilador y advertencias del linter Clippy.\n<li class=\"l\"> Se han propuesto abstracciones para su uso en el c\u00f3digo en el lenguaje Rust, como bloqueos seqlock (bloqueos de secuencia), llamadas de retorno para la gesti\u00f3n de energ\u00eda, I\/O Memory (readX\/writeX), manejadores de interrupciones y hilos, GPIO, acceso a dispositivos, controladores y credenciales.\n<li class=\"l\"> Se han ampliado las herramientas para el desarrollo de controladores utilizando mutexes movibles, iteradores de bits, envoltorios simplificados sobre punteros, diagn\u00f3stico mejorado de fallos e infraestructura independiente del bus de datos.\n<li class=\"l\"> Se ha mejorado el manejo de referencias mediante un tipo simplificado Ref, basado en el backend refcount_t, que utiliza la API del n\u00facleo para el conteo de referencias. El soporte para los tipos Arc y Rc, proporcionados en la biblioteca est\u00e1ndar alloc, ha sido eliminado y no est\u00e1 disponible en el c\u00f3digo que se ejecuta a nivel del n\u00facleo (para la propia biblioteca se han preparado opciones que desactivan estos tipos).\n<li class=\"l\"> Se ha a\u00f1adido al conjunto de parches una variante del controlador PL061 GPIO, reescrita en Rust. La caracter\u00edstica del controlador es que su implementaci\u00f3n pr\u00e1cticamente sigue l\u00ednea por l\u00ednea al controlador GPIO existente en el lenguaje C. Para los desarrolladores que deseen familiarizarse con la creaci\u00f3n de controladores en Rust, se ha preparado una comparaci\u00f3n l\u00ednea por l\u00ednea que permite entender en qu\u00e9 construcciones de Rust se ha transformado el c\u00f3digo en C.\n<li class=\"l\"> Se ha aceptado en la base de c\u00f3digo principal de Rust rustc_codegen_gcc, el backend rustc para GCC, que implementa la posibilidad de compilaci\u00f3n anticipada (AOT) utilizando la biblioteca libgccjit. Con el adecuado desarrollo del backend, permitir\u00e1 compilar el c\u00f3digo Rust utilizado en el n\u00facleo mediante GCC.\n<li class=\"l\"> Adem\u00e1s de las empresas ARM, Google y Microsoft, la empresa Red Hat ha expresado inter\u00e9s en el uso del lenguaje Rust en el n\u00facleo de Linux. Cabe recordar que Google apoya directamente el proyecto Rust for Linux, desarrolla una nueva implementaci\u00f3n del mecanismo de comunicaci\u00f3n entre procesos Binder en Rust y considera la posibilidad de reescribir varios controladores en Rust. Microsoft ha comenzado la implementaci\u00f3n de controladores para Hyper-V en Rust. ARM est\u00e1 trabajando en mejorar el soporte de Rust para sistemas basados en procesadores ARM. IBM ha implementado soporte para Rust en el n\u00facleo para sistemas PowerPC.      <\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/www.opennet.ru\/opennews\/art.shtml?num=56295\">opennet.ru<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0438\u0433\u0435\u043b\u044c \u041e\u0445\u0435\u0434\u0430 (Miguel Ojeda), \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Rust-for-Linux, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u044f\u0434\u0440\u0430 Linux \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Rust. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Rust \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f, \u043d\u043e \u0443\u0436\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0430 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u0432\u0435\u0442\u043a\u0443 linux-next. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Google \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ISRG (Internet Security Research Group), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0447\u0440\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Let&#8217;s Encrypt \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-102509","post","type-post","status-publish","format-standard","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0438\u0433\u0435\u043b\u044c \u041e\u0445\u0435\u0434\u0430 (Miguel Ojeda), \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Rust-for-Linux, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u044f\u0434\u0440\u0430 Linux \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Rust.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/news\/tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0435\u0442\u044c\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 \u0434\u043b\u044f \u044f\u0434\u0440\u0430 Linux \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u044f\u0437\u044b\u043a\u0430 Rust | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0438\u0433\u0435\u043b\u044c \u041e\u0445\u0435\u0434\u0430 (Miguel Ojeda), \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Rust-for-Linux, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u044f\u0434\u0440\u0430 Linux \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Rust.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/news\/tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2021-12-07T13:37:11+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2021-12-07T13:37:11+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Tercera edici\u00f3n de parches para el n\u00facleo de Linux con soporte para el lenguaje Rust | ProHoster","description":"Miguel Ojeda, autor del proyecto Rust-for-Linux, ha propuesto a los desarrolladores del n\u00facleo de Linux un tercer conjunto de componentes para el desarrollo de controladores de dispositivos en el lenguaje Rust.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/news\/tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0435\u0442\u044c\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 \u0434\u043b\u044f \u044f\u0434\u0440\u0430 Linux \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u044f\u0437\u044b\u043a\u0430 Rust | ProHoster","og:description":"\u041c\u0438\u0433\u0435\u043b\u044c \u041e\u0445\u0435\u0434\u0430 (Miguel Ojeda), \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Rust-for-Linux, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u044f\u0434\u0440\u0430 Linux \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Rust.","og:url":"https:\/\/prohoster.info\/es\/blog\/news\/tretya-redakcziya-patchej-dlya-yadra-linux-s-podderzhkoj-yazyka-rust","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2021-12-07T13:37:11+00:00","article:modified_time":"2021-12-07T13:37:11+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"102509","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-12-07 13:37:18","updated":"2022-09-27 15:07:34","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/102509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=102509"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/102509\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=102509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=102509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=102509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}