1st Coordination Meeting of the Industrial Engineering Network

Programa MARCA - Mercosur

Internal communication notes over next steps in research areas of the network

Article submitted to BIS (Bank for International Settlements) to postulate to any call for university research initiative open in 2026.

The general narrative around an emerging theme called “the end of globalization.” is a fact that every day gaining followers .Evidence has been found regarding the responses that the US, Europe, and Japan are developing to address this paradigm.

  • The US has implemented Industry 5.0,

  • Europe has remained within Industry 4.0 but with greater resilience,

  • While Japan has responded with its advanced concept of Society 5.0, based on the pillars of quality, human centric perspective, and operational excellence. There are evidence in scientific publications or the press regarding measures that Latin America and the Caribbean needs considering adopt strategies in response to the end of globalization.

Why the globalization is ending?

Climate change timeline history

# Instalación de paquetes necesarios (descomenta si no los tienes)
# install.packages("ggplot2")
# install.packages("dplyr")
# install.packages("ggtext")
options(warn = -1)
library(ggplot2)

suppressPackageStartupMessages(library(dplyr))

suppressWarnings(library(ggtext))

# Datos de las Conferencias COP
cop_data <- data.frame(
  year = c(1997, 2005, 2007, 2009, 2011, 2012, 2015, 2021, 2024, 2025),
  event = c("COP3", "COP11/MOP1", "COP13", "COP15", "COP17", "COP18", "COP21", "COP26", "COP29", "COP30"),
  title = c(
    "Protocolo de Kioto",
    "Entrada en vigor de Kioto",
    "Plan de Acción de Bali",
    "Acuerdo de Copenhague",
    "Plataforma de Durban",
    "Enmienda de Doha",
    "Acuerdo de París",
    "Pacto de Glasgow",
    "COP29",
    "COP30"
  ),
  location = c(
    "Kioto, Japón",
    "Montreal, Canadá",
    "Bali, Indonesia",
    "Copenhague, Dinamarca",
    "Durban, Sudáfrica",
    "Doha, Catar",
    "París, Francia",
    "Glasgow, Reino Unido",
    "Bakú, Azerbaiyán",
    "Belém, Brasil"
  ),
  description = c(
    "Metas vinculantes de reducción de\nemisiones 6-8% vs 1990",
    "Primera reunión de las Partes\ndel protocolo. +10,000 delegados",
    "Cronograma para el marco post-2012.\nGrupo de acción cooperativa",
    "192 países. Compromiso de\n$30 mil millones 2010-2012",
    "Negociaciones para acuerdo vinculante.\nFondo Verde $100 mil millones",
    "Segundo período de compromiso\nKioto 2013-2020",
    "Mantener calentamiento <2°C.\nParticipación universal",
    "Primer balance global del\nAcuerdo de París. +40,000 participantes",
    "Acuerdo de $300,000 millones\nanuales para países en desarrollo",
    "Prevista para noviembre 2025.\nNuevas NDCs 3.0"
  ),
  highlight = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE),
  side = c("left", "right", "left", "right", "left", "right", "left", "right", "left", "right")
)

# Crear el gráfico
p <- ggplot(cop_data, aes(x = year, y = 0)) +
  
  # Línea de tiempo central
  geom_segment(aes(x = min(year), xend = max(year), y = 0, yend = 0),
               color = "#667eea", size = 1.5, lineend = "round") +
  
  # Puntos en la línea de tiempo
  geom_point(aes(color = highlight), size = 8, show.legend = FALSE) +
  scale_color_manual(values = c("TRUE" = "#e74c3c", "FALSE" = "#667eea")) +
  
  # Líneas conectoras a las cajas de texto
  geom_segment(data = cop_data %>% filter(side == "left"),
               aes(x = year, xend = year, y = 0, yend = 0.3),
               color = "#667eea", size = 0.8, linetype = "solid") +
  geom_segment(data = cop_data %>% filter(side == "right"),
               aes(x = year, xend = year, y = 0, yend = -0.3),
               color = "#667eea", size = 0.8, linetype = "solid") +
  
  # Cajas de eventos (lado izquierdo/arriba)
  geom_label(data = cop_data %>% filter(side == "left"),
             aes(x = year, y = 0.35, 
                 label = paste0("**", year, " - ", title, "**\n",
                               "📍 ", location, "\n\n",
                               description),
                 fill = highlight),
             hjust = 0.5, vjust = 0, size = 3.5,
             lineheight = 0.9, label.padding = unit(0.5, "lines"),
             label.size = 0.5, show.legend = FALSE) +
  
  # Cajas de eventos (lado derecho/abajo)
  geom_label(data = cop_data %>% filter(side == "right"),
             aes(x = year, y = -0.35, 
                 label = paste0("**", year, " - ", title, "**\n",
                               "📍 ", location, "\n\n",
                               description),
                 fill = highlight),
             hjust = 0.5, vjust = 1, size = 3.5,
             lineheight = 0.9, label.padding = unit(0.5, "lines"),
             label.size = 0.5, show.legend = FALSE) +
  
  scale_fill_manual(values = c("TRUE" = "#667eea", "FALSE" = "#ecf0f1")) +
  
  # Etiquetas de años en la línea
  geom_text(aes(label = year), y = -0.05, vjust = 1.5, 
            size = 3, fontface = "bold", color = "#2c3e50") +
  
  # Configuración de escalas y tema
  scale_x_continuous(breaks = cop_data$year, limits = c(1995, 2027)) +
  scale_y_continuous(limits = c(-0.8, 0.8)) +
  
  labs(
    title = "🌍 UN Climate Change Conference UNCCC",
    subtitle = "Del Protocolo de Kioto (1997) a la COP30 (2025)",
    caption = "Fuente: UNFCCC | Eventos destacados: Kioto, París y COP30"
  ) +
  
  theme_minimal() +
  theme(
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5, 
                              color = "#2c3e50", margin = margin(b = 5)),
    plot.subtitle = element_text(size = 14, hjust = 0.5, 
                                 color = "#7f8c8d", margin = margin(b = 20)),
    plot.caption = element_text(size = 10, color = "#95a5a6", hjust = 0.5,
                               margin = margin(t = 20)),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    panel.grid = element_blank(),
    plot.background = element_rect(fill = "#f8f9fa", color = NA),
    panel.background = element_rect(fill = "#f8f9fa", color = NA),
    plot.margin = margin(30, 30, 30, 30)
  )

# Mostrar el gráfico
print(p)

# Guardar el gráfico (opcional)
# ggsave("timeline_cop_conferencias.png", plot = p, 
#        width = 16, height = 10, dpi = 300, bg = "#f8f9fa")
suppressPackageStartupMessages(library(kableExtra))
# kable(cop_data[ ,1:5], format = "html")
cop_data[ ,1:5] %>%
  kbl() %>%
  kable_material(c("striped", "hover"))
year event title location description
1997 COP3 Protocolo de Kioto Kioto, Japón Metas vinculantes de reducción de emisiones 6-8% vs 1990
2005 COP11/MOP1 Entrada en vigor de Kioto Montreal, Canadá Primera reunión de las Partes del protocolo. +10,000 delegados
2007 COP13 Plan de Acción de Bali Bali, Indonesia Cronograma para el marco post-2012. Grupo de acción cooperativa
2009 COP15 Acuerdo de Copenhague Copenhague, Dinamarca 192 países. Compromiso de $30 mil millones 2010-2012
2011 COP17 Plataforma de Durban Durban, Sudáfrica Negociaciones para acuerdo vinculante. Fondo Verde $100 mil millones
2012 COP18 Enmienda de Doha Doha, Catar Segundo período de compromiso Kioto 2013-2020
2015 COP21 Acuerdo de París París, Francia Mantener calentamiento <2°C. Participación universal
2021 COP26 Pacto de Glasgow Glasgow, Reino Unido Primer balance global del Acuerdo de París. +40,000 participantes
2024 COP29 COP29 Bakú, Azerbaiyán Acuerdo de $300,000 millones anuales para países en desarrollo
2025 COP30 COP30 Belém, Brasil Prevista para noviembre 2025. Nuevas NDCs 3.0

