{"id":351,"date":"2023-10-03T11:45:00","date_gmt":"2023-10-03T14:45:00","guid":{"rendered":"http:\/\/suspensao.blog.br\/descrenca\/?p=351"},"modified":"2023-10-03T20:51:40","modified_gmt":"2023-10-03T23:51:40","slug":"sem-comentarios-e-agora","status":"publish","type":"post","link":"https:\/\/suspensao.blog.br\/descrenca\/sem-comentarios-e-agora\/","title":{"rendered":"Sem Coment\u00e1rios. E agora?"},"content":{"rendered":"\n<p>Tradicionalmente, considera-se uma boa pr\u00e1tica comentar o c\u00f3digo. H\u00e1 algum tempo, tem-se revisto este conceito. Na <a href=\"https:\/\/liferay.com\">Liferay<\/a>, por exemplo, seguimos uma pol\u00edtica de n\u00e3o comentar c\u00f3digo. Pessoalmente, sou um entusiasta desta filosofia. Mas n\u00e3o quero apresentar ou defender esta estrat\u00e9gia: h\u00e1 muito <a href=\"https:\/\/blog.codinghorror.com\/coding-without-comments\/\">material<\/a> bom sobre <a href=\"https:\/\/www.youtube.com\/watch?v=2a_ytyt9sf8\">isto<\/a>.  Quero discutir uma quest\u00e3o em aberto.<\/p>\n\n\n\n<p>Quem comenta quer transmitir alguma informa\u00e7\u00e3o importante. Que informa\u00e7\u00e3o \u00e9 essa? E, mais importante ainda, onde podemos registr\u00e1-la? Vejamos algumas alternativas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que essas linhas fazem?<\/h2>\n\n\n\n<p>Os <em>nomes de fun\u00e7\u00f5es<\/em> s\u00e3o excelentes para explicar <em>o que<\/em> o c\u00f3digo faz. Se um bloco de c\u00f3digo precisa de um coment\u00e1rio, considere extra\u00ed-lo para uma fun\u00e7\u00e3o ou classe. O nome da entidade j\u00e1 esclarecer\u00e1 seu prop\u00f3sito.<\/p>\n\n\n\n<p>Observe, por exemplo, as linhas abaixo, retiradas <a href=\"https:\/\/github.com\/liferay\/liferay-portal\/blob\/c80c42d75b23ca8ec30153f94c88263dd468f889~\/modules\/apps\/forms-and-workflow\/calendar\/calendar-test\/src\/testIntegration\/java\/com\/liferay\/calendar\/util\/test\/CalendarUtilTest.java#L117-L121\">desta classe de testes<\/a>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Assert<\/span><span class=\"hljs-selector-class\">.assertNotNull<\/span>(<span class=\"hljs-selector-tag\">recurrence<\/span>);\n<span class=\"hljs-selector-tag\">Assert<\/span><span class=\"hljs-selector-class\">.assertNull<\/span>(<span class=\"hljs-selector-tag\">recurrence<\/span><span class=\"hljs-selector-class\">.getUntilJCalendar<\/span>());\n<span class=\"hljs-selector-tag\">Assert<\/span><span class=\"hljs-selector-class\">.assertEquals<\/span>(0, <span class=\"hljs-selector-tag\">recurrence<\/span><span class=\"hljs-selector-class\">.getCount<\/span>());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Essas linhas verificam se a <a href=\"https:\/\/icalendar.org\/iCalendar-RFC-5545\/3-8-5-3-recurrence-rule.html\">RRule<\/a> de um evento tem certas propriedades: ela deve existir, ter um &#8220;<em>until<\/em>&#8221; <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Calendar.html\"><code>Calendar<\/code><\/a> nulo e uma contagem de zero.<\/p>\n\n\n\n<p>Os conceitos s\u00e3o complexos; eu mesmo me confundiria ao reler estes <em>asserts<\/em>. Um coment\u00e1rio poderia explic\u00e1-los. Mas <a href=\"https:\/\/github.com\/liferay\/liferay-portal\/commit\/c80c42d75b23ca8ec30153f94c88263dd468f889\">este commit<\/a> j\u00e1 esclareceu tudo ao mover essas linhas para um m\u00e9todo e invoc\u00e1-lo: <\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">assertRepeatsForever(recurrence);<\/code><\/span><\/pre>\n\n\n<p>Aquelas asser\u00e7\u00f5es verificavam se o evento se repete eternamente! Nenhum coment\u00e1rio foi necess\u00e1rio \u2014 felizmente, pois estes <em>asserts<\/em> estavam em v\u00e1rios testes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que est\u00e1 acontecendo?<\/h2>\n\n\n\n<p>Se o coment\u00e1rio iria explicar algo relevante em tempo de execu\u00e7\u00e3o, considere transform\u00e1-lo em uma mensagem de log! Note o exempo abaixo.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (Validator.isBlank(serviceAccountKey)) {\n\t<span class=\"hljs-comment\">\/\/ If no credentials are set for GCS Store, the library will<\/span>\n\t<span class=\"hljs-comment\">\/\/ use Application Default Credentials.<\/span>\n\t_googleCredentials =\n\t\tServiceAccountCredentials.getApplicationDefault();\n}\n<span class=\"hljs-keyword\">else<\/span> {\n\t_googleCredentials = ServiceAccountCredentials.fromStream(\n\t\t<span class=\"hljs-keyword\">new<\/span> ByteArrayInputStream(serviceAccountKey.getBytes()));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Este coment\u00e1rio pode ser relevante para quem l\u00ea o c\u00f3digo. Contudo, seria <em>crucial<\/em> para algu\u00e9m investigando um problema de autentica\u00e7\u00e3o. Por isso, na pr\u00e1tica, <a href=\"https:\/\/github.com\/liferay\/liferay-portal\/commit\/3c431cbdc4eabb0eb7581b27c8eeae622ca768b0\">escolhi logar uma mensagem<\/a>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (Validator.isBlank(serviceAccountKey)) {\n\t<span class=\"hljs-keyword\">if<\/span> (_log.isInfoEnabled()) {\n\t\t_log.info(\n\t\t\t<span class=\"hljs-string\">\"No credentials set for GCS Store. Library will use \"<\/span> +\n\t\t\t\t<span class=\"hljs-string\">\"Application Default Credentials.\"<\/span>);\n\t}\n\n\t_googleCredentials =\n\t\tServiceAccountCredentials.getApplicationDefault();\n}\n<span class=\"hljs-keyword\">else<\/span> {\n\t_googleCredentials = ServiceAccountCredentials.fromStream(\n\t\t<span class=\"hljs-keyword\">new<\/span> ByteArrayInputStream(serviceAccountKey.getBytes()));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Por que este c\u00f3digo est\u00e1 aqui?<\/h2>\n\n\n\n<p>Coment\u00e1rios para explicar <em>por que<\/em> algumas linhas est\u00e3o ali tamb\u00e9m s\u00e3o comuns. Um local melhor para compartilhar essas informa\u00e7\u00f5es s\u00e3o as <em>mensagens de commits<\/em>.<\/p>\n\n\n\n<p>Estes dias, por exemplo, me pediram para ajudar com um c\u00f3digo em que trabalhei anos atr\u00e1s. Lendo uma JSP \u2014 lembre-se, anos atr\u00e1s \u2014 eu encontrei <a href=\"https:\/\/github.com\/liferay\/liferay-portal\/blob\/043118eadf7c90c5d0182a6f7b5812472ebc142c\/modules\/dxp\/apps\/forms-and-workflow\/portal-workflow\/portal-workflow-kaleo-designer-web\/src\/main\/resources\/META-INF\/resources\/designer\/kaleo_definition_version_action.jsp#L29-L34\">essas linhas<\/a>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">liferay-portlet:renderURL<\/span> <span class=\"hljs-attr\">portletName<\/span>=<span class=\"hljs-string\">\"&lt;%= KaleoDesignerPortletKeys.KALEO_DESIGNER %&gt;\"<\/span> <span class=\"hljs-attr\">var<\/span>=<span class=\"hljs-string\">\"viewURL\"<\/span>&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">portlet:param<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"mvcPath\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"\/designer\/view_kaleo_definition_version.jsp\"<\/span> \/&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">portlet:param<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"redirect\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"&lt;%= currentURL %&gt;\"<\/span> \/&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">portlet:param<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"name\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"&lt;%= kaleoDefinitionVersion.getName() %&gt;\"<\/span> \/&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">portlet:param<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"draftVersion\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"&lt;%= kaleoDefinitionVersion.getVersion() %&gt;\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">liferay-portlet:renderURL<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Esta <em>tag<\/em> est\u00e1 gerando uma URL para ser utilizada em outro lugar. Mas meus olhos treinados acharam estranho aquele par\u00e2metro <code>portletName<\/code>. Este valor costumar ser definido automaticamente.<\/p>\n\n\n\n<p>Um <code>git blame<\/code> esclareceu tudo, quando encontrei <a href=\"https:\/\/github.com\/liferay\/liferay-portal\/commit\/043118eadf7c90c5d0182a6f7b5812472ebc142c\">este commit<\/a>. A mensagem \u00e9 clara:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>LPS-74977 \/ LPS-73731 By making the render URL explicitly use the Kaleo Designer name, it will be valid when rendered in another portlet.<\/p>\n<\/blockquote>\n\n\n\n<p>Entendi! Este c\u00f3digo provavelmente vai ser invocado por algum outro portlet. Neste caso, o valor seria automaticamente setado pela outra aplica\u00e7\u00e3o, e por alguma raz\u00e3o queremos evitar isso.<\/p>\n\n\n\n<p>(Por esta raz\u00e3o, ali\u00e1s, prefiro  <em>commits<\/em> pequenos: eles facilitam descobrir a raz\u00e3o de trechos de c\u00f3digo bem espec\u00edficos. \u00c9 como se <em>todas<\/em> as linhas de c\u00f3digo tivessem um coment\u00e1rio! N\u00e3o \u00e9 uma posi\u00e7\u00e3o un\u00e2nime, por\u00e9m: h\u00e1 quem prefira <em>commits<\/em> maiores.)<\/p>\n\n\n\n<p>A raz\u00e3o da linha foi esclarecida. Mas por que ela pode ser invocada de outra aplica\u00e7\u00e3o? Isto n\u00e3o \u00e9 usual&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que esta mudan\u00e7a foi feita?<\/h2>\n\n\n\n<p>Um c\u00f3digo bem escrito explica <em>como<\/em> algo foi implementado. A mensagem de <em>commit<\/em> esclarece o <em>porqu\u00ea<\/em>, mas em um contexto local. Como explicar a motiva\u00e7\u00e3o mais ampla por tr\u00e1s de um c\u00f3digo sem recorrer a coment\u00e1rios?<\/p>\n\n\n\n<p>Os <em>t\u00edquetes do issue tracker<\/em> s\u00e3o excelentes para isto. Normalmente escritos para guiar o desenvolvimento, esses documentos ajudam demais na interpreta\u00e7\u00e3o do c\u00f3digo. Se adicionarmos a chave do t\u00edquete \u00e0 mensagem de <em>commit<\/em>, podemos rastrear as raz\u00f5es.<\/p>\n\n\n\n<p>Voltando ao exemplo acima. Descobrimos que uma linha permite usar o mesmo c\u00f3digo em v\u00e1rios portlets. Mas isso raramente \u00e9 necess\u00e1rio. Por que precisamos reutilizar o c\u00f3digo neste caso? Por sorte, a mensagem menciona dois t\u00edquetes. Fui verificar o mais antigo; cheguei a <a href=\"https:\/\/liferay.atlassian.net\/browse\/LPSA-64324\">LPSA-64324<\/a>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>[Information Architecture] EE &#8211; As a portal admin, I would like to access all workflow portlets from the control panel section under the same tab.<\/p>\n<\/blockquote>\n\n\n\n<p>O t\u00edtulo j\u00e1 ajuda, e o texto esclarece de vez. Por raz\u00f5es de usabilidade, tr\u00eas aplica\u00e7\u00f5es diferentes passaram a aparecer em abas de um mesmo portlet. Faz todo sentido!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Os coment\u00e1rios que a gente gosta<\/h2>\n\n\n\n<p>\u00c9 importante destacar que tentamos evitar coment\u00e1rios desorganizados, que se entrela\u00e7am no c\u00f3digo e tentam explicar trechos dif\u00edceis de entender. H\u00e1 v\u00e1rios coment\u00e1rios, frequentemente com formatos padronizados, que n\u00e3o atrapalham a leitura. Um exemplo \u00f3bvio s\u00e3o os cabe\u00e7alhos de <em>copyright<\/em>.<\/p>\n\n\n\n<p>Outra maneira de usar coment\u00e1rios efetivamente \u00e9 a <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Programa%C3%A7%C3%A3o_letrada\">programa\u00e7\u00e3o letrada<\/a>. Neste estilo de programa\u00e7\u00e3o, os coment\u00e1rios s\u00e3o a estrela do show: o c\u00f3digo-fonte contem mais prosa do que c\u00f3digo execut\u00e1vel. Isto \u00e9 \u00fatil quando explicar o algoritmo \u00e9 mais importante do que l\u00ea-lo, como em pesquisas acad\u00eamicas e an\u00e1lise de dados. N\u00e3o por acaso, \u00e9 o paradigma de ferramentas populares como <a href=\"https:\/\/jupyter.org\/\">Jupyter Notebook<\/a> e <a href=\"https:\/\/quarto.org\/\">Quarto<\/a>.<\/p>\n\n\n\n<p>Mais relevante ainda, ferramentas como <a href=\"https:\/\/www.oracle.com\/technical-resources\/articles\/java\/javadoc-tool.html\">Javadoc<\/a>, <a href=\"https:\/\/jsdoc.app\/\">JSDoc<\/a>, <a href=\"https:\/\/www.doxygen.nl\/\">Doxygen<\/a> etc. leem coment\u00e1rios em um formato espec\u00edfico para gerar documenta\u00e7\u00e3o. Estes coment\u00e1rios n\u00e3o afetam a legibilidade. Pelo contr\u00e1rio: javadocs s\u00e3o \u00f3timos para explicar <em>como usar<\/em> estas entidades. Combinados com ferramentas como <a href=\"https:\/\/suspensao.blog.br\/descrenca\/doctest\/\">meu querido Doctest<\/a>, temos at\u00e9 garantias de acur\u00e1cia e atualidade!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Um mundo de possibilidades<\/h2>\n\n\n\n<p>Esses s\u00e3o apenas alguns exemplos de alternativas aos coment\u00e1rios. H\u00e1 muitas outras op\u00e7\u00f5es, como wikis, blogs. J\u00e1 encontrei a explica\u00e7\u00e3o para um c\u00f3digo que escrevi no Stack Overflow! Podemos pensar em ainda mais solu\u00e7\u00f5es para atender a diferentes necessidades. O ponto principal \u00e9 que, tendo estas ferramentas \u00e0 nossa disposi\u00e7\u00e3o, adicionar coment\u00e1rios diretamente ao c\u00f3digo torna-se desnecess\u00e1rio.<\/p>\n\n\n\n<p>Naturalmente, evitar coment\u00e1rios \u00e9 apenas uma das formas para se escrever c\u00f3digo leg\u00edvel. Coment\u00e1rios n\u00e3o s\u00e3o proibidos; de fato, h\u00e1 estrat\u00e9gias que podem torn\u00e1-los eficazes. No entanto, na minha experi\u00eancia, comentar indisciplinadamente leva a piores resultados, e essas t\u00e9cnicas ajudam a documentar informa\u00e7\u00f5es importantes que n\u00e3o cabem diretamente no c\u00f3digo.<\/p>\n\n\n\n<p>Voc\u00ea \u00e9 um adepto da estrat\u00e9gia &#8220;sem coment\u00e1rios&#8221;? Se sim, que outros meios voc\u00ea usa para transmitir infirma\u00e7\u00f5es? Se n\u00e3o, como voc\u00ea faz para ter coment\u00e1rios efetivos? Que tipo de coment\u00e1rio voc\u00ea n\u00e3o v\u00ea sendo substitu\u00eddo por essas abordagens? Adoraria escutar suas opini\u00f5es.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tradicionalmente, considera-se uma boa pr\u00e1tica comentar o c\u00f3digo. H\u00e1 algum tempo, tem-se revisto este conceito. Na Liferay, por exemplo, seguimos uma pol\u00edtica de n\u00e3o comentar c\u00f3digo. Pessoalmente, sou um entusiasta desta filosofia. Mas n\u00e3o quero apresentar ou defender esta estrat\u00e9gia: h\u00e1 muito material bom sobre isto. Quero discutir uma quest\u00e3o em aberto. Quem comenta quer [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":548,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[12,1],"tags":[167,168,166],"class_list":["post-351","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","category-uncategorized","tag-comentario","tag-comentario-de-codigo","tag-comentarios"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2023\/10\/1920px-Mona_Lisa_margin_scribble.jpg?fit=1920%2C576&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p23QLV-5F","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/comments?post=351"}],"version-history":[{"count":24,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/351\/revisions"}],"predecessor-version":[{"id":558,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/351\/revisions\/558"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/media\/548"}],"wp:attachment":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/media?parent=351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/categories?post=351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/tags?post=351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}