Análisis de concurrencia en programas de Elixir con la herramienta Rascal

Elixir es un lenguaje de programación destacado por su sólido modelo de concurrencia, diseñado para construir aplicaciones distribuidas, escalables y resilientes. A medida que su adopción crece en sectores como telecomunicaciones, fintech y servicios web, surge la necesidad de identificar los elemen...

Full description

Autores:
Peniche Calderón, Javier David
Tipo de recurso:
Trabajo de grado de pregrado
Fecha de publicación:
2025
Institución:
Universidad de los Andes
Repositorio:
Séneca: repositorio Uniandes
Idioma:
spa
OAI Identifier:
oai:repositorio.uniandes.edu.co:1992/75472
Acceso en línea:
https://hdl.handle.net/1992/75472
Palabra clave:
Rascal
AST
Elixir
Concurrencia
Ingeniería
Rights
openAccess
License
Attribution 4.0 International
id UNIANDES2_4556f8543b057a7722a615f88b553ee1
oai_identifier_str oai:repositorio.uniandes.edu.co:1992/75472
network_acronym_str UNIANDES2
network_name_str Séneca: repositorio Uniandes
repository_id_str
dc.title.spa.fl_str_mv Análisis de concurrencia en programas de Elixir con la herramienta Rascal
title Análisis de concurrencia en programas de Elixir con la herramienta Rascal
spellingShingle Análisis de concurrencia en programas de Elixir con la herramienta Rascal
Rascal
AST
Elixir
Concurrencia
Ingeniería
title_short Análisis de concurrencia en programas de Elixir con la herramienta Rascal
title_full Análisis de concurrencia en programas de Elixir con la herramienta Rascal
title_fullStr Análisis de concurrencia en programas de Elixir con la herramienta Rascal
title_full_unstemmed Análisis de concurrencia en programas de Elixir con la herramienta Rascal
title_sort Análisis de concurrencia en programas de Elixir con la herramienta Rascal
dc.creator.fl_str_mv Peniche Calderón, Javier David
dc.contributor.advisor.none.fl_str_mv Cardozo Álvarez, Nicolás
dc.contributor.author.none.fl_str_mv Peniche Calderón, Javier David
dc.subject.keyword.spa.fl_str_mv Rascal
AST
Elixir
Concurrencia
topic Rascal
AST
Elixir
Concurrencia
Ingeniería
dc.subject.themes.spa.fl_str_mv Ingeniería
description Elixir es un lenguaje de programación destacado por su sólido modelo de concurrencia, diseñado para construir aplicaciones distribuidas, escalables y resilientes. A medida que su adopción crece en sectores como telecomunicaciones, fintech y servicios web, surge la necesidad de identificar los elementos concurrentes de sus aplicaciones. Comprender los elementos de concurrencia podría llegar en un futuro a ser útil en la facilitación en el diagnóstico de problemas y la optimización de recursos. El objetivo principal de este trabajo es identificar los elementos de concurrencia en programas desarrollados en Elixir. Para ello, Rascal facilita la transformación del código fuente de Elixir en árboles de sintaxis concreta, que representan la estructura escrita del código. Estos árboles permiten inspeccionar elementos de concurrencia y analizar las interacciones entre los componentes del programa de forma estructurada. El análisis con Rascal se fundamenta en el uso de gramáticas formales y herramientas que permiten definir tanto la sintaxis concreta (cómo se escribe el código) como la abstracta (su estructura lógica). A través de módulos gramaticales, Rascal transforma el código fuente en estructuras como árboles de sintaxis abstracta (AST), que representan los elementos del programa. En particular, los árboles de sintaxis (parse trees) proporcionan una representación jerárquica del código fuente, mostrando cómo los elementos del lenguaje se relacionan de acuerdo con sus reglas gramaticales. Esto permite identificar elementos de concurrencia, exponiendo de forma explícita las interacciones y dependencias entre los diferentes componentes. Así, los parse trees se convierten en una manera útil para la visualización de la concurrencia en programas escritos en Elixir. Estas estructuras no solo permiten detectar elementos de concurrencia, sino también la integración de Rascal con colecciones, expresiones regulares y herramientas de visualización que lo convierte en una solución versátil para el estudio de programas en diferentes lenguajes.
publishDate 2025
dc.date.accessioned.none.fl_str_mv 2025-01-20T13:03:05Z
dc.date.available.none.fl_str_mv 2025-01-20T13:03:05Z
dc.date.issued.none.fl_str_mv 2025-01-17
dc.type.none.fl_str_mv Trabajo de grado - Pregrado
dc.type.driver.none.fl_str_mv info:eu-repo/semantics/bachelorThesis
dc.type.version.none.fl_str_mv info:eu-repo/semantics/acceptedVersion
dc.type.coar.none.fl_str_mv http://purl.org/coar/resource_type/c_7a1f
dc.type.content.none.fl_str_mv Text
dc.type.redcol.none.fl_str_mv http://purl.org/redcol/resource_type/TP
format http://purl.org/coar/resource_type/c_7a1f
status_str acceptedVersion
dc.identifier.uri.none.fl_str_mv https://hdl.handle.net/1992/75472
dc.identifier.instname.none.fl_str_mv instname:Universidad de los Andes
dc.identifier.reponame.none.fl_str_mv reponame:Repositorio Institucional Séneca
dc.identifier.repourl.none.fl_str_mv repourl:https://repositorio.uniandes.edu.co/
url https://hdl.handle.net/1992/75472
identifier_str_mv instname:Universidad de los Andes
reponame:Repositorio Institucional Séneca
repourl:https://repositorio.uniandes.edu.co/
dc.language.iso.none.fl_str_mv spa
language spa
dc.relation.references.none.fl_str_mv [1] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025).
[2] “Stack Overflow,” Stackoverflow.co, 2024. https://survey.stackoverflow.co/ (accessed Jan. 12, 2025).
[3] N. Savic, “Inside BEAM: How Elixir and Erlang Leverage a Shared Runtime for Resilient Applications,” Hackernoon.com, Apr. 03, 2024. https://hackernoon.com/inside-beam-how-elixir-and-erlang-leverage-a-shared-runtime-for-resilient-applications (accessed Jan. 12, 2025).
[4] “The Elixir programming language,” The Elixir programming language, 2025. https://elixir-lang.org/ (accessed Jan. 12, 2025).
[5] Mathijs Schuts, “Rascal DSL Tutorial,” ResearchGate, Nov. 2023. https://www.researchgate.net/publication/375422469_Rascal_DSL_Tutorial (accessed Jan. 12, 2025).
[6] “The Rascal Meta Programming Language | The Rascal Meta Programming Language,” Rascal-mpl.org, 2024. https://www.rascal-mpl.org/ (accessed Jan. 12, 2025).
[7] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025).
[8] J. J. Vinju, M. A. Hills, P. Klint, van, and van, “The Rascal meta-programming language - a lab for software analysis, transformation, generation & visualization,” https://homepages.cwi.nl/~paulk/publications/ICTOPENRascalLab.pdf, Nov. 14, 2011. https://www.researchgate.net/publication/254817781_The_Rascal_meta-programming_language_-_a_lab_for_software_analysis_transformation_generation_visualization
dc.rights.en.fl_str_mv Attribution 4.0 International
dc.rights.uri.none.fl_str_mv http://creativecommons.org/licenses/by/4.0/
dc.rights.accessrights.none.fl_str_mv info:eu-repo/semantics/openAccess
dc.rights.coar.none.fl_str_mv http://purl.org/coar/access_right/c_abf2
rights_invalid_str_mv Attribution 4.0 International
http://creativecommons.org/licenses/by/4.0/
http://purl.org/coar/access_right/c_abf2
eu_rights_str_mv openAccess
dc.format.extent.none.fl_str_mv 34 páginas
dc.format.mimetype.none.fl_str_mv application/pdf
dc.publisher.none.fl_str_mv Universidad de los Andes
dc.publisher.program.none.fl_str_mv Ingeniería de Sistemas y Computación
dc.publisher.faculty.none.fl_str_mv Facultad de Ingeniería
dc.publisher.department.none.fl_str_mv Departamento de Ingeniería de Sistemas y Computación
publisher.none.fl_str_mv Universidad de los Andes
institution Universidad de los Andes
bitstream.url.fl_str_mv https://repositorio.uniandes.edu.co/bitstreams/e48991a1-8bb8-44c8-b52c-998fd711416e/download
https://repositorio.uniandes.edu.co/bitstreams/48eb1605-8e9c-4126-8956-b39a450ff101/download
https://repositorio.uniandes.edu.co/bitstreams/bba858c7-fa89-4ee1-a595-dc428db2f51a/download
https://repositorio.uniandes.edu.co/bitstreams/472ac0bd-c28f-4cea-acb4-948b2e135c72/download
https://repositorio.uniandes.edu.co/bitstreams/6402f4fb-ff89-4b27-9f52-47f8bfa93a20/download
https://repositorio.uniandes.edu.co/bitstreams/d4b627fd-894a-4cde-be09-84d7067fa31c/download
https://repositorio.uniandes.edu.co/bitstreams/db1247c3-b2f4-43f9-aac7-276d3e363c4b/download
https://repositorio.uniandes.edu.co/bitstreams/f68f4a4c-6583-4699-bebf-6a9cb9794fe4/download
bitstream.checksum.fl_str_mv 14d9f95fa38334099dd39589798c1613
5baf669ef4e38765ff82c0982b991500
0175ea4a2d4caec4bbcc37e300941108
ae9e573a68e7f92501b6913cc846c39f
1b296b0508437fa5deda4209aee61d6c
81380ffe97743f3100d0e7ccbbe80e27
4d4cd1a1f87a2ca2aa437fea7895942e
64d580971654008a4276fb5ff0ddfbbd
bitstream.checksumAlgorithm.fl_str_mv MD5
MD5
MD5
MD5
MD5
MD5
MD5
MD5
repository.name.fl_str_mv Repositorio institucional Séneca
repository.mail.fl_str_mv adminrepositorio@uniandes.edu.co
_version_ 1831927650625519616
spelling Cardozo Álvarez, Nicolásvirtual::22186-1Peniche Calderón, Javier David2025-01-20T13:03:05Z2025-01-20T13:03:05Z2025-01-17https://hdl.handle.net/1992/75472instname:Universidad de los Andesreponame:Repositorio Institucional Sénecarepourl:https://repositorio.uniandes.edu.co/Elixir es un lenguaje de programación destacado por su sólido modelo de concurrencia, diseñado para construir aplicaciones distribuidas, escalables y resilientes. A medida que su adopción crece en sectores como telecomunicaciones, fintech y servicios web, surge la necesidad de identificar los elementos concurrentes de sus aplicaciones. Comprender los elementos de concurrencia podría llegar en un futuro a ser útil en la facilitación en el diagnóstico de problemas y la optimización de recursos. El objetivo principal de este trabajo es identificar los elementos de concurrencia en programas desarrollados en Elixir. Para ello, Rascal facilita la transformación del código fuente de Elixir en árboles de sintaxis concreta, que representan la estructura escrita del código. Estos árboles permiten inspeccionar elementos de concurrencia y analizar las interacciones entre los componentes del programa de forma estructurada. El análisis con Rascal se fundamenta en el uso de gramáticas formales y herramientas que permiten definir tanto la sintaxis concreta (cómo se escribe el código) como la abstracta (su estructura lógica). A través de módulos gramaticales, Rascal transforma el código fuente en estructuras como árboles de sintaxis abstracta (AST), que representan los elementos del programa. En particular, los árboles de sintaxis (parse trees) proporcionan una representación jerárquica del código fuente, mostrando cómo los elementos del lenguaje se relacionan de acuerdo con sus reglas gramaticales. Esto permite identificar elementos de concurrencia, exponiendo de forma explícita las interacciones y dependencias entre los diferentes componentes. Así, los parse trees se convierten en una manera útil para la visualización de la concurrencia en programas escritos en Elixir. Estas estructuras no solo permiten detectar elementos de concurrencia, sino también la integración de Rascal con colecciones, expresiones regulares y herramientas de visualización que lo convierte en una solución versátil para el estudio de programas en diferentes lenguajes.Pregrado34 páginasapplication/pdfspaUniversidad de los AndesIngeniería de Sistemas y ComputaciónFacultad de IngenieríaDepartamento de Ingeniería de Sistemas y ComputaciónAttribution 4.0 Internationalhttp://creativecommons.org/licenses/by/4.0/info:eu-repo/semantics/openAccesshttp://purl.org/coar/access_right/c_abf2Análisis de concurrencia en programas de Elixir con la herramienta RascalTrabajo de grado - Pregradoinfo:eu-repo/semantics/bachelorThesisinfo:eu-repo/semantics/acceptedVersionhttp://purl.org/coar/resource_type/c_7a1fTexthttp://purl.org/redcol/resource_type/TPRascalASTElixirConcurrenciaIngeniería[1] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025).[2] “Stack Overflow,” Stackoverflow.co, 2024. https://survey.stackoverflow.co/ (accessed Jan. 12, 2025).[3] N. Savic, “Inside BEAM: How Elixir and Erlang Leverage a Shared Runtime for Resilient Applications,” Hackernoon.com, Apr. 03, 2024. https://hackernoon.com/inside-beam-how-elixir-and-erlang-leverage-a-shared-runtime-for-resilient-applications (accessed Jan. 12, 2025).[4] “The Elixir programming language,” The Elixir programming language, 2025. https://elixir-lang.org/ (accessed Jan. 12, 2025).[5] Mathijs Schuts, “Rascal DSL Tutorial,” ResearchGate, Nov. 2023. https://www.researchgate.net/publication/375422469_Rascal_DSL_Tutorial (accessed Jan. 12, 2025).[6] “The Rascal Meta Programming Language | The Rascal Meta Programming Language,” Rascal-mpl.org, 2024. https://www.rascal-mpl.org/ (accessed Jan. 12, 2025).[7] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025).[8] J. J. Vinju, M. A. Hills, P. Klint, van, and van, “The Rascal meta-programming language - a lab for software analysis, transformation, generation & visualization,” https://homepages.cwi.nl/~paulk/publications/ICTOPENRascalLab.pdf, Nov. 14, 2011. https://www.researchgate.net/publication/254817781_The_Rascal_meta-programming_language_-_a_lab_for_software_analysis_transformation_generation_visualization201716772Publicationhttps://scholar.google.es/citations?user=3iTzjQsAAAAJvirtual::22186-10000-0002-1094-9952virtual::22186-1a77ff528-fc33-44d6-9022-814f81ef407avirtual::22186-1a77ff528-fc33-44d6-9022-814f81ef407avirtual::22186-1ORIGINALautorizacion tesis final.pdfautorizacion tesis final.pdfHIDEapplication/pdf320825https://repositorio.uniandes.edu.co/bitstreams/e48991a1-8bb8-44c8-b52c-998fd711416e/download14d9f95fa38334099dd39589798c1613MD51Análisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdfAnálisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdfapplication/pdf914220https://repositorio.uniandes.edu.co/bitstreams/48eb1605-8e9c-4126-8956-b39a450ff101/download5baf669ef4e38765ff82c0982b991500MD55CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8908https://repositorio.uniandes.edu.co/bitstreams/bba858c7-fa89-4ee1-a595-dc428db2f51a/download0175ea4a2d4caec4bbcc37e300941108MD53LICENSElicense.txtlicense.txttext/plain; charset=utf-82535https://repositorio.uniandes.edu.co/bitstreams/472ac0bd-c28f-4cea-acb4-948b2e135c72/downloadae9e573a68e7f92501b6913cc846c39fMD54TEXTautorizacion tesis final.pdf.txtautorizacion tesis final.pdf.txtExtracted texttext/plain2051https://repositorio.uniandes.edu.co/bitstreams/6402f4fb-ff89-4b27-9f52-47f8bfa93a20/download1b296b0508437fa5deda4209aee61d6cMD56Análisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.txtAnálisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.txtExtracted texttext/plain41686https://repositorio.uniandes.edu.co/bitstreams/d4b627fd-894a-4cde-be09-84d7067fa31c/download81380ffe97743f3100d0e7ccbbe80e27MD58THUMBNAILautorizacion tesis final.pdf.jpgautorizacion tesis final.pdf.jpgGenerated Thumbnailimage/jpeg10955https://repositorio.uniandes.edu.co/bitstreams/db1247c3-b2f4-43f9-aac7-276d3e363c4b/download4d4cd1a1f87a2ca2aa437fea7895942eMD57Análisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.jpgAnálisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.jpgGenerated Thumbnailimage/jpeg5074https://repositorio.uniandes.edu.co/bitstreams/f68f4a4c-6583-4699-bebf-6a9cb9794fe4/download64d580971654008a4276fb5ff0ddfbbdMD591992/75472oai:repositorio.uniandes.edu.co:1992/754722025-03-05 10:02:10.714http://creativecommons.org/licenses/by/4.0/Attribution 4.0 Internationalopen.accesshttps://repositorio.uniandes.edu.coRepositorio institucional Sénecaadminrepositorio@uniandes.edu.coPGgzPjxzdHJvbmc+RGVzY2FyZ28gZGUgUmVzcG9uc2FiaWxpZGFkIC0gTGljZW5jaWEgZGUgQXV0b3JpemFjacOzbjwvc3Ryb25nPjwvaDM+CjxwPjxzdHJvbmc+UG9yIGZhdm9yIGxlZXIgYXRlbnRhbWVudGUgZXN0ZSBkb2N1bWVudG8gcXVlIHBlcm1pdGUgYWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBTw6luZWNhIHJlcHJvZHVjaXIgeSBkaXN0cmlidWlyIGxvcyByZWN1cnNvcyBkZSBpbmZvcm1hY2nDs24gZGVwb3NpdGFkb3MgbWVkaWFudGUgbGEgYXV0b3JpemFjacOzbiBkZSBsb3Mgc2lndWllbnRlcyB0w6lybWlub3M6PC9zdHJvbmc+PC9wPgo8cD5Db25jZWRhIGxhIGxpY2VuY2lhIGRlIGRlcMOzc2l0byBlc3TDoW5kYXIgc2VsZWNjaW9uYW5kbyBsYSBvcGNpw7NuIDxzdHJvbmc+J0FjZXB0YXIgbG9zIHTDqXJtaW5vcyBhbnRlcmlvcm1lbnRlIGRlc2NyaXRvcyc8L3N0cm9uZz4geSBjb250aW51YXIgZWwgcHJvY2VzbyBkZSBlbnbDrW8gbWVkaWFudGUgZWwgYm90w7NuIDxzdHJvbmc+J1NpZ3VpZW50ZScuPC9zdHJvbmc+PC9wPgo8aHI+CjxwPllvLCBlbiBtaSBjYWxpZGFkIGRlIGF1dG9yIGRlbCB0cmFiYWpvIGRlIHRlc2lzLCBtb25vZ3JhZsOtYSBvIHRyYWJham8gZGUgZ3JhZG8sIGhhZ28gZW50cmVnYSBkZWwgZWplbXBsYXIgcmVzcGVjdGl2byB5IGRlIHN1cyBhbmV4b3MgZGUgc2VyIGVsIGNhc28sIGVuIGZvcm1hdG8gZGlnaXRhbCB5L28gZWxlY3Ryw7NuaWNvIHkgYXV0b3Jpem8gYSBsYSBVbml2ZXJzaWRhZCBkZSBsb3MgQW5kZXMgcGFyYSBxdWUgcmVhbGljZSBsYSBwdWJsaWNhY2nDs24gZW4gZWwgU2lzdGVtYSBkZSBCaWJsaW90ZWNhcyBvIGVuIGN1YWxxdWllciBvdHJvIHNpc3RlbWEgbyBiYXNlIGRlIGRhdG9zIHByb3BpbyBvIGFqZW5vIGEgbGEgVW5pdmVyc2lkYWQgeSBwYXJhIHF1ZSBlbiBsb3MgdMOpcm1pbm9zIGVzdGFibGVjaWRvcyBlbiBsYSBMZXkgMjMgZGUgMTk4MiwgTGV5IDQ0IGRlIDE5OTMsIERlY2lzacOzbiBBbmRpbmEgMzUxIGRlIDE5OTMsIERlY3JldG8gNDYwIGRlIDE5OTUgeSBkZW3DoXMgbm9ybWFzIGdlbmVyYWxlcyBzb2JyZSBsYSBtYXRlcmlhLCB1dGlsaWNlIGVuIHRvZGFzIHN1cyBmb3JtYXMsIGxvcyBkZXJlY2hvcyBwYXRyaW1vbmlhbGVzIGRlIHJlcHJvZHVjY2nDs24sIGNvbXVuaWNhY2nDs24gcMO6YmxpY2EsIHRyYW5zZm9ybWFjacOzbiB5IGRpc3RyaWJ1Y2nDs24gKGFscXVpbGVyLCBwcsOpc3RhbW8gcMO6YmxpY28gZSBpbXBvcnRhY2nDs24pIHF1ZSBtZSBjb3JyZXNwb25kZW4gY29tbyBjcmVhZG9yIGRlIGxhIG9icmEgb2JqZXRvIGRlbCBwcmVzZW50ZSBkb2N1bWVudG8uPC9wPgo8cD5MYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGVtaXRlIGVuIGNhbGlkYWQgZGUgYXV0b3IgZGUgbGEgb2JyYSBvYmpldG8gZGVsIHByZXNlbnRlIGRvY3VtZW50byB5IG5vIGNvcnJlc3BvbmRlIGEgY2VzacOzbiBkZSBkZXJlY2hvcywgc2lubyBhIGxhIGF1dG9yaXphY2nDs24gZGUgdXNvIGFjYWTDqW1pY28gZGUgY29uZm9ybWlkYWQgY29uIGxvIGFudGVyaW9ybWVudGUgc2XDsWFsYWRvLiBMYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGhhY2UgZXh0ZW5zaXZhIG5vIHNvbG8gYSBsYXMgZmFjdWx0YWRlcyB5IGRlcmVjaG9zIGRlIHVzbyBzb2JyZSBsYSBvYnJhIGVuIGZvcm1hdG8gbyBzb3BvcnRlIG1hdGVyaWFsLCBzaW5vIHRhbWJpw6luIHBhcmEgZm9ybWF0byBlbGVjdHLDs25pY28sIHkgZW4gZ2VuZXJhbCBwYXJhIGN1YWxxdWllciBmb3JtYXRvIGNvbm9jaWRvIG8gcG9yIGNvbm9jZXIuPC9wPgo8cD5FbCBhdXRvciwgbWFuaWZpZXN0YSBxdWUgbGEgb2JyYSBvYmpldG8gZGUgbGEgcHJlc2VudGUgYXV0b3JpemFjacOzbiBlcyBvcmlnaW5hbCB5IGxhIHJlYWxpesOzIHNpbiB2aW9sYXIgbyB1c3VycGFyIGRlcmVjaG9zIGRlIGF1dG9yIGRlIHRlcmNlcm9zLCBwb3IgbG8gdGFudG8sIGxhIG9icmEgZXMgZGUgc3UgZXhjbHVzaXZhIGF1dG9yw61hIHkgdGllbmUgbGEgdGl0dWxhcmlkYWQgc29icmUgbGEgbWlzbWEuPC9wPgo8cD5FbiBjYXNvIGRlIHByZXNlbnRhcnNlIGN1YWxxdWllciByZWNsYW1hY2nDs24gbyBhY2Npw7NuIHBvciBwYXJ0ZSBkZSB1biB0ZXJjZXJvIGVuIGN1YW50byBhIGxvcyBkZXJlY2hvcyBkZSBhdXRvciBzb2JyZSBsYSBvYnJhIGVuIGN1ZXN0acOzbiwgZWwgYXV0b3IgYXN1bWlyw6EgdG9kYSBsYSByZXNwb25zYWJpbGlkYWQsIHkgc2FsZHLDoSBkZSBkZWZlbnNhIGRlIGxvcyBkZXJlY2hvcyBhcXXDrSBhdXRvcml6YWRvcywgcGFyYSB0b2RvcyBsb3MgZWZlY3RvcyBsYSBVbml2ZXJzaWRhZCBhY3TDumEgY29tbyB1biB0ZXJjZXJvIGRlIGJ1ZW5hIGZlLjwvcD4KPHA+U2kgdGllbmUgYWxndW5hIGR1ZGEgc29icmUgbGEgbGljZW5jaWEsIHBvciBmYXZvciwgY29udGFjdGUgY29uIGVsIDxhIGhyZWY9Im1haWx0bzpiaWJsaW90ZWNhQHVuaWFuZGVzLmVkdS5jbyIgdGFyZ2V0PSJfYmxhbmsiPkFkbWluaXN0cmFkb3IgZGVsIFNpc3RlbWEuPC9hPjwvcD4K