Metrics of the globalization

Those are the so-called “end of globalization” metrics.

Offshoring

Offshoring is the practice of relocating a business process, manufacturing, or service to a distant foreign country, typically to take advantage of lower labor costs or other economic benefits (environmental).

  • Location: A country far from the company’s home country (e.g., a U.S. company moving manufacturing to China or a European company moving IT support to India).

  • Primary Motivation: Significant cost savings, access to specialized skills, and global market expansion.

  • Trade-offs: Potential for long supply chains, significant time zone differences, cultural/language barriers, and reduced supply chain visibility/control.


Re-shoring (also called Onshoring)

Re-shoring is the process of bringing business operations, production, or services back to the company’s original home country after they were previously moved overseas (offshored).

  • Location: The company’s home country.

  • Primary Motivation: Increasing supply chain resilience and control, reducing lead times, improving product quality oversight, avoiding geopolitical risks, and leveraging the “Made in [Home Country]” appeal.

  • Trade-offs: Generally involves higher labor and operational costs compared to offshore locations.


Near-shoring

Near-shoring involves relocating business operations or services to a nearby foreign country, typically one that is geographically proximate, often sharing a border or being within a close time zone.

  • Location: A neighboring or geographically close country (e.g., a U.S. company moving production to Mexico or a French company moving IT to Romania).

  • Primary Motivation: Seeking a balance between cost savings (lower costs than the home country) and the benefits of proximity, such as shorter shipping times, fewer time zone issues, and easier communication and travel for oversight.

  • Trade-offs: Costs are typically lower than re-shoring but potentially higher than far-off offshoring. The goal is to mitigate the complexity and risk associated with long-distance offshoring while still achieving some cost advantages

One man is One man everywhere

Think of the developing countries vs developed ones.

* A US citizen emits seven times more than a European citizen. China proposes reducing emissions based on quotas per country.


* A Chinese citizen emits 15 times less than a European, but uses coal. Furthermore, they have a huge population. The US proposes reducing China's emissions and quality without altering its own emition rate. (MAGA)


* India has lowered its energy intensity (TOE vs. GDP), proposing that one man equals one man. Developed countries have already "burned" their share of fuel. Then their need to reduce his emissions and allow developing countries to close the inequality gap.

The role of hegemonic powers

There are hundreds of examples throughout history of what happens when a hegemonic power disappears (the Roman Empire). There is a transition period with wars and a dramatic reduction in "international" trade.
It is a painful process that requires a change in **culture** until the new power manages to establish itself. The hegemonic power that tends to disappear uses a **copy of the strategies** that allowed the emerging power to grow.**Trust** is also lost between strategic partners.
The US is breaking ties with Europe. It wants to become great again by imitating the economic processes of Industry 2.0. It's closing its doors to brains. It doesn't support electric cars or 5G.
It create Industry 5.0 in Silicon Valley and operate only with tariffs that impact the global supply chains.

The end of globalization

The “end of globalization” is a widely discussed concept suggesting that the deep, fast, and extensive integration of the world’s economies, cultures, and politics—a process known as globalization—is slowing down, stagnating, or even reversing.

1- Rise of Economic Nationalism and Protectionism

2- Trade Wars and Tariffs

3- Populist Backlash

4- Growing erosion of institutionalism (including Western democracies)

5- Supply Chain Vulnerability

6- Shocks and Disruptions: Major events like the 2008 financial crisis, the COVID-19 pandemic, and the Russia-Ukraine war exposed the fragility of highly optimized, just-in-time global supply chains.

7- Focus on Resilience

Development Traps in Our Latin America and the Caribbean

*low capacity for growth,

*high inequality and low social mobility,

*low institutional capacity and ineffective governance.

What are universities in the world doing for?

  • The Industry 4.0 in European Union (4ht Revolution)

  • The Industry 5.0 (not e revolution)

  • Japan: “Society 5.0” intrapreneurship

Summary: What LAC is Considering and Doing

  1. Promoting nearshoring / attracting relocated investment — policies and incentives to capture companies seeking to relocate parts of their supply chains closer to the U.S. or final markets (tax incentives, special economic zones, investment promotion campaigns). This is a direct response to the reconfiguration of global value chains.

  2. Renewed industrial policies (active industrial policy) — several countries are launching or updating strategies to foster industrialization, productive linkages, and technological upgrading (support for clusters, public procurement, sectoral targeting). UNIDO and ECLAC document this resurgence of industrial activism in the region.

  3. Strengthening logistics and port infrastructure / improving export competitiveness — investments in ports, transport corridors, and customs facilitation to capture regional trade and nearshoring flows (often discussed as a prerequisite to benefit from production relocations).

  4. Diversification of markets and suppliers (not just “going local”) — rather than total disconnection, many strategies aim to diversify trading partners and sources, creating “multi-vector” connections — especially with North America and Asia, depending on opportunities. UNCTAD and BIS show that chains are diversifying rather than simply “deglobalizing.”

  5. Focus on productive capabilities and human capital — programs for workforce training, SME digitalization, and selective adoption of Industry 4.0/5.0 technologies to raise productivity and attract higher-value investment. Documented in OECD, IDB, and ECLAC reports.

  6. Regional integration and policy coordination — initiatives (UNCTAD, CAF, BID, etc.) promoting coordinated industrial and trade policies to create stronger regional value chains.

  7. Focus on his oun Operational Excellence

  8. Not to delve deeper into entrepreneurship think on INTRApreneurship (See the inventor of the blue LED in Japan or the inventor of the QR code)


Examples by Countries / Subregions (Evidence)

  • Mexico: explicit nearshoring strategy, with multilateral support (e.g., IDB) to attract manufacturing investment to southern and southeastern regions; infrastructure and training programs.

  • Central America / Dominican Republic / Panama / Costa Rica: gaining share in certain supply chains (logistics, services, medical technologies), improving free trade zones and port capacity. BIS and regional studies highlight these trends.

  • Brazil, Colombia, Chile, Peru: reactivation of industrial policy (national reindustrialization or sectoral strategies) to add local value (health, pharmaceuticals, auto components, renewable energy). UNIDO and ECLAC analyze these initiatives.


How This Fits within the “End of Globalization” Narrative

The evidence points not to a collapse of international trade but rather to a reconfiguration: greater emphasis on resilience, diversification, and strategic regionalization (nearshoring/friendshoring), combined with the use of public policy to seize opportunities. UNCTAD and BIS show that supply chains are diversifying and that nearshoring is real, though selective.


Key Sources (for Citation)

  • Inter-American Development Bank (IDB): studies and briefs on nearshoring potential and benefiting sectors (automotive, textiles, pharmaceuticals, renewables).
  • UNIDO: policy briefs on the “new era” of industrial policy in LAC (2021–2024 plans, priorities, and nearshoring opportunities).
  • UNCTAD: reports on global trade status and supply chain reconfiguration (2024–2025).
  • BIS (Bank for International Settlements): macroeconomic evidence of U.S. import shifts from China toward Mexico and other countries.
  • CAF (Development Bank of Latin America): regional documents and papers on LAC’s preparedness for the new global value chain geometry.

Recommendations readings for Your Article (Angles and Structure)

  1. Contrast with the U.S. / EU / Japan responses — you already have those:

    • U.S.: Industry 5.0 / reindustrialization

    • EU: Resilient Industry 4.0

    • Japan: Society 5.0

      For LAC, show that the response is more pragmatic and selective: nearshoring + industrial policy + logistics improvement (with fiscal and institutional constraints).

LS0tCnRpdGxlOiAiVGhlIGVuZCBvZiBnbG9iYWxpemF0aW9uIElJIgphdXRob3I6ICJSLlBhbG1hIDxyaWNhcmRvLnJwYWxtYUBnbWFpbC5jb20+IgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpjc2w6IGFwYS5jc2wKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgMXN0IENvb3JkaW5hdGlvbiBNZWV0aW5nIG9mIHRoZSBJbmR1c3RyaWFsIEVuZ2luZWVyaW5nIE5ldHdvcmsKCiMjIFByb2dyYW1hIE1BUkNBIC0gTWVyY29zdXIKCiMjIyBJbnRlcm5hbCBjb21tdW5pY2F0aW9uIG5vdGVzIG92ZXIgbmV4dCBzdGVwcyBpbiByZXNlYXJjaCBhcmVhcyBvZiB0aGUgbmV0d29yawoKQXJ0aWNsZSBzdWJtaXR0ZWQgdG8gQklTIChCYW5rIGZvciBJbnRlcm5hdGlvbmFsIFNldHRsZW1lbnRzKSB0byBwb3N0dWxhdGUgdG8gYW55IGNhbGwgZm9yIHVuaXZlcnNpdHkgcmVzZWFyY2ggaW5pdGlhdGl2ZSBvcGVuIGluIDIwMjYuCgpUaGUgZ2VuZXJhbCBuYXJyYXRpdmUgYXJvdW5kIGFuIGVtZXJnaW5nIHRoZW1lIGNhbGxlZCAqKiJ0aGUgZW5kIG9mIGdsb2JhbGl6YXRpb24uIioqIGlzIGEgZmFjdCB0aGF0IGV2ZXJ5IGRheSBnYWluaW5nIGZvbGxvd2VycyAuRXZpZGVuY2UgaGFzIGJlZW4gZm91bmQgcmVnYXJkaW5nIHRoZSByZXNwb25zZXMgdGhhdCB0aGUgVVMsIEV1cm9wZSwgYW5kIEphcGFuIGFyZSBkZXZlbG9waW5nIHRvIGFkZHJlc3MgdGhpcyBwYXJhZGlnbS4KCi0gICBUaGUgVVMgaGFzIGltcGxlbWVudGVkIEluZHVzdHJ5IDUuMCwKCi0gICBFdXJvcGUgaGFzIHJlbWFpbmVkIHdpdGhpbiBJbmR1c3RyeSA0LjAgYnV0IHdpdGggZ3JlYXRlciByZXNpbGllbmNlLAoKLSAgIFdoaWxlIEphcGFuIGhhcyByZXNwb25kZWQgd2l0aCBpdHMgYWR2YW5jZWQgY29uY2VwdCBvZiBTb2NpZXR5IDUuMCwgYmFzZWQgb24gdGhlIHBpbGxhcnMgb2YgcXVhbGl0eSwgaHVtYW4gY2VudHJpYyBwZXJzcGVjdGl2ZSwgYW5kIG9wZXJhdGlvbmFsIGV4Y2VsbGVuY2UuIFRoZXJlIGFyZSBldmlkZW5jZSBpbiBzY2llbnRpZmljIHB1YmxpY2F0aW9ucyBvciB0aGUgcHJlc3MgcmVnYXJkaW5nIG1lYXN1cmVzIHRoYXQgTGF0aW4gQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbiBuZWVkcyBjb25zaWRlcmluZyBhZG9wdCBzdHJhdGVnaWVzIGluIHJlc3BvbnNlIHRvIHRoZSBlbmQgb2YgZ2xvYmFsaXphdGlvbi4KCldoeSB0aGUgZ2xvYmFsaXphdGlvbiBpcyBlbmRpbmc/CgojIENsaW1hdGUgY2hhbmdlIHRpbWVsaW5lIGhpc3RvcnkKCmBgYHtyIH0KIyBJbnN0YWxhY2nDs24gZGUgcGFxdWV0ZXMgbmVjZXNhcmlvcyAoZGVzY29tZW50YSBzaSBubyBsb3MgdGllbmVzKQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3RleHQiKQpvcHRpb25zKHdhcm4gPSAtMSkKbGlicmFyeShnZ3Bsb3QyKQoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoZHBseXIpKQoKc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KGdndGV4dCkpCgojIERhdG9zIGRlIGxhcyBDb25mZXJlbmNpYXMgQ09QCmNvcF9kYXRhIDwtIGRhdGEuZnJhbWUoCiAgeWVhciA9IGMoMTk5NywgMjAwNSwgMjAwNywgMjAwOSwgMjAxMSwgMjAxMiwgMjAxNSwgMjAyMSwgMjAyNCwgMjAyNSksCiAgZXZlbnQgPSBjKCJDT1AzIiwgIkNPUDExL01PUDEiLCAiQ09QMTMiLCAiQ09QMTUiLCAiQ09QMTciLCAiQ09QMTgiLCAiQ09QMjEiLCAiQ09QMjYiLCAiQ09QMjkiLCAiQ09QMzAiKSwKICB0aXRsZSA9IGMoCiAgICAiUHJvdG9jb2xvIGRlIEtpb3RvIiwKICAgICJFbnRyYWRhIGVuIHZpZ29yIGRlIEtpb3RvIiwKICAgICJQbGFuIGRlIEFjY2nDs24gZGUgQmFsaSIsCiAgICAiQWN1ZXJkbyBkZSBDb3BlbmhhZ3VlIiwKICAgICJQbGF0YWZvcm1hIGRlIER1cmJhbiIsCiAgICAiRW5taWVuZGEgZGUgRG9oYSIsCiAgICAiQWN1ZXJkbyBkZSBQYXLDrXMiLAogICAgIlBhY3RvIGRlIEdsYXNnb3ciLAogICAgIkNPUDI5IiwKICAgICJDT1AzMCIKICApLAogIGxvY2F0aW9uID0gYygKICAgICJLaW90bywgSmFww7NuIiwKICAgICJNb250cmVhbCwgQ2FuYWTDoSIsCiAgICAiQmFsaSwgSW5kb25lc2lhIiwKICAgICJDb3BlbmhhZ3VlLCBEaW5hbWFyY2EiLAogICAgIkR1cmJhbiwgU3Vkw6FmcmljYSIsCiAgICAiRG9oYSwgQ2F0YXIiLAogICAgIlBhcsOtcywgRnJhbmNpYSIsCiAgICAiR2xhc2dvdywgUmVpbm8gVW5pZG8iLAogICAgIkJha8O6LCBBemVyYmFpecOhbiIsCiAgICAiQmVsw6ltLCBCcmFzaWwiCiAgKSwKICBkZXNjcmlwdGlvbiA9IGMoCiAgICAiTWV0YXMgdmluY3VsYW50ZXMgZGUgcmVkdWNjacOzbiBkZVxuZW1pc2lvbmVzIDYtOCUgdnMgMTk5MCIsCiAgICAiUHJpbWVyYSByZXVuacOzbiBkZSBsYXMgUGFydGVzXG5kZWwgcHJvdG9jb2xvLiArMTAsMDAwIGRlbGVnYWRvcyIsCiAgICAiQ3Jvbm9ncmFtYSBwYXJhIGVsIG1hcmNvIHBvc3QtMjAxMi5cbkdydXBvIGRlIGFjY2nDs24gY29vcGVyYXRpdmEiLAogICAgIjE5MiBwYcOtc2VzLiBDb21wcm9taXNvIGRlXG4kMzAgbWlsIG1pbGxvbmVzIDIwMTAtMjAxMiIsCiAgICAiTmVnb2NpYWNpb25lcyBwYXJhIGFjdWVyZG8gdmluY3VsYW50ZS5cbkZvbmRvIFZlcmRlICQxMDAgbWlsIG1pbGxvbmVzIiwKICAgICJTZWd1bmRvIHBlcsOtb2RvIGRlIGNvbXByb21pc29cbktpb3RvIDIwMTMtMjAyMCIsCiAgICAiTWFudGVuZXIgY2FsZW50YW1pZW50byA8MsKwQy5cblBhcnRpY2lwYWNpw7NuIHVuaXZlcnNhbCIsCiAgICAiUHJpbWVyIGJhbGFuY2UgZ2xvYmFsIGRlbFxuQWN1ZXJkbyBkZSBQYXLDrXMuICs0MCwwMDAgcGFydGljaXBhbnRlcyIsCiAgICAiQWN1ZXJkbyBkZSAkMzAwLDAwMCBtaWxsb25lc1xuYW51YWxlcyBwYXJhIHBhw61zZXMgZW4gZGVzYXJyb2xsbyIsCiAgICAiUHJldmlzdGEgcGFyYSBub3ZpZW1icmUgMjAyNS5cbk51ZXZhcyBORENzIDMuMCIKICApLAogIGhpZ2hsaWdodCA9IGMoVFJVRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUpLAogIHNpZGUgPSBjKCJsZWZ0IiwgInJpZ2h0IiwgImxlZnQiLCAicmlnaHQiLCAibGVmdCIsICJyaWdodCIsICJsZWZ0IiwgInJpZ2h0IiwgImxlZnQiLCAicmlnaHQiKQopCgojIENyZWFyIGVsIGdyw6FmaWNvCnAgPC0gZ2dwbG90KGNvcF9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSAwKSkgKwogIAogICMgTMOtbmVhIGRlIHRpZW1wbyBjZW50cmFsCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gbWluKHllYXIpLCB4ZW5kID0gbWF4KHllYXIpLCB5ID0gMCwgeWVuZCA9IDApLAogICAgICAgICAgICAgICBjb2xvciA9ICIjNjY3ZWVhIiwgc2l6ZSA9IDEuNSwgbGluZWVuZCA9ICJyb3VuZCIpICsKICAKICAjIFB1bnRvcyBlbiBsYSBsw61uZWEgZGUgdGllbXBvCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBoaWdobGlnaHQpLCBzaXplID0gOCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9ICIjZTc0YzNjIiwgIkZBTFNFIiA9ICIjNjY3ZWVhIikpICsKICAKICAjIEzDrW5lYXMgY29uZWN0b3JhcyBhIGxhcyBjYWphcyBkZSB0ZXh0bwogIGdlb21fc2VnbWVudChkYXRhID0gY29wX2RhdGEgJT4lIGZpbHRlcihzaWRlID09ICJsZWZ0IiksCiAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgeGVuZCA9IHllYXIsIHkgPSAwLCB5ZW5kID0gMC4zKSwKICAgICAgICAgICAgICAgY29sb3IgPSAiIzY2N2VlYSIsIHNpemUgPSAwLjgsIGxpbmV0eXBlID0gInNvbGlkIikgKwogIGdlb21fc2VnbWVudChkYXRhID0gY29wX2RhdGEgJT4lIGZpbHRlcihzaWRlID09ICJyaWdodCIpLAogICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHhlbmQgPSB5ZWFyLCB5ID0gMCwgeWVuZCA9IC0wLjMpLAogICAgICAgICAgICAgICBjb2xvciA9ICIjNjY3ZWVhIiwgc2l6ZSA9IDAuOCwgbGluZXR5cGUgPSAic29saWQiKSArCiAgCiAgIyBDYWphcyBkZSBldmVudG9zIChsYWRvIGl6cXVpZXJkby9hcnJpYmEpCiAgZ2VvbV9sYWJlbChkYXRhID0gY29wX2RhdGEgJT4lIGZpbHRlcihzaWRlID09ICJsZWZ0IiksCiAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSAwLjM1LCAKICAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKioiLCB5ZWFyLCAiIC0gIiwgdGl0bGUsICIqKlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLwn5ONICIsIGxvY2F0aW9uLCAiXG5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiksCiAgICAgICAgICAgICAgICAgZmlsbCA9IGhpZ2hsaWdodCksCiAgICAgICAgICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLCBzaXplID0gMy41LAogICAgICAgICAgICAgbGluZWhlaWdodCA9IDAuOSwgbGFiZWwucGFkZGluZyA9IHVuaXQoMC41LCAibGluZXMiKSwKICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAKICAjIENhamFzIGRlIGV2ZW50b3MgKGxhZG8gZGVyZWNoby9hYmFqbykKICBnZW9tX2xhYmVsKGRhdGEgPSBjb3BfZGF0YSAlPiUgZmlsdGVyKHNpZGUgPT0gInJpZ2h0IiksCiAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSAtMC4zNSwgCiAgICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIioqIiwgeWVhciwgIiAtICIsIHRpdGxlLCAiKipcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi8J+TjSAiLCBsb2NhdGlvbiwgIlxuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pLAogICAgICAgICAgICAgICAgIGZpbGwgPSBoaWdobGlnaHQpLAogICAgICAgICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMSwgc2l6ZSA9IDMuNSwKICAgICAgICAgICAgIGxpbmVoZWlnaHQgPSAwLjksIGxhYmVsLnBhZGRpbmcgPSB1bml0KDAuNSwgImxpbmVzIiksCiAgICAgICAgICAgICBsYWJlbC5zaXplID0gMC41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiVFJVRSIgPSAiIzY2N2VlYSIsICJGQUxTRSIgPSAiI2VjZjBmMSIpKSArCiAgCiAgIyBFdGlxdWV0YXMgZGUgYcOxb3MgZW4gbGEgbMOtbmVhCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHllYXIpLCB5ID0gLTAuMDUsIHZqdXN0ID0gMS41LCAKICAgICAgICAgICAgc2l6ZSA9IDMsIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMmMzZTUwIikgKwogIAogICMgQ29uZmlndXJhY2nDs24gZGUgZXNjYWxhcyB5IHRlbWEKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gY29wX2RhdGEkeWVhciwgbGltaXRzID0gYygxOTk1LCAyMDI3KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDAuOCkpICsKICAKICBsYWJzKAogICAgdGl0bGUgPSAi8J+MjSBVTiBDbGltYXRlIENoYW5nZSBDb25mZXJlbmNlIFVOQ0NDIiwKICAgIHN1YnRpdGxlID0gIkRlbCBQcm90b2NvbG8gZGUgS2lvdG8gKDE5OTcpIGEgbGEgQ09QMzAgKDIwMjUpIiwKICAgIGNhcHRpb24gPSAiRnVlbnRlOiBVTkZDQ0MgfCBFdmVudG9zIGRlc3RhY2Fkb3M6IEtpb3RvLCBQYXLDrXMgeSBDT1AzMCIKICApICsKICAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzJjM2U1MCIsIG1hcmdpbiA9IG1hcmdpbihiID0gNSkpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGhqdXN0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzdmOGM4ZCIsIG1hcmdpbiA9IG1hcmdpbihiID0gMjApKSwKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG9yID0gIiM5NWE1YTYiLCBoanVzdCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMjApKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZjhmOWZhIiwgY29sb3IgPSBOQSksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y4ZjlmYSIsIGNvbG9yID0gTkEpLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMzAsIDMwLCAzMCwgMzApCiAgKQoKIyBNb3N0cmFyIGVsIGdyw6FmaWNvCnByaW50KHApCgojIEd1YXJkYXIgZWwgZ3LDoWZpY28gKG9wY2lvbmFsKQojIGdnc2F2ZSgidGltZWxpbmVfY29wX2NvbmZlcmVuY2lhcy5wbmciLCBwbG90ID0gcCwgCiMgICAgICAgIHdpZHRoID0gMTYsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDAsIGJnID0gIiNmOGY5ZmEiKQpgYGAKCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShrYWJsZUV4dHJhKSkKIyBrYWJsZShjb3BfZGF0YVsgLDE6NV0sIGZvcm1hdCA9ICJodG1sIikKY29wX2RhdGFbICwxOjVdICU+JQogIGtibCgpICU+JQogIGthYmxlX21hdGVyaWFsKGMoInN0cmlwZWQiLCAiaG92ZXIiKSkKCmBgYAoKIyMgTWV0cmljcyBvZiB0aGUgZ2xvYmFsaXphdGlvbgoKVGhvc2UgYXJlIHRoZSBzby1jYWxsZWQgImVuZCBvZiBnbG9iYWxpemF0aW9uIiBtZXRyaWNzLgoKIVtdKGltYWdlbi9yZXNob3JpbmcucG5nKQoKIyMjIE9mZnNob3JpbmcKCioqT2Zmc2hvcmluZyoqIGlzIHRoZSBwcmFjdGljZSBvZiByZWxvY2F0aW5nIGEgYnVzaW5lc3MgcHJvY2VzcywgbWFudWZhY3R1cmluZywgb3Igc2VydmljZSB0byBhIGRpc3RhbnQgZm9yZWlnbiBjb3VudHJ5LCB0eXBpY2FsbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbG93ZXIgbGFib3IgY29zdHMgb3Igb3RoZXIgZWNvbm9taWMgYmVuZWZpdHMgKGVudmlyb25tZW50YWwpLgoKLSAgICoqTG9jYXRpb246KiogQSBjb3VudHJ5IGZhciBmcm9tIHRoZSBjb21wYW55J3MgaG9tZSBjb3VudHJ5IChlLmcuLCBhIFUuUy4gY29tcGFueSBtb3ZpbmcgbWFudWZhY3R1cmluZyB0byBDaGluYSBvciBhIEV1cm9wZWFuIGNvbXBhbnkgbW92aW5nIElUIHN1cHBvcnQgdG8gSW5kaWEpLgoKLSAgICoqUHJpbWFyeSBNb3RpdmF0aW9uOioqIFNpZ25pZmljYW50IGNvc3Qgc2F2aW5ncywgYWNjZXNzIHRvIHNwZWNpYWxpemVkIHNraWxscywgYW5kIGdsb2JhbCBtYXJrZXQgZXhwYW5zaW9uLgoKLSAgICoqVHJhZGUtb2ZmczoqKiBQb3RlbnRpYWwgZm9yIGxvbmcgc3VwcGx5IGNoYWlucywgc2lnbmlmaWNhbnQgdGltZSB6b25lIGRpZmZlcmVuY2VzLCBjdWx0dXJhbC9sYW5ndWFnZSBiYXJyaWVycywgYW5kIHJlZHVjZWQgc3VwcGx5IGNoYWluIHZpc2liaWxpdHkvY29udHJvbC4KCjxocj4KCiMjIyBSZS1zaG9yaW5nIChhbHNvIGNhbGxlZCBPbnNob3JpbmcpCgoqKlJlLXNob3JpbmcqKiBpcyB0aGUgcHJvY2VzcyBvZiBicmluZ2luZyBidXNpbmVzcyBvcGVyYXRpb25zLCBwcm9kdWN0aW9uLCBvciBzZXJ2aWNlcyBiYWNrIHRvIHRoZSBjb21wYW55J3Mgb3JpZ2luYWwgaG9tZSBjb3VudHJ5IGFmdGVyIHRoZXkgd2VyZSBwcmV2aW91c2x5IG1vdmVkIG92ZXJzZWFzIChvZmZzaG9yZWQpLgoKLSAgICoqTG9jYXRpb246KiogVGhlIGNvbXBhbnkncyBob21lIGNvdW50cnkuCgotICAgKipQcmltYXJ5IE1vdGl2YXRpb246KiogSW5jcmVhc2luZyBzdXBwbHkgY2hhaW4gcmVzaWxpZW5jZSBhbmQgY29udHJvbCwgcmVkdWNpbmcgbGVhZCB0aW1lcywgaW1wcm92aW5nIHByb2R1Y3QgcXVhbGl0eSBvdmVyc2lnaHQsIGF2b2lkaW5nIGdlb3BvbGl0aWNhbCByaXNrcywgYW5kIGxldmVyYWdpbmcgdGhlICJNYWRlIGluIFtIb21lIENvdW50cnldIiBhcHBlYWwuCgotICAgKipUcmFkZS1vZmZzOioqIEdlbmVyYWxseSBpbnZvbHZlcyBoaWdoZXIgbGFib3IgYW5kIG9wZXJhdGlvbmFsIGNvc3RzIGNvbXBhcmVkIHRvIG9mZnNob3JlIGxvY2F0aW9ucy4KCjxocj4KCiMjIyBOZWFyLXNob3JpbmcKCioqTmVhci1zaG9yaW5nKiogaW52b2x2ZXMgcmVsb2NhdGluZyBidXNpbmVzcyBvcGVyYXRpb25zIG9yIHNlcnZpY2VzIHRvIGEgbmVhcmJ5IGZvcmVpZ24gY291bnRyeSwgdHlwaWNhbGx5IG9uZSB0aGF0IGlzIGdlb2dyYXBoaWNhbGx5IHByb3hpbWF0ZSwgb2Z0ZW4gc2hhcmluZyBhIGJvcmRlciBvciBiZWluZyB3aXRoaW4gYSBjbG9zZSB0aW1lIHpvbmUuCgotICAgKipMb2NhdGlvbjoqKiBBIG5laWdoYm9yaW5nIG9yIGdlb2dyYXBoaWNhbGx5IGNsb3NlIGNvdW50cnkgKGUuZy4sIGEgVS5TLiBjb21wYW55IG1vdmluZyBwcm9kdWN0aW9uIHRvIE1leGljbyBvciBhIEZyZW5jaCBjb21wYW55IG1vdmluZyBJVCB0byBSb21hbmlhKS4KCi0gICAqKlByaW1hcnkgTW90aXZhdGlvbjoqKiBTZWVraW5nIGEgYmFsYW5jZSBiZXR3ZWVuIGNvc3Qgc2F2aW5ncyAobG93ZXIgY29zdHMgdGhhbiB0aGUgaG9tZSBjb3VudHJ5KSBhbmQgdGhlIGJlbmVmaXRzIG9mIHByb3hpbWl0eSwgc3VjaCBhcyBzaG9ydGVyIHNoaXBwaW5nIHRpbWVzLCBmZXdlciB0aW1lIHpvbmUgaXNzdWVzLCBhbmQgZWFzaWVyIGNvbW11bmljYXRpb24gYW5kIHRyYXZlbCBmb3Igb3ZlcnNpZ2h0LgoKLSAgICoqVHJhZGUtb2ZmczoqKiBDb3N0cyBhcmUgdHlwaWNhbGx5IGxvd2VyIHRoYW4gcmUtc2hvcmluZyBidXQgcG90ZW50aWFsbHkgaGlnaGVyIHRoYW4gZmFyLW9mZiBvZmZzaG9yaW5nLiBUaGUgZ29hbCBpcyB0byBtaXRpZ2F0ZSB0aGUgY29tcGxleGl0eSBhbmQgcmlzayBhc3NvY2lhdGVkIHdpdGggbG9uZy1kaXN0YW5jZSBvZmZzaG9yaW5nIHdoaWxlIHN0aWxsIGFjaGlldmluZyBzb21lIGNvc3QgYWR2YW50YWdlcwoKIyMgT25lIG1hbiBpcyBPbmUgbWFuIGV2ZXJ5d2hlcmUKClRoaW5rIG9mIHRoZSBkZXZlbG9waW5nIGNvdW50cmllcyB2cyBkZXZlbG9wZWQgb25lcy4KCmBgYCAgICAgICAgIAoqIEEgVVMgY2l0aXplbiBlbWl0cyBzZXZlbiB0aW1lcyBtb3JlIHRoYW4gYSBFdXJvcGVhbiBjaXRpemVuLiBDaGluYSBwcm9wb3NlcyByZWR1Y2luZyBlbWlzc2lvbnMgYmFzZWQgb24gcXVvdGFzIHBlciBjb3VudHJ5LgoKCiogQSBDaGluZXNlIGNpdGl6ZW4gZW1pdHMgMTUgdGltZXMgbGVzcyB0aGFuIGEgRXVyb3BlYW4sIGJ1dCB1c2VzIGNvYWwuIEZ1cnRoZXJtb3JlLCB0aGV5IGhhdmUgYSBodWdlIHBvcHVsYXRpb24uIFRoZSBVUyBwcm9wb3NlcyByZWR1Y2luZyBDaGluYSdzIGVtaXNzaW9ucyBhbmQgcXVhbGl0eSB3aXRob3V0IGFsdGVyaW5nIGl0cyBvd24gZW1pdGlvbiByYXRlLiAoTUFHQSkKCgoqIEluZGlhIGhhcyBsb3dlcmVkIGl0cyBlbmVyZ3kgaW50ZW5zaXR5IChUT0UgdnMuIEdEUCksIHByb3Bvc2luZyB0aGF0IG9uZSBtYW4gZXF1YWxzIG9uZSBtYW4uIERldmVsb3BlZCBjb3VudHJpZXMgaGF2ZSBhbHJlYWR5ICJidXJuZWQiIHRoZWlyIHNoYXJlIG9mIGZ1ZWwuIFRoZW4gdGhlaXIgbmVlZCB0byByZWR1Y2UgaGlzIGVtaXNzaW9ucyBhbmQgYWxsb3cgZGV2ZWxvcGluZyBjb3VudHJpZXMgdG8gY2xvc2UgdGhlIGluZXF1YWxpdHkgZ2FwLgpgYGAKCiMgVGhlIHJvbGUgb2YgaGVnZW1vbmljIHBvd2VycwoKIVtdKGltYWdlcy9jbGlwYm9hcmQtMTM1Mjg5ODc1Ny5wbmcpCgohW10oaW1hZ2VzL2NsaXBib2FyZC0xNTA3OTA2MDg3LnBuZykKCiFbXShpbWFnZXMvY2xpcGJvYXJkLTE1MTI2NjE3Ny5wbmcpCgohW10oaW1hZ2VzL2NsaXBib2FyZC0zMDM0MTY0NTY2LnBuZykKCgoKYGBgICAgICAgICAgClRoZXJlIGFyZSBodW5kcmVkcyBvZiBleGFtcGxlcyB0aHJvdWdob3V0IGhpc3Rvcnkgb2Ygd2hhdCBoYXBwZW5zIHdoZW4gYSBoZWdlbW9uaWMgcG93ZXIgZGlzYXBwZWFycyAodGhlIFJvbWFuIEVtcGlyZSkuIFRoZXJlIGlzIGEgdHJhbnNpdGlvbiBwZXJpb2Qgd2l0aCB3YXJzIGFuZCBhIGRyYW1hdGljIHJlZHVjdGlvbiBpbiAiaW50ZXJuYXRpb25hbCIgdHJhZGUuCmBgYAoKYGBgICAgICAgICAgCkl0IGlzIGEgcGFpbmZ1bCBwcm9jZXNzIHRoYXQgcmVxdWlyZXMgYSBjaGFuZ2UgaW4gKipjdWx0dXJlKiogdW50aWwgdGhlIG5ldyBwb3dlciBtYW5hZ2VzIHRvIGVzdGFibGlzaCBpdHNlbGYuIFRoZSBoZWdlbW9uaWMgcG93ZXIgdGhhdCB0ZW5kcyB0byBkaXNhcHBlYXIgdXNlcyBhICoqY29weSBvZiB0aGUgc3RyYXRlZ2llcyoqIHRoYXQgYWxsb3dlZCB0aGUgZW1lcmdpbmcgcG93ZXIgdG8gZ3Jvdy4qKlRydXN0KiogaXMgYWxzbyBsb3N0IGJldHdlZW4gc3RyYXRlZ2ljIHBhcnRuZXJzLgpgYGAKCmBgYCAgICAgICAgIApUaGUgVVMgaXMgYnJlYWtpbmcgdGllcyB3aXRoIEV1cm9wZS4gSXQgd2FudHMgdG8gYmVjb21lIGdyZWF0IGFnYWluIGJ5IGltaXRhdGluZyB0aGUgZWNvbm9taWMgcHJvY2Vzc2VzIG9mIEluZHVzdHJ5IDIuMC4gSXQncyBjbG9zaW5nIGl0cyBkb29ycyB0byBicmFpbnMuIEl0IGRvZXNuJ3Qgc3VwcG9ydCBlbGVjdHJpYyBjYXJzIG9yIDVHLgpgYGAKCmBgYCAgICAgICAgIApJdCBjcmVhdGUgSW5kdXN0cnkgNS4wIGluIFNpbGljb24gVmFsbGV5IGFuZCBvcGVyYXRlIG9ubHkgd2l0aCB0YXJpZmZzIHRoYXQgaW1wYWN0IHRoZSBnbG9iYWwgc3VwcGx5IGNoYWlucy4KYGBgCgojIyBUaGUgZW5kIG9mIGdsb2JhbGl6YXRpb24KClRoZSAqKiJlbmQgb2YgZ2xvYmFsaXphdGlvbiIqKiBpcyBhIHdpZGVseSBkaXNjdXNzZWQgY29uY2VwdCBzdWdnZXN0aW5nIHRoYXQgdGhlIGRlZXAsIGZhc3QsIGFuZCBleHRlbnNpdmUgaW50ZWdyYXRpb24gb2YgdGhlIHdvcmxkJ3MgZWNvbm9taWVzLCBjdWx0dXJlcywgYW5kIHBvbGl0aWNz4oCUYSBwcm9jZXNzIGtub3duIGFzIGdsb2JhbGl6YXRpb27igJRpcyBzbG93aW5nIGRvd24sIHN0YWduYXRpbmcsIG9yIGV2ZW4gcmV2ZXJzaW5nLgoKMS0gUmlzZSBvZiBFY29ub21pYyBOYXRpb25hbGlzbSBhbmQgUHJvdGVjdGlvbmlzbQoKMi0gVHJhZGUgV2FycyBhbmQgVGFyaWZmcwoKMy0gUG9wdWxpc3QgQmFja2xhc2gKCjQtIEdyb3dpbmcgZXJvc2lvbiBvZiBpbnN0aXR1dGlvbmFsaXNtIChpbmNsdWRpbmcgV2VzdGVybiBkZW1vY3JhY2llcykKCjUtIFN1cHBseSBDaGFpbiBWdWxuZXJhYmlsaXR5Cgo2LSBTaG9ja3MgYW5kIERpc3J1cHRpb25zOiBNYWpvciBldmVudHMgbGlrZSB0aGUgMjAwOCBmaW5hbmNpYWwgY3Jpc2lzLCB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIGFuZCB0aGUgUnVzc2lhLVVrcmFpbmUgd2FyIGV4cG9zZWQgdGhlIGZyYWdpbGl0eSBvZiBoaWdobHkgb3B0aW1pemVkLCBqdXN0LWluLXRpbWUgZ2xvYmFsIHN1cHBseSBjaGFpbnMuCgo3LSBGb2N1cyBvbiBSZXNpbGllbmNlCgojIERldmVsb3BtZW50IFRyYXBzIGluIE91ciBMYXRpbiBBbWVyaWNhIGFuZCB0aGUgQ2FyaWJiZWFuCgpcKmxvdyBjYXBhY2l0eSBmb3IgZ3Jvd3RoLAoKXCpoaWdoIGluZXF1YWxpdHkgYW5kIGxvdyBzb2NpYWwgbW9iaWxpdHksCgpcKmxvdyBpbnN0aXR1dGlvbmFsIGNhcGFjaXR5IGFuZCBpbmVmZmVjdGl2ZSBnb3Zlcm5hbmNlLgoKIyBXaGF0IGFyZSB1bml2ZXJzaXRpZXMgaW4gdGhlIHdvcmxkIGRvaW5nIGZvcj8KCi0gICBUaGUgSW5kdXN0cnkgNC4wIGluIEV1cm9wZWFuIFVuaW9uICg0aHQgUmV2b2x1dGlvbikKCi0gICBUaGUgSW5kdXN0cnkgNS4wIChub3QgZSByZXZvbHV0aW9uKQoKLSAgIEphcGFuOiAiU29jaWV0eSA1LjAiIGludHJhcHJlbmV1cnNoaXAKCiMjIFN1bW1hcnk6IFdoYXQgTEFDIGlzIENvbnNpZGVyaW5nIGFuZCBEb2luZwoKMS4gICoqUHJvbW90aW5nIG5lYXJzaG9yaW5nIC8gYXR0cmFjdGluZyByZWxvY2F0ZWQgaW52ZXN0bWVudCoqIOKAlCBwb2xpY2llcyBhbmQgaW5jZW50aXZlcyB0byBjYXB0dXJlIGNvbXBhbmllcyBzZWVraW5nIHRvIHJlbG9jYXRlIHBhcnRzIG9mIHRoZWlyIHN1cHBseSBjaGFpbnMgY2xvc2VyIHRvIHRoZSBVLlMuIG9yIGZpbmFsIG1hcmtldHMgKHRheCBpbmNlbnRpdmVzLCBzcGVjaWFsIGVjb25vbWljIHpvbmVzLCBpbnZlc3RtZW50IHByb21vdGlvbiBjYW1wYWlnbnMpLiBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlIHRvIHRoZSByZWNvbmZpZ3VyYXRpb24gb2YgZ2xvYmFsIHZhbHVlIGNoYWlucy4KCjIuICAqKlJlbmV3ZWQgaW5kdXN0cmlhbCBwb2xpY2llcyAoYWN0aXZlIGluZHVzdHJpYWwgcG9saWN5KSoqIOKAlCBzZXZlcmFsIGNvdW50cmllcyBhcmUgbGF1bmNoaW5nIG9yIHVwZGF0aW5nIHN0cmF0ZWdpZXMgdG8gZm9zdGVyIGluZHVzdHJpYWxpemF0aW9uLCBwcm9kdWN0aXZlIGxpbmthZ2VzLCBhbmQgdGVjaG5vbG9naWNhbCB1cGdyYWRpbmcgKHN1cHBvcnQgZm9yIGNsdXN0ZXJzLCBwdWJsaWMgcHJvY3VyZW1lbnQsIHNlY3RvcmFsIHRhcmdldGluZykuIFVOSURPIGFuZCBFQ0xBQyBkb2N1bWVudCB0aGlzIHJlc3VyZ2VuY2Ugb2YgaW5kdXN0cmlhbCBhY3RpdmlzbSBpbiB0aGUgcmVnaW9uLgoKMy4gICoqU3RyZW5ndGhlbmluZyBsb2dpc3RpY3MgYW5kIHBvcnQgaW5mcmFzdHJ1Y3R1cmUgLyBpbXByb3ZpbmcgZXhwb3J0IGNvbXBldGl0aXZlbmVzcyoqIOKAlCBpbnZlc3RtZW50cyBpbiBwb3J0cywgdHJhbnNwb3J0IGNvcnJpZG9ycywgYW5kIGN1c3RvbXMgZmFjaWxpdGF0aW9uIHRvIGNhcHR1cmUgcmVnaW9uYWwgdHJhZGUgYW5kIG5lYXJzaG9yaW5nIGZsb3dzIChvZnRlbiBkaXNjdXNzZWQgYXMgYSBwcmVyZXF1aXNpdGUgdG8gYmVuZWZpdCBmcm9tIHByb2R1Y3Rpb24gcmVsb2NhdGlvbnMpLgoKNC4gICoqRGl2ZXJzaWZpY2F0aW9uIG9mIG1hcmtldHMgYW5kIHN1cHBsaWVycyAobm90IGp1c3Qg4oCcZ29pbmcgbG9jYWzigJ0pKiog4oCUIHJhdGhlciB0aGFuIHRvdGFsIGRpc2Nvbm5lY3Rpb24sIG1hbnkgc3RyYXRlZ2llcyBhaW0gdG8gZGl2ZXJzaWZ5IHRyYWRpbmcgcGFydG5lcnMgYW5kIHNvdXJjZXMsIGNyZWF0aW5nIOKAnG11bHRpLXZlY3RvcuKAnSBjb25uZWN0aW9ucyDigJQgZXNwZWNpYWxseSB3aXRoIE5vcnRoIEFtZXJpY2EgYW5kIEFzaWEsIGRlcGVuZGluZyBvbiBvcHBvcnR1bml0aWVzLiBVTkNUQUQgYW5kIEJJUyBzaG93IHRoYXQgY2hhaW5zIGFyZSBkaXZlcnNpZnlpbmcgcmF0aGVyIHRoYW4gc2ltcGx5IOKAnGRlZ2xvYmFsaXppbmcu4oCdCgo1LiAgKipGb2N1cyBvbiBwcm9kdWN0aXZlIGNhcGFiaWxpdGllcyBhbmQgaHVtYW4gY2FwaXRhbCoqIOKAlCBwcm9ncmFtcyBmb3Igd29ya2ZvcmNlIHRyYWluaW5nLCBTTUUgZGlnaXRhbGl6YXRpb24sIGFuZCBzZWxlY3RpdmUgYWRvcHRpb24gb2YgSW5kdXN0cnkgNC4wLzUuMCB0ZWNobm9sb2dpZXMgdG8gcmFpc2UgcHJvZHVjdGl2aXR5IGFuZCBhdHRyYWN0IGhpZ2hlci12YWx1ZSBpbnZlc3RtZW50LiBEb2N1bWVudGVkIGluIE9FQ0QsIElEQiwgYW5kIEVDTEFDIHJlcG9ydHMuCgo2LiAgKipSZWdpb25hbCBpbnRlZ3JhdGlvbiBhbmQgcG9saWN5IGNvb3JkaW5hdGlvbioqIOKAlCBpbml0aWF0aXZlcyAoVU5DVEFELCBDQUYsIEJJRCwgZXRjLikgcHJvbW90aW5nIGNvb3JkaW5hdGVkIGluZHVzdHJpYWwgYW5kIHRyYWRlIHBvbGljaWVzIHRvIGNyZWF0ZSBzdHJvbmdlciByZWdpb25hbCB2YWx1ZSBjaGFpbnMuCgo3LiAqKkZvY3VzIG9uIGhpcyBvdW4gT3BlcmF0aW9uYWwgRXhjZWxsZW5jZSoqIAoKOC4gKipOb3QgdG8gZGVsdmUgZGVlcGVyIGludG8gZW50cmVwcmVuZXVyc2hpcCoqIHRoaW5rIG9uIElOVFJBcHJlbmV1cnNoaXAgKFNlZSB0aGUgaW52ZW50b3Igb2YgdGhlIGJsdWUgTEVEIGluIEphcGFuIG9yIHRoZSBpbnZlbnRvciBvZiB0aGUgUVIgY29kZSkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgRXhhbXBsZXMgYnkgQ291bnRyaWVzIC8gU3VicmVnaW9ucyAoRXZpZGVuY2UpCgotICAgKipNZXhpY286KiogZXhwbGljaXQgbmVhcnNob3Jpbmcgc3RyYXRlZ3ksIHdpdGggbXVsdGlsYXRlcmFsIHN1cHBvcnQgKGUuZy4sIElEQikgdG8gYXR0cmFjdCBtYW51ZmFjdHVyaW5nIGludmVzdG1lbnQgdG8gc291dGhlcm4gYW5kIHNvdXRoZWFzdGVybiByZWdpb25zOyBpbmZyYXN0cnVjdHVyZSBhbmQgdHJhaW5pbmcgcHJvZ3JhbXMuCgotICAgKipDZW50cmFsIEFtZXJpY2EgLyBEb21pbmljYW4gUmVwdWJsaWMgLyBQYW5hbWEgLyBDb3N0YSBSaWNhOioqIGdhaW5pbmcgc2hhcmUgaW4gY2VydGFpbiBzdXBwbHkgY2hhaW5zIChsb2dpc3RpY3MsIHNlcnZpY2VzLCBtZWRpY2FsIHRlY2hub2xvZ2llcyksIGltcHJvdmluZyBmcmVlIHRyYWRlIHpvbmVzIGFuZCBwb3J0IGNhcGFjaXR5LiBCSVMgYW5kIHJlZ2lvbmFsIHN0dWRpZXMgaGlnaGxpZ2h0IHRoZXNlIHRyZW5kcy4KCi0gICAqKkJyYXppbCwgQ29sb21iaWEsIENoaWxlLCBQZXJ1OioqIHJlYWN0aXZhdGlvbiBvZiBpbmR1c3RyaWFsIHBvbGljeSAobmF0aW9uYWwgcmVpbmR1c3RyaWFsaXphdGlvbiBvciBzZWN0b3JhbCBzdHJhdGVnaWVzKSB0byBhZGQgbG9jYWwgdmFsdWUgKGhlYWx0aCwgcGhhcm1hY2V1dGljYWxzLCBhdXRvIGNvbXBvbmVudHMsIHJlbmV3YWJsZSBlbmVyZ3kpLiBVTklETyBhbmQgRUNMQUMgYW5hbHl6ZSB0aGVzZSBpbml0aWF0aXZlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgSG93IFRoaXMgRml0cyB3aXRoaW4gdGhlIOKAnEVuZCBvZiBHbG9iYWxpemF0aW9u4oCdIE5hcnJhdGl2ZQoKVGhlIGV2aWRlbmNlIHBvaW50cyAqKm5vdCB0byBhIGNvbGxhcHNlKiogb2YgaW50ZXJuYXRpb25hbCB0cmFkZSBidXQgcmF0aGVyIHRvIGEgKipyZWNvbmZpZ3VyYXRpb24qKjogZ3JlYXRlciBlbXBoYXNpcyBvbiByZXNpbGllbmNlLCBkaXZlcnNpZmljYXRpb24sIGFuZCAqKnN0cmF0ZWdpYyByZWdpb25hbGl6YXRpb24qKiAoKm5lYXJzaG9yaW5nL2ZyaWVuZHNob3JpbmcqKSwgY29tYmluZWQgd2l0aCB0aGUgdXNlIG9mIHB1YmxpYyBwb2xpY3kgdG8gc2VpemUgb3Bwb3J0dW5pdGllcy4gVU5DVEFEIGFuZCBCSVMgc2hvdyB0aGF0IHN1cHBseSBjaGFpbnMgYXJlIGRpdmVyc2lmeWluZyBhbmQgdGhhdCBuZWFyc2hvcmluZyBpcyByZWFsLCB0aG91Z2ggc2VsZWN0aXZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBLZXkgU291cmNlcyAoZm9yIENpdGF0aW9uKQoKLSAgICoqSW50ZXItQW1lcmljYW4gRGV2ZWxvcG1lbnQgQmFuayAoSURCKToqKiBzdHVkaWVzIGFuZCBicmllZnMgb24gbmVhcnNob3JpbmcgcG90ZW50aWFsIGFuZCBiZW5lZml0aW5nIHNlY3RvcnMgKGF1dG9tb3RpdmUsIHRleHRpbGVzLCBwaGFybWFjZXV0aWNhbHMsIHJlbmV3YWJsZXMpLgotICAgKipVTklETzoqKiBwb2xpY3kgYnJpZWZzIG9uIHRoZSDigJxuZXcgZXJh4oCdIG9mIGluZHVzdHJpYWwgcG9saWN5IGluIExBQyAoMjAyMeKAkzIwMjQgcGxhbnMsIHByaW9yaXRpZXMsIGFuZCBuZWFyc2hvcmluZyBvcHBvcnR1bml0aWVzKS4KLSAgICoqVU5DVEFEOioqIHJlcG9ydHMgb24gZ2xvYmFsIHRyYWRlIHN0YXR1cyBhbmQgc3VwcGx5IGNoYWluIHJlY29uZmlndXJhdGlvbiAoMjAyNOKAkzIwMjUpLgotICAgKipCSVMgKEJhbmsgZm9yIEludGVybmF0aW9uYWwgU2V0dGxlbWVudHMpOioqIG1hY3JvZWNvbm9taWMgZXZpZGVuY2Ugb2YgVS5TLiBpbXBvcnQgc2hpZnRzIGZyb20gQ2hpbmEgdG93YXJkIE1leGljbyBhbmQgb3RoZXIgY291bnRyaWVzLgotICAgKipDQUYgKERldmVsb3BtZW50IEJhbmsgb2YgTGF0aW4gQW1lcmljYSk6KiogcmVnaW9uYWwgZG9jdW1lbnRzIGFuZCBwYXBlcnMgb24gTEFD4oCZcyBwcmVwYXJlZG5lc3MgZm9yIHRoZSBuZXcgZ2xvYmFsIHZhbHVlIGNoYWluIGdlb21ldHJ5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBSZWNvbW1lbmRhdGlvbnMgcmVhZGluZ3MgZm9yIFlvdXIgQXJ0aWNsZSAoQW5nbGVzIGFuZCBTdHJ1Y3R1cmUpCgoxLiAgKipDb250cmFzdCB3aXRoIHRoZSBVLlMuIC8gRVUgLyBKYXBhbiByZXNwb25zZXMqKiDigJQgeW91IGFscmVhZHkgaGF2ZSB0aG9zZToKCiAgICAtICAgVS5TLjogKkluZHVzdHJ5IDUuMCogLyByZWluZHVzdHJpYWxpemF0aW9uCgogICAgLSAgIEVVOiAqUmVzaWxpZW50IEluZHVzdHJ5IDQuMCoKCiAgICAtICAgSmFwYW46ICpTb2NpZXR5IDUuMCoKCiAgICAgICAgRm9yIExBQywgc2hvdyB0aGF0IHRoZSByZXNwb25zZSBpcyAqKm1vcmUgcHJhZ21hdGljIGFuZCBzZWxlY3RpdmUqKjogKm5lYXJzaG9yaW5nICsgaW5kdXN0cmlhbCBwb2xpY3kgKyBsb2dpc3RpY3MgaW1wcm92ZW1lbnQqICh3aXRoIGZpc2NhbCBhbmQgaW5zdGl0dXRpb25hbCBjb25zdHJhaW50cykuCg==