Parte 1 — Câmbio, inflação e poder de compra
1.1 A dinâmica inflacionária e o papel do câmbio na economia
brasileira
A estabilidade de preços no Brasil é um tema central para a condução
da política macroeconômica, figurando como condição prévia para o
crescimento sustentável e o bem-estar social. Em uma economia aberta e
fortemente integrada aos mercados globais de matérias-primas, a variação
da taxa de câmbio (Dólar Ptax) desempenha um papel determinante na
formação de preços domésticos.
O canal de transmissão cambial, conhecido na literatura econômica
como pass-through, opera não apenas de forma direta sobre os bens
comercializáveis (tradables), mas também indireta, ao impactar custos de
insumos produtivos, fertilizantes, energia e combustíveis ao longo de
toda a cadeia de suprimentos.
Contudo, a transmissão do choque cambial para os preços ao consumidor
não ocorre de maneira simultânea ou homogênea. Existe uma defasagem
temporal inerente aos processos de renegociação de contratos, estoques e
margens de lucro das empresas. Além disso, as flutuações da taxa de
câmbio e dos preços das commodities internacionais geram impactos
redistributivos assimétricos entre as diferentes faixas de renda da
população, de modo que enquanto famílias de menor renda comprometem
parcela expressiva de seus orçamentos com bens essenciais e alimentação
no domicílio — itens altamente suscetíveis a choques cambiais —,
famílias de maior renda destinam proporções mais elevadas do seu consumo
a serviços, cuja dinâmica inflacionária é dominada pela rigidez
salarial, mercado de trabalho interno e inércia contratual.
Diante desse cenário, este relatório analisa a trajetória da inflação
oficial (IPCA) e seus determinantes sob a ótica da transmissão cambial e
da heterogeneidade social. Esse estudo mapeia o tempo de resposta e a
magnitude dos choques de taxa de câmbio sobre a inflação geral,
investigando como a variação do dólar afeta diferencialmente as famílias
brasileiras de acordo com suas faixas de renda e estruturas de
consumo.
1.3 Interação entre inflação e câmbio
Sabe-se que a inflação é uma variável defasada em relação a ciclos
econômicos. Podemos perceber juntamente essa característica quando
olhamos para sua relação com o dólar.
Gráfico 1.1 — Trajetória de curto prazo: dólar Ptax vs. IPCA
mensal e a hipótese da defasagem
As oscilações do Dólar Ptax exibem volatilidade elevada de curto
prazo, que podem ser originadas da procura de moedas estrangeiras em um
mercado global. Quando há mais pessoas querendo comprar uma moeda, o
preço dela sobe; quando há mais pessoas querendo vender, o preço cai. A
inflação, por sua vez, tende a ter menor volatilidade, principalmente
graças a políticas monetárias, ou seja, intervenções do governo que
buscam controlar a oferta de moeda para manter a inflação dentro da
meta.
A alta do dólar pressiona a inflação no Brasil porque encarece
produtos importados, matérias-primas e mercadorias cotadas em moeda
estrangeira, como combustíveis e alimentos.
Ao confrontar a trajetória da taxa de câmbio comercial (Dólar Ptax)
com a variação mensal do IPCA a partir de 2022, percebe-se que as altas
cambiais não se refletem instantaneamente no índice cheio de preços.
Essa assimetria temporal sustenta a hipótese da transmissão defasada do
câmbio (lagged pass-through).
A luz da teoria econômica, o repasse cambial para os preços finais é
amortecido por etapas operacionais da cadeia de suprimentos, como por
exemplo, a absorção inicial de insumos e compressão de margens, no qual
os produtos e comerciantes tendem a absorver parte da osciliação,
reduzindo seu lucro para preservar volume de vendas. O aumento de custos
repassa gradativamente para as etiquetas do varejo, atingindo o índice
cheio de inflação consumida pelas famílias.
Para testar estatisticamente a existência e a duração dessa
defasagem, utilizaremos a função de correlação cruzada entre o retorno
logarítmico mensal do Dólar Ptax (t) e a variação mensal do IPCA
(t+k).
1.4 Causalidade estrutural e dinâmica temporal: correlação cruzada,
modelo VAR e função impulso-resposta (IRF)
Gráfico 1.2 — Correlação cruzada entre o retorno do dólar e o
IPCA
A função de correlação cruzada entre o retorno mensal do dólar e o
IPCA evidencia uma dinâmica temporal não contemporânea. As correlações
são negativas nos períodos de 0 a 2 meses após a variação cambial,
tornando-se positivas a partir do terceiro mês. A maior correlação
ocorre no quinto mês após o movimento cambial, com coeficiente de 0,432,
enquanto no sexto mês permanece positiva (0,262).
Esse padrão sugere uma associação temporal defasada entre movimentos
cambiais e inflação, compatível com a hipótese de que parte da
transmissão do câmbio aos preços ocorre gradualmente. Entretanto, a
correlação cruzada não permite, isoladamente, identificar relação de
causalidade, controlar por outros choques de oferta/demanda nem
quantificar o coeficiente exato de pass-through.
Para ir além da associação linear e isolar a relação de causalidade
entre as variáveis, estimou-se um modelo de Vetores Autorregressivos de
ordem 3 — VAR(3) — utilizando dados trimestrais que relacionam a
variação cambial (Δe) e a taxa trimestral do IPCA (IPCA_tri). A Função
Impulso-Resposta (IRF) gerada pelo modelo permite simular o
comportamento da inflação ao longo de 12 trimestres diante de um choque
não antecipado de desvalorização do câmbio.
Gráfico 1.3 — Função impulso-resposta: resposta do IPCA a um
choque cambial

A resposta da inflação acelera intensamente no 2º trimestre após o
choque, atingindo seu ponto máximo em +0,40. Esse resultado confirma
formalmente o padrão observado na correlação cruzada: como 2 trimestres
correspondem a aproximadamente 5 a 6 meses, este é o intervalo exato
necessário para que o aumento de custos dos insumos importados e
commodities perpasse integralmente a cadeia produtiva e chegue às
etiquetas do varejo. Além disso, nota-se que no trimestre 2 o intervalo
de confiança de 95% (sombra cinza) fica inteiramente acima da linha de
zero, comprovando que o impacto positivo do câmbio sobre a inflação é
estatisticamente significante
Com isso, a evidência empírica obtida confirma que o câmbio opera
como um choque de oferta exógeno relevante no Brasil. A transmissão não
é imediata, exibindo uma defasagem estrutural de cerca de dois
trimestres até atingir seu impacto máximo no IPCA, para então
dissipar-se gradualmente ao longo dos anos subsequentes.
1.5 Análise distributiva da inflação: heterogeneidade do impacto por
faixa de renda
A análise dos agregados macroeconômicos e a identificação do
pass-through cambial via modelo VAR demonstram que choques na taxa de
câmbio alteram a trajetória do IPCA cheio de forma defasada. No entanto,
o índice geral oculta disparidades cruciais na experiência inflacionária
das famílias. Uma vez que o padrão de consumo varia significativamente
conforme o nível de rendimento, os choques de preços — especialmente
aqueles oriundos do câmbio e das commodities — não impactam a população
de forma homogênea.
Para compreender a dinâmica de transmissão da inflação para o poder
de compra e a redistribuição da renda real, esta seção analisa a
trajetória do IPCA desagregado por faixas socioeconômicas (com dados do
Ipea), investigando as assimetrias na composição da cesta de consumo, a
inversão de patamares observada em 2026 e a sensibilidade do grupo de
alimentos frente às oscilações cambiais.
1.6 A inversão estrutural por faixa de renda
Em momentos de choque de oferta — como desvalorizações cambiais
acentuadas ou quebras de safra —, a inflação costuma penalizar mais
severamente as famílias de menor renda, que possuem baixa margem de
substituição na sua cesta de consumo. Contudo, quando o cenário
macroeconômico transita para um período de apreciação da moeda nacional
e arrefecimento das commodities agrícolas no mercado internacional, esse
canal de transmissão tende a se inverter. A redução dos custos de bens
comercializáveis (tradables) alivia a base da pirâmide, enquanto a
inflação do topo permanece atrelada à dinâmica do mercado de trabalho e
do setor de serviços (non-tradables).
Gráfico 1.4 — Inflação acumulada em 12 meses por faixa de
renda
Até meados de 2025, o comportamento das curvas refletia a
vulnerabilidade histórica da baixa renda. As faixas de Renda muito baixa
e Renda baixa registravam picos inflacionários mais acentuados —
superando 5,40% em meados de 2025 —, impulsionadas pela volatilidade dos
alimentos.
Em fevereiro de 2026, consolida-se uma inversão estrutural do padrão
histórico. A inflação acumulada para a classe de Renda muito baixa sofre
uma queda expressiva para 3,20% (vinda de 4,31% em janeiro/2026). Em
contrapartida, a inflação da Renda alta sobe para 4,60% no mesmo mês,
mantendo trajetória ascendente até atingir 5,26% em maio de 2026.
Essa divergência ocorre porque a apreciação do Real (queda do dólar)
observada no período atuou como uma âncora de preços para bens
comercializáveis (tradables). Alimentos e insumos importados, que
possuem peso desproporcional na cesta dos mais pobres, desaceleraram
rapidamente. Enquanto isso, a faixa de alta renda permaneceu pressionada
pela rigidez do setor de serviços e gastos discricionários.
Para avaliar se uma mudança na dinâmica cambial altera o patamar de
bem-estar das famílias de forma duradoura, a análise de curtíssimo prazo
(mês a mês) pode ser insuficiente devido a ruídos sazonais. A comparação
das médias acumuladas em janelas anuais homólogas (como o primeiro
quadrimestre/quinquênio de anos consecutivos) permite expurgar
sazonalidades e isolar o efeito cumulativo de um ciclo de valorização do
câmbio sobre a inflação média percebida por cada classe social.
Gráfico 1.5 — Inflação média por faixa de renda: jan–mai 2025
vs. jan–mai 2026
Nota-se que a média da inflação acumulada em 12 meses recuou em todas
as faixas socioeconômicas entre os dois períodos. Contudo, a magnitude
da queda foi decrescente à medida que se avança na pirâmide de
renda.
Na faixa de Renda muito baixa, a inflação média desceu de 4,99% em
2025 para 3,83% em 2026 — uma expressiva redução de 1,16p.p.. Já para a
Renda alta, a desaceleração foi marginal, passando de 5,26% para 4,80%
(queda de apenas 0,46p.p.).
O recuo do dólar ao longo de 12 meses aliviou a estrutura de custos
de bens físicos e insumos. Como a propensão marginal a consumir bens de
subsistência é maior nas faixas de menor renda, a queda nos preços dos
comercializáveis repassou um ganho relativo de poder de compra muito
superior para a base da pirâmide.
1.7 Anatomia da cesta de consumo
A heterogeneidade da taxa de inflação percebida não é um fenômeno
casual, mas o resultado direto das restrições orçamentárias das
famílias. Conforme a renda familiar aumenta, a proporção do orçamento
destinada a bens de primeira necessidade (como alimentação e moradia)
diminui, cedendo espaço para serviços, educação, saúde e lazer.
Gráfico 1.6 — Composição dos gastos das famílias por faixa de
renda
Como a taxa de câmbio afeta primariamente bens comercializáveis, as
diferenças nas estruturas de ponderação da Pesquisa de Orçamentos
Familiares (POF/IBGE) funcionam como o mecanismo de transmissão que
distribui os choques de preços de forma desigual.
Famílias de menor rendimento comprometem a maior fatia do seu
orçamento com os grupos Alimentação no Domicílio e Habitação/Energia.
Como os alimentos são bens comercializáveis internacionalmente, seus
preços domésticos são diretamente arbitrados pela taxa de câmbio e pelas
cotações das commodities globais em dólar. Contudo, as famílias de maior
renda direcionam parcela expressiva do consumo ao setor de Serviços
(educação privada, saúde, serviços pessoais e recreação) e Transportes.
Esses serviços são não comercializáveis internacionalmente
(non-tradables), e seus preços dependem da massa salarial doméstica, do
nível de emprego e da indexação contratual, exibindo elevada inércia
nominal.
1.8 Repasse cambial em alimentação no domicílio
A transmissão da taxa de câmbio para os preços dos alimentos no
varejo envolve cadeias globais de suprimentos e custos de produção do
agronegócio.
Embora o Brasil seja um dos maiores produtores agrícolas do mundo, a
estrutura produtiva do campo exige insumos cotados em moeda estrangeira,
tais como fertilizantes NPK, defensivos e combustível para maquinário.
Avaliar o coeficiente de repasse cambial especificamente sobre o grupo
de alimentação no domicílio é fundamental para mensurar a intensidade e
o tempo com que uma desvalorização da moeda se transforma em perda de
poder de compra na mesa da população.
O modelo de Projeções Locais estimado demonstra que o coeficiente de
repasse cambial (\(\beta_h\)) apresenta
caráter acumulativo ao longo do tempo. No horizonte de 12
meses, o coeficiente atinge \(\beta_{12} = 0,19\), indicando que uma
depreciação cambial de 10% se traduz em um aumento acumulado de
1,9 p.p. na inflação de alimentação no domicílio ao fim
de um ano. No horizonte de 24 meses, o impacto
acumulado atinge \(\beta_{24} =
0,37\).
A elevação da taxa de câmbio encarece o custo de produção agrícola
(cost-push effect), forçando o reajuste nos preços dos alimentos
processados e in natura, o que reduz desproporcionalmente o poder de
compra das classes vulneráveis.
Como referência metodológica, o Banco Central do Brasil estima
coeficientes de repasse cambial para o grupo de alimentação no domicílio
de aproximadamente 0,26 em 12 meses e
0,33 em 24 meses. A divergência moderada entre os
resultados da literatura oficial e os obtidos nesta análise é fruto do
grau de parcimônia da especificação utilizada.
A projeção local adotada seguiu uma especificação simplificada
controlando fundamentalmente pelas variações do câmbio e do índice
global de commodities:
\[\pi_{t,t+h}^{alim} = \alpha_h + \beta_h
\Delta \ln(Câmbio_t) + \gamma_h \Delta \ln(Commodity_t) +
\varepsilon_{t+h}\] Ao não incluir explicitamente variáveis de
controle adicionais — tais como medidas de hiato do produto, inércia
inflacionária defasada, expectativas de inflação (Focus) e choques
climáticos (como o efeito El Niño/La Niña) —, o modelo capta um sinal
direto do choque cambial sem filtrar interações de segunda ordem.
Contudo, apesar do menor número de covariáveis, o modelo simplificado
apresentou forte aderência empírica aos parâmetros do BACEN, preservando
a magnitude, o sinal e a trajetória de longo prazo do repasse cambial
sobre a cesta básica.
1.9 Divergência de canais: dólar, gasolina e serviços
Bens energéticos e combustíveis possuem preços ligados ao mercado
internacional e ao câmbio, transmitindo impulsos de alta volatilidade.
Por outro lado, o setor de serviços opera sob regras de indexação,
margens de demanda e negociações salariais.
O IPCA Gasolina apresenta forte co-movimentação com a taxa de câmbio.
Sendo uma commodity líquida internacional (petróleo), os reajustes nas
refinarias incorporam as variações do dólar, gerando repasses de alta
amplitude que afetam custos de transporte e frete. Já a série do IPCA
Serviços exibe estabilidade e descolamento em relação às oscilações de
curto prazo do dólar.
Por ser um setor intensivo em mão de obra interna e protegido da
competição internacional, o segmento de serviços não é beneficiado de
forma direta pelas apreciações do dólar. Como esses itens possuem maior
peso no consumo da alta renda, a inflação desse grupo permaneceu
sustentada por pressões salariais e demanda aquecida, explicando a
resiliência do IPCA no topo da distribuição de renda.
Parte 2 — Câmbio, emprego e rendimento nos setores
transacionáveis
A taxa de câmbio interfere no mercado de trabalho por caminhos que
podem atuar em direções opostas. Quando o real perde valor, empresas
exportadoras recebem mais reais por uma mesma receita obtida em moeda
estrangeira e os produtos importados que concorrem com a produção
nacional ficam mais caros. Essa combinação pode favorecer vendas,
produção e contratações. Ao mesmo tempo, a desvalorização encarece
máquinas, peças e insumos comprados no exterior, pressiona os custos e
pode reduzir a capacidade de contratar. O resultado sobre o emprego
depende de qual desses movimentos prevalece em cada setor, além do
comportamento da atividade econômica, dos preços internacionais, dos
juros e da produtividade.
2.1 Exposição comercial da Agropecuária e da Indústria geral
O primeiro passo é identificar como a Agropecuária e a Indústria
geral participam do comércio exterior brasileiro, pois uma mesma mudança
cambial pode produzir resultados diferentes conforme a posição comercial
do setor. Para isso, foram utilizados dois indicadores. O primeiro mede
a participação de cada setor nas exportações analisadas, enquanto o
segundo mostra quanto as importações representam na corrente de comércio
do próprio setor.
A participação nas exportações foi calculada pela razão entre o valor
exportado pelo setor e a soma das exportações da Agropecuária e da
Indústria geral:
\[
PE_s =
\frac{X_s}
{\displaystyle\sum_{j \in S} X_j}
\times 100
\]
em que \(X_s\) representa as
exportações do setor \(s\), e \(S\) corresponde ao conjunto formado pela
Agropecuária e pela Indústria geral.
A orientação importadora foi calculada pela participação das
importações na soma das exportações e importações do setor:
\[
OI_s =
\frac{M_s}
{X_s + M_s}
\times 100
\]
em que \(M_s\) representa as
importações. Esse indicador descreve a posição do setor em seu comércio
internacional, mas não mede diretamente quanto sua produção depende de
insumos importados, já que os dados do Comex Stat não informam o destino
produtivo de cada mercadoria comprada no exterior.
Gráfico 2.1 — Exposição cambial e perfil do trabalho nos
setores transacionáveis
O Gráfico 2.1 mostra que a Indústria geral respondeu por 77,6% das
exportações dos dois setores analisados em 2025, enquanto a Agropecuária
concentrou 22,4%. A diferença se torna ainda mais importante quando se
observa a orientação importadora. Na Agropecuária, as importações
representaram apenas 7,2% da corrente de comércio, ao passo que, na
Indústria geral, chegaram a 50,3%, praticamente o ponto de equilíbrio
entre compras e vendas externas.
Essa configuração indica que a Agropecuária apresenta uma exposição
comercial mais favorável aos ganhos de uma desvalorização, porque vende
ao exterior e importa relativamente pouco. A Indústria geral também pode
ganhar competitividade com o real mais fraco, mas enfrenta uma pressão
maior pelo lado das importações, sobretudo quando utiliza máquinas,
componentes e bens intermediários estrangeiros. O setor industrial ainda
reunia 13,3 milhões de ocupados e rendimento médio real de R$ 3.504,50,
diante de 7,9 milhões de trabalhadores e rendimento de R$ 2.307,75 na
Agropecuária, o que amplia o alcance das mudanças industriais sobre o
mercado de trabalho.
2.2 Câmbio real e nível de emprego
Depois de observar a exposição comercial, é necessário acompanhar
como o emprego dos dois setores se comportou ao longo das mudanças da
taxa de câmbio efetiva real. Essa medida considera a relação do real com
as moedas dos principais parceiros comerciais e também corrige as
diferenças de preços entre os países. Valores maiores representam
depreciação real do real, enquanto valores menores indicam
apreciação.
Como o câmbio e o número de pessoas ocupadas possuem unidades
diferentes, as séries foram transformadas em índices com base em 2012
igual a 100. Essa conversão preserva a variação de cada série e permite
comparar suas trajetórias sem recorrer a um segundo eixo:
\[
I_{v,t} =
\frac{V_t}
{V_{2012}}
\times 100
\]
em que \(V_t\) representa o valor da
variável no ano \(t\), podendo
corresponder à taxa de câmbio efetiva real ou ao número de pessoas
ocupadas em cada setor.
Gráfico 2.2 — Câmbio real e emprego nos setores
transacionáveis
A trajetória mostra que a depreciação real do câmbio não se converteu
automaticamente em mais empregos. Entre 2014 e 2016, o índice cambial
passou de aproximadamente 109 para 126, depois de alcançar 133 em 2015,
enquanto o emprego agropecuário recuou para 87,8 e o industrial caiu
para 88,8. A recessão brasileira daquele período reduziu a demanda e a
produção, limitando os possíveis ganhos cambiais. Em 2020 e 2021, o
câmbio chegou aos maiores níveis da série, próximos de 167 e 172, mas a
pandemia provocou uma queda intensa do emprego, sobretudo na Indústria
geral.
A partir de 2022, o câmbio real perdeu parte da alta anterior, porém
o emprego industrial se recuperou e alcançou 102,7 em 2025, ligeiramente
acima da base de 2012. Na Agropecuária ocorreu o contrário. O número de
ocupados terminou o período em 77,7, embora o setor fosse exportador e
pouco orientado às importações. A redução sugere que produtividade,
mecanização e reorganização da produção podem permitir aumento ou
manutenção da produção sem expansão equivalente do número de
trabalhadores.
Klein,
Schuh e Triest (2003) chegaram a uma conclusão compatível ao estudar
a indústria norte-americana. Os autores separaram criação e destruição
de postos de trabalho e observaram que os efeitos cambiais variavam
conforme a abertura comercial das atividades, além de não serem
simétricos. Uma apreciação podia acelerar a destruição de empregos sem
que uma depreciação posterior gerasse uma recuperação de igual tamanho.
Isso ajuda a compreender por que os picos cambiais do Gráfico 2.2 não
são acompanhados por movimentos proporcionais do emprego brasileiro.
2.3 Câmbio nominal e rendimento médio real
A taxa de câmbio também pode alcançar o mercado de trabalho por meio
dos rendimentos. Uma alta do dólar aumenta a receita em reais de
exportadores, mas também encarece produtos e insumos importados,
contribuindo para a elevação dos preços domésticos. Por isso, um aumento
nominal dos salários não basta para concluir que o trabalhador ganhou
poder de compra. Nesta comparação foram utilizados os rendimentos reais
publicados pela PNAD Contínua, que já descontam a inflação.
O dólar comercial foi transformado de uma série diária para uma média
trimestral. Os rendimentos foram mantidos na mesma frequência e as três
séries foram convertidas em índices cuja referência é a média dos quatro
trimestres de 2012:
\[
\overline{V}_{2012} =
\frac{1}{4}
\sum_{q=1}^{4} V_{2012,q}
\]
\[
I_{V,t} =
\frac{V_t}
{\overline{V}_{2012}}
\times 100
\]
Essa construção permite observar quanto cada variável se afastou de
sua média de 2012, sem misturar diretamente valores em R\(/US\) com rendimentos expressos em
reais.
Gráfico 2.3 — Câmbio nominal e rendimento real nos setores
transacionáveis
O dólar avançou de forma muito mais intensa do que os rendimentos
reais. Seu índice se aproximou de 200 no início de 2016, perdeu parte da
alta nos anos seguintes e voltou a subir com força em 2020, chegando
perto de 300 entre o fim de 2024 e o início de 2025. O rendimento da
Agropecuária avançou de maneira mais gradual e encerrou 2025 cerca de
33,2% acima da média de 2012. Na Indústria geral, o crescimento
acumulado foi de aproximadamente 9,3%.
O pico do rendimento industrial em 2020 precisa ser lido junto com a
forte queda do emprego naquele ano. Quando os trabalhadores com menores
salários perdem a ocupação em maior proporção, a média dos que
permanecem empregados pode subir mesmo sem uma melhora geral das
remunerações. A queda do rendimento industrial em 2021 e 2022, ao mesmo
tempo em que o emprego começava a se recompor, reforça essa
possibilidade.
Ao analisar duas décadas da indústria dos Estados Unidos, Campa
e Goldberg (2001) encontraram ajustes cambiais mais visíveis nos
salários e nas horas extras do que no número líquido de empregados. O
trabalho mostra que empresas podem responder ao câmbio modificando
remunerações, jornadas e margens antes de alterar sua quantidade de
trabalhadores. Essa conclusão não deve ser transportada diretamente para
o Brasil, mas oferece uma explicação útil para a diferença entre as
trajetórias do emprego e do rendimento observadas nos Gráficos 2.2 e
2.3.
2.4 Mudança na composição setorial do emprego
A quantidade de ocupados em uma atividade pode aumentar e, mesmo
assim, sua importância no mercado de trabalho diminuir, caso o emprego
total do país cresça mais rapidamente. Para captar essa mudança
relativa, foi calculada a participação de cada setor no total oficial de
pessoas ocupadas:
\[
p_{s,t} =
\frac{E_{s,t}}
{E_t}
\times 100
\]
em que \(E_{s,t}\) corresponde ao
número de ocupados no setor \(s\), e
\(E_t\) representa o total de pessoas
ocupadas no Brasil. A mudança entre os dois anos foi medida em pontos
percentuais:
\[
\Delta p_s =
p_{s,2025} -
p_{s,2012}
\]
A diferença em pontos percentuais mostra quanto cada setor ganhou ou
perdeu espaço na composição do emprego, sem confundir essa mudança com
uma taxa percentual de crescimento.
Gráfico 2.4 — Mudança na composição setorial do emprego
brasileiro
Entre 2012 e 2025, os maiores ganhos de participação ocorreram em
Administração pública, educação e saúde, com 2,67 pontos percentuais, e
em Informação, finanças e serviços profissionais, com 2,29 pontos.
Outros serviços, Alojamento e alimentação e Transporte e armazenagem
também ampliaram sua presença, enquanto a Agropecuária perdeu 3,70
pontos e a Indústria geral recuou 1,60 ponto.
Essa mudança torna o emprego brasileiro menos concentrado nos setores
diretamente ligados ao comércio exterior. A Indústria geral terminou
2025 com mais ocupados do que em 2012, mas sua participação caiu porque
outras atividades cresceram mais. Na Agropecuária, a perda foi
simultaneamente absoluta e relativa. Assim, mesmo quando o câmbio
favorece a produção transacionável, seu alcance sobre o emprego agregado
diminui à medida que os trabalhadores se deslocam para serviços menos
expostos ao comércio internacional.
2.5 Variações anuais do câmbio real e do emprego
A comparação por índices ajuda a visualizar movimentos acumulados,
mas duas séries com tendências próprias podem parecer relacionadas
apenas porque crescem ou diminuem ao longo do tempo. Para reduzir esse
problema, o Gráfico 2.5 utiliza as variações anuais do câmbio real e do
emprego:
\[
\Delta V_t =
\left(
\frac{V_t}
{V_{t-1}}
- 1
\right)
\times 100
\]
No eixo horizontal, valores positivos representam depreciação real do
real e valores negativos indicam apreciação. No eixo vertical, valores
positivos mostram aumento do emprego, enquanto valores negativos
correspondem à redução do número de ocupados. Cada ponto representa a
combinação observada em um ano, separadamente para a Agropecuária e a
Indústria geral.
Gráfico 2.5 — Variação do câmbio real e emprego
setorial
Os pontos aparecem nos quatro quadrantes, sem formar uma direção
estável. Em 2020, uma depreciação real próxima de 30% coincidiu com
queda do emprego nos dois setores, resultado dominado pela pandemia. No
ano seguinte, uma nova depreciação, bem menor, ocorreu junto de uma
recuperação próxima de 10% no emprego agropecuário, enquanto outros anos
registraram aumento da ocupação industrial mesmo com apreciação
cambial.
A dispersão não significa que o câmbio seja irrelevante, mas mostra
que seu efeito contemporâneo é atravessado por outras condições. Demanda
doméstica, preços das commodities, custos importados, juros,
produtividade e choques excepcionais podem reforçar ou anular o impulso
cambial. Além disso, decisões de investimento e contratação levam tempo,
de modo que parte da resposta pode surgir depois do ano em que o câmbio
mudou.
2.6 Diferença de rendimento entre a Indústria geral e a
Agropecuária
A mudança na composição do emprego também afeta a renda porque os
setores apresentam níveis médios de remuneração distintos. Para
acompanhar essa diferença, foram calculados tanto o valor absoluto que
separa os rendimentos quanto o percentual pelo qual a renda industrial
supera a agropecuária:
\[
D_t =
R_{\mathrm{ind},t}
-
R_{\mathrm{agro},t}
\]
\[
P_t =
\left(
\frac{R_{\mathrm{ind},t}}
{R_{\mathrm{agro},t}}
- 1
\right)
\times 100
\]
A Agropecuária foi utilizada como base da comparação. Portanto, um
resultado de 50% significa que o rendimento médio real da Indústria
geral era 50% maior naquele trimestre.
Gráfico 2.6 — Diferença de rendimento entre a indústria e a
agropecuária
O diferencial começou em 89,6% no primeiro trimestre de 2012 e
permaneceu elevado até 2016, quando atingiu valor semelhante. Depois
disso, a distância diminuiu, chegando ao menor nível da série no
terceiro trimestre de 2022, com 41,1%. Houve alguma recomposição em 2023
e 2024, mas o prêmio terminou o quarto trimestre de 2025 em 48,5%, ainda
muito abaixo do início do período.
A aproximação ocorreu principalmente porque o rendimento real
agropecuário cresceu mais, enquanto o rendimento industrial perdeu força
entre 2021 e 2022. Isso não representa uma igualdade entre os setores e
tampouco uma melhora completa para os trabalhadores rurais, já que o
avanço da renda média ocorreu junto com uma redução expressiva da
ocupação agropecuária. Uma média maior entre os trabalhadores que
permaneceram empregados pode coexistir com menos pessoas recebendo renda
naquele setor.
2.7 Indicador combinado de emprego e rendimento real
Emprego e rendimento contam partes diferentes da mesma história. Um
setor pode pagar melhor e empregar menos pessoas, ou ampliar sua
ocupação enquanto o rendimento médio perde valor. Para observar os dois
movimentos em conjunto, os rendimentos trimestrais foram convertidos em
médias anuais:
\[
\overline{R}_{s,a} =
\frac{1}{4}
\sum_{q=1}^{4}
R_{s,a,q}
\]
Depois, os índices de emprego e rendimento foram multiplicados:
\[
C_{s,a} =
\frac{
I^{E}_{s,a}
\times
I^{R}_{s,a}
}{100}
\]
em que \(I^{E}_{s,a}\) representa o
índice de emprego e \(I^{R}_{s,a}\) o
índice de rendimento real. O resultado é um indicador sintético, com
2012 igual a 100. Ele não corresponde à massa oficial de rendimento do
trabalho, mas permite observar se a combinação entre quantidade de
ocupados e rendimento médio ficou acima ou abaixo da base.
Gráfico 2.7 — Emprego e rendimento combinados nos setores
transacionáveis
Os dois setores perderam força durante a recessão de 2015 e 2016. O
indicador agropecuário caiu para 89,7 em 2016 e o industrial para 89,8,
mostrando que emprego e rendimento se enfraqueceram ao mesmo tempo. A
Indústria geral voltou a cair com intensidade em 2021, quando atingiu
87,6, mas se recuperou nos anos seguintes e encerrou 2025 em 112,3.
Na Agropecuária, o indicador alcançou 103,6 em 2025. Esse resultado,
ligeiramente superior ao nível de 2012, não decorreu da expansão do
emprego, que terminou cerca de 22,3% abaixo da base. Foi o aumento do
rendimento médio real que compensou a redução do número de ocupados. Na
Indústria geral, a melhora final foi mais equilibrada, pois tanto o
emprego quanto o rendimento terminaram acima de 2012.
2.8 Decomposição da variação conjunta
Para identificar como emprego e rendimento formaram o resultado de
2025, a mudança do indicador combinado foi separada em três partes. A
contribuição do emprego corresponde ao afastamento do índice de ocupação
em relação a 100:
\[
CE_s =
I^{E}_{s,2025}
- 100
\]
A contribuição do rendimento real é dada por:
\[
CR_s =
I^{R}_{s,2025}
- 100
\]
Como os dois índices mudaram ao mesmo tempo, existe ainda uma parcela
de interação:
\[
CI_s =
\frac{
\left(I^{E}_{s,2025}-100\right)
\left(I^{R}_{s,2025}-100\right)
}{100}
\]
A variação total é calculada por:
\[
\Delta C_s =
C_{s,2025}
- 100
\]
e a decomposição atende à identidade:
\[
\Delta C_s =
CE_s + CR_s + CI_s
\]
A interação é apenas uma consequência matemática da variação
simultânea dos dois componentes e não deve ser interpretada como um
efeito causal.
Gráfico 2.8 — Componentes da variação conjunta de emprego e
rendimento
Na Agropecuária, a contribuição do emprego foi negativa em 22,26
pontos, enquanto o rendimento acrescentou 33,24 pontos. A interação
retirou outros 7,40 pontos porque emprego e renda se moveram em direções
opostas, deixando uma variação total positiva de apenas 3,58 pontos. O
resultado mostra que o avanço do rendimento compensou uma perda
ocupacional profunda, mas não produziu uma expansão conjunta forte.
Na Indústria geral, o emprego contribuiu com 2,68 pontos e o
rendimento com 9,33, enquanto a interação acrescentou 0,25. O indicador
combinado terminou 12,26 pontos acima de 2012. Diferentemente da
Agropecuária, os dois componentes caminharam na mesma direção, embora o
rendimento tenha respondido pela maior parcela do ganho.
2.9 Composição do rendimento domiciliar
Os efeitos do mercado de trabalho chegam às famílias, mas o
rendimento domiciliar não depende apenas de salários e outras receitas
do trabalho. Aposentadorias, pensões, aluguéis, programas sociais e
demais rendimentos também participam do orçamento dos domicílios,
podendo amortecer ou ampliar mudanças ocorridas no emprego.
A participação de cada fonte foi representada por:
\[
p_{k,t} =
\frac{R_{k,t}}
{R_t}
\times 100
\]
em que \(R_{k,t}\) corresponde ao
rendimento proveniente da fonte \(k\),
e \(R_t\) representa o rendimento
domiciliar total. A mudança entre 2012 e 2025 foi calculada em pontos
percentuais:
\[
\Delta p_k =
p_{k,2025}
-
p_{k,2012}
\]
Como se trata de uma composição, o aumento da participação de uma
fonte não significa necessariamente que seu valor monetário tenha
crescido. A parcela também pode subir quando outras fontes diminuem.
Gráfico 2.9 — De onde vem a renda domiciliar
brasileira
O trabalho permaneceu como a principal fonte do rendimento
domiciliar, embora sua participação tenha recuado de 75,7% em 2012 para
75,1% em 2025. Aposentadorias e pensões ficaram praticamente estáveis,
passando de 16,5% para 16,4%. A mudança mais expressiva ocorreu nos
programas sociais, cuja participação aumentou de 1,5% para 3,5%,
enquanto aluguéis, pensões alimentícias, doações, mesadas e outros
rendimentos perderam espaço.
A estabilidade da parcela do trabalho, próxima de três quartos da
renda domiciliar, reforça a importância das trajetórias apresentadas nos
gráficos anteriores. Mesmo pequenas mudanças na ocupação e nos
rendimentos de setores com muitos trabalhadores podem alcançar uma
parcela ampla das famílias. Ao mesmo tempo, o crescimento da
participação dos programas sociais mostra que outras fontes passaram a
exercer um papel maior na sustentação da renda, especialmente em
períodos nos quais o mercado de trabalho foi atingido por recessão ou
pandemia.
Parte 3 — Câmbio e desigualdade de renda
3.1 O Índice de Gini e o câmbio
Ao analisar todos os fatores envolvendo o câmbio e como isso afeta a
dinâmica das famílias e dos empregos, o próximo entendimento se dá por
conta de como isso impacta a desigualdade no final dessa cadeia. Para
isso, a priori a métrica utilizada para fomentar essa discussão será o
Índice de Gini, constantemente usado para medir o grau de desigualdade
na distribuição de renda ou de riqueza em uma população, cujo valor
varia de 0 a 1, sendo que o zero representa uma igualdade perfeita, ou
seja, em teoria todas as pessoas teriam a mesma renda, e o um representa
uma desigualdade máxima, em que toda a renda estaria concentrada em uma
única pessoa.
Ao voltar para o cenário brasileiro e sua série histórica do Gini,
comparando-a com a evolução do câmbio, infere-se primeiramente que a
relação entre os dois não é muito correlacionada, sendo que apenas
alguns anos específicos parecem, à primeira vista, indicar um real
impacto do câmbio sobre a desigualdade, mas que, analisados com mais
cuidado, revelam outras causas por trás. O ano de 2020, marcado pela
pandemia, é o caso mais evidente: o câmbio deu um salto expressivo,
saindo de R$4,03 em 2019 para R$5,20, justamente o tipo de choque que a
teoria diria que deveria piorar a desigualdade, e ainda assim o Gini
caiu, de 0,544 para 0,524, muito por conta dos auxílios emergenciais
distribuídos durante o período pandêmico, que sustentaram a renda das
famílias mais pobres exatamente no momento em que o câmbio mais
pesava.
Já no período da recessão de 2015 a 2016, quando o câmbio disparou de
R$2,35 para R$3,49 em apenas dois anos, o Gini praticamente não se
moveu, oscilando de 0,526 para 0,537 — um contraste que também vai
contra a intuição, já que um choque cambial dessa magnitude, em meio a
uma recessão profunda, poderia se esperar um salto muito maior na
desigualdade medida. Em 2024, o Gini atingiu o menor valor da série,
0,506, com o câmbio em R$5,48, e em 2025, o último ano com registro, o
câmbio subiu ligeiramente para R$5,55 e o Gini também subiu, para 0,511
— ou seja, dessa vez os dois se moveram na mesma direção, mas isso não
deve ser lido como confirmação de uma relação constante, e sim como mais
um ponto isolado em uma série que, ano a ano, não segue padrão
algum.
Logo, pode-se inferir que o câmbio e a desigualdade, medida pelo
Gini, não estão diretamente correlacionados, e que o câmbio impacta a
desigualdade de forma secundária e mais indireta, diferente do que
ocorre com o poder de compra e o mercado de trabalho, discutidos
anteriormente. Entretanto, o Gini esconde uma parte que, se não bem
analisada, pode mascarar a verdadeira desigualdade, sendo necessário
usar outra análise para inferir uma relação Desigualdade x Câmbio.
Gráfico 3.1 — Índice de Gini, Brasil (2012–2025)
Gráfico 3.2 — Câmbio médio anual (reais por
dólar)
Gráfico 3.3 — Variação anual do Gini × variação anual do
câmbio
3.2 O que o Gini não capta: PNAD Contínua × Receita Federal
Para investigar a concentração de renda de forma mais fidedigna, é
preciso olhar para os dados da Receita Federal, e não somente para os da
PNAD Contínua, que é de onde vêm os dados usados para calcular o Gini,
pois a PNAD é uma pesquisa domiciliar que subestima estruturalmente o
topo da distribuição, exatamente onde se concentra a renda de capital,
aluguel e aplicações financeiras, o tipo de rendimento que menos aparece
quando alguém é entrevistado porta a porta, e que menos reage a
metodologia de declaração de imposto de renda. A diferença entre as duas
fontes é gritante: pela PNAD, o crescimento real acumulado do 1% mais
rico foi de apenas 5,1%, enquanto pelos dados de Imposto de Renda da
Receita Federal, o crescimento do 0,1% mais rico chegou a quase 49% no
mesmo tipo de período, quase dez vezes mais. Essa discrepância não é
generalizada: quando se olha a média geral da população, as duas fontes
convergem bastante, com crescimento de 13,8% pela PNAD e 9,8% pela
Receita Federal, o que mostra que o Gini não erra em todo lugar, e sim
especificamente no topo da distribuição, que é justamente onde mora a
renda mais protegida do câmbio.
Gráfico 3.4 — Crescimento real acumulado da renda: topo ×
média, por fonte de dado
3.3 Renda média real e câmbio
Em meio a isso, é viável realizar uma investigação descartando um
pouco a métrica de desigualdade e analisando diretamente a renda média,
a fim de estabelecer uma relação direta com o câmbio. O resultado,
novamente, é nulo, quase inverso em alguns anos, fraca e
estatisticamente não significativa demais para sustentar qualquer
leitura sobre a direção da relação. O que esse resultado reforça é que o
problema não está apenas no Índice de Gini como métrica de desigualdade,
mas no próprio nível de agregação: quando se olha o país inteiro somado,
seja pela ótica da distribuição, seja pela ótica do nível de renda, o
efeito do câmbio se perde na média.
Gráfico 3.5 — Renda média real × câmbio
3.4 O canal dos preços: IPCA por grupo e orçamento familiar
Como analisado, a ideia é tentar encontrar uma relação entre câmbio e
desigualdade, e para isso é preciso voltar ao início deste trabalho e
buscar novamente o impacto dos componentes mais específicos do IPCA,
principalmente o de alimentação. Vale notar que, no início do relatório,
a análise encontrou resultados de impacto relevantes envolvendo também
habitação e transporte, e por isso testamos diretamente esses dois
grupos contra o câmbio, usando o mesmo teste rigoroso aplicado ao
restante desta parte: a Habitação apresentou correlação fraca e não
significativa (r = 0,26, p = 0,39 na variação ano a ano), assim como o
Transporte (r = 0,22, p = 0,47) — o que não invalida a relevância desses
dois grupos para o custo de vida em geral, apenas mostra que o canal
específico de transmissão do câmbio não passa por eles com a mesma
força. A Alimentação segue sendo o componente que mais se aproxima de
uma relação real com o câmbio, com r = 0,68 (p = 0,007) na variação ano
a ano, uma correlação forte e estatisticamente significativa. E, ao
adicionar os dados da Pesquisa de Orçamentos Familiares do IBGE, um fato
cataliza ainda mais esse cenário: os itens essenciais, entre eles a
alimentação, tomam 70,6% do orçamento das famílias de baixa renda,
contra 45,5% nas de alta renda, o que significa que o mesmo repasse
cambial impacta 1,55 vez mais as famílias mais pobres e, olhando só para
a alimentação isoladamente, essa diferença é ainda mais extrema, com
22,0% do orçamento da baixa renda destinados a ela, contra apenas 7,6%
na alta renda, quase três vezes mais peso.
Gráfico 3.6 — IPCA por grupo × câmbio
Gráfico 3.7 — Variação do câmbio × variação do IPCA por
categoria
Gráfico 3.8 — Correlação de cada categoria do IPCA com o
câmbio
Gráfico 3.9 — Peso de cada categoria no orçamento familiar
(POF)
3.5 O hiato de inflação entre faixas de renda
Essa mesma lógica se confirma, de forma ainda mais direta, quando se
olha para um gap de inflação entre faixas de renda medidas pelo
Indicador Ipea de Inflação por Faixa de Renda, que é o achado mais forte
de toda esta parte. Assim como no caso da alimentação discutido acima, o
nível não se relaciona com o câmbio, mas a variação ano a ano do hiato
entre a inflação da Renda Muito Baixa e da Renda Alta tem correlação
forte e significativa com a variação do câmbio, de r = 0,73 (p = 0,005):
quando o câmbio acelera, a inflação dos mais pobres acelera mais do que
a dos mais ricos, e o gap entre os dois aumenta reforçando, com um dado
ainda mais direto, o mesmo canal de preços já identificado através do
IPCA de alimentação.
Gráfico 3.10 — Hiato de inflação entre a Renda Muito Baixa e
a Renda Alta × câmbio
LS0tDQp0aXRsZTogIkPDom1iaW8gaW1wYWN0YSBhIGRlc2lndWFsZGFkZT8iDQphdXRob3I6ICJKb8OjbyBQZWRybyBHb2RpbmhvLCBHaXVsaWEgTG9zY2hpYXZvIGUgTWFyaWEgRWR1YXJkYSBHb21lcyINCmRhdGU6ICIyMDI2LTA5LTEzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIHRoZW1lOiBsdW1lbg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpDQoNCiMgUGFzdGEgdGVtcG9yw6FyaWEgc2VtIGFjZW50b3MgKGV2aXRhIGVycm8gZG8gcGFuZG9jIG5vIFdpbmRvd3MpDQppZiAoLlBsYXRmb3JtJE9TLnR5cGUgPT0gIndpbmRvd3MiKSB7DQogIGRpci5jcmVhdGUoIkM6L1J0ZW1wIiwgc2hvd1dhcm5pbmdzID0gRkFMU0UpDQogIFN5cy5zZXRlbnYoVE1QRElSID0gIkM6L1J0ZW1wIiwgVE1QID0gIkM6L1J0ZW1wIiwgVEVNUCA9ICJDOi9SdGVtcCIpDQp9DQoNCiMg4pSA4pSAIFBhY290ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQpwYWNvdGVzIDwtIGMoInZhcnMiLCAibG10ZXN0IiwgInNhbmR3aWNoIiwgImpzb25saXRlIiwgImh0dHIiLCAicGxvdGx5IiwNCiAgICAgICAgICAgICAiaGlnaGNoYXJ0ZXIiLCAiaHRtbHdpZGdldHMiLCAicmVhZHhsIiwgImphbml0b3IiLCAicmJjYiIsDQogICAgICAgICAgICAgIkdldEJDQkRhdGEiLCAic2NhbGVzIiwgImx1YnJpZGF0ZSIsICJ0aWR5dmVyc2UiKQ0KZmFsdGFuZG8gPC0gcGFjb3Rlc1shdmFwcGx5KHBhY290ZXMsIHJlcXVpcmVOYW1lc3BhY2UsIGxvZ2ljYWwoMSksIHF1aWV0bHkgPSBUUlVFKV0NCmlmIChsZW5ndGgoZmFsdGFuZG8pID4gMCkgew0KICBzdG9wKCJJbnN0YWxlIGFudGVzIGRvIEtuaXQ6IGluc3RhbGwucGFja2FnZXMoYygiLA0KICAgICAgIHBhc3RlMCgnIicsIGZhbHRhbmRvLCAnIicsIGNvbGxhcHNlID0gIiwgIiksICIpKSIsIGNhbGwuID0gRkFMU0UpDQp9DQoNCiMgTyB2YXJzIGNhcnJlZ2EgbyBNQVNTLCBxdWUgdGVtIG91dHJvIHNlbGVjdCgpLiBQb3IgaXNzbyBlbGUgdmVtDQojIHByaW1laXJvIGUgbyB0aWR5dmVyc2UgcG9yIMO6bHRpbW8uDQpsaWJyYXJ5KHZhcnMpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShodHRyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShyYmNiKQ0KbGlicmFyeShHZXRCQ0JEYXRhKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KIyBHYXJhbnRlIGFzIHZlcnPDtWVzIGRvIGRwbHlyIG1lc21vIHF1ZSBvdXRybyBwYWNvdGUgYXMgbWFzY2FyZQ0Kc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QNCmZpbHRlciA8LSBkcGx5cjo6ZmlsdGVyDQpsYWcgICAgPC0gZHBseXI6OmxhZw0KDQojIOKUgOKUgCBQbGFuaWxoYXMgZGEgUGFydGUgMiAocHJlY2lzYW0gZXN0YXIgbmEgcGFzdGEgZG8gLlJtZCkg4pSA4pSADQpwbGFuaWxoYXMgPC0gYygiSW1wLWV4cC1jb21leHN0YXQueGxzeCIsICJEYWRvcy5zaWRyYS54bHN4IiwNCiAgICAgICAgICAgICAgICJTaWRyYS50cmltLnRyYWIueGxzeCIsICJDb21wb3NpY2FvLnJlbmRhLnNpZHJhLnhsc3giKQ0Kc2VtX2FycXVpdm8gPC0gcGxhbmlsaGFzWyFmaWxlLmV4aXN0cyhwbGFuaWxoYXMpXQ0KaWYgKGxlbmd0aChzZW1fYXJxdWl2bykgPiAwKSB7DQogIHN0b3AoIkNvbG9xdWUgbmEgbWVzbWEgcGFzdGEgZG8gLlJtZDogIiwNCiAgICAgICBwYXN0ZShzZW1fYXJxdWl2bywgY29sbGFwc2UgPSAiLCAiKSwgY2FsbC4gPSBGQUxTRSkNCn0NCmBgYA0KDQpgYGB7ciBwYWxldGEtdGVtYSwgaW5jbHVkZT1GQUxTRX0NCiMg4pSA4pSAIDEuIFBBTEVUQSBJTlNUSVRVQ0lPTkFMIChNYW51YWwgZGUgTWFyY2EgSWJNYWNybyBCSCkg4pSA4pSA4pSA4pSA4pSA4pSADQpJQl9BTUFSRUxPICAgICAgPC0gIiNGRkI4MUYiICAjIEFtYXJlbG8gSWJNYWNybyAoRGVzdGFxdWVzIC8gMsKqIHPDqXJpZSkNCklCX0FaVUxfQkFTRSAgICA8LSAiIzAyMDIzQyIgICMgQXp1bCBJYk1hY3JvIChUw610dWxvcyAvIDHCqiBzw6lyaWUpDQpJQl9CUkFOQ08gICAgICAgPC0gIiNGRkZGRkYiICAjIEZ1bmRvIGluc3RpdHVjaW9uYWwNCklCX0FaVUxfTUVESU8gICA8LSAiIzAwMkM1RSIgICMgQXp1bCBNw6lkaW8gZGUgYXBvaW8gKGNhdGVnb3JpYXMgc2VjdW5kw6FyaWFzKQ0KSUJfQVpVTF9DTEFSTyAgIDwtICIjNkI4QkE0IiAgIyBBenVsIENsYXJvIGNvbXBsZW1lbnRhciAoY2F0ZWdvcmlhcyB0ZXJjacOhcmlhcykNCklCX0NJTlpBX0VTQ1VSTyA8LSAiIzNBM0EzQSIgICMgVGV4dG9zLCBlaXhvcyBlIHN1YnTDrXR1bG9zDQpJQl9DSU5aQV9DTEFSTyAgPC0gIiNBNkE2QTYiICAjIExpbmhhcyBkZSBncmFkZSwgZWl4b3MgZSBjcsOpZGl0b3MsIGNhdGVnb3JpYXMgcmVzaWR1YWlzDQoNCiMgUGFsZXRhIG5vbWVhZGEgdXNhZGEgbm9zIGdyw6FmaWNvcyBkYSBQYXJ0ZSAyDQpjb3Jlc19pYm1hY3JvIDwtIGMoDQogIGFtYXJlbG8gICAgICAgPSAiI0ZFQjcxMiIsDQogIGF6dWxfZXNjdXJvICAgPSAiIzAyMDIzQyIsDQogIGF6dWxfbWVkaW8gICAgPSAiIzM2M0U2QiIsDQogIGFtYXJlbG9fY2xhcm8gPSAiI0ZGRDU3QSIsDQogIGF6dWxfY2xhcm8gICAgPSAiIzQ2QjFFMSIsDQogIGNpbnphICAgICAgICAgPSAiI0E2QTZBNiIsDQogIHByZXRvICAgICAgICAgPSAiIzExMTgyNyINCikNCg0KIyDilIDilIAgMi4gVEVNQSBJTlNUSVRVQ0lPTkFMIElCTUFDUk8gKGlkw6pudGljbyBhbyBqw6EgdXNhZG8pIOKUgOKUgOKUgOKUgOKUgA0KdGVtYV9pYm1hY3JvIDwtIGhjX3RoZW1lX21lcmdlKA0KICBoY190aGVtZV9zbXBsKCksDQogIGhjX3RoZW1lKA0KICAgIGNoYXJ0ID0gbGlzdCgNCiAgICAgIGJhY2tncm91bmRDb2xvciA9IElCX0JSQU5DTywNCiAgICAgIHN0eWxlID0gbGlzdChmb250RmFtaWx5ID0gIkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiKQ0KICAgICksDQogICAgdGl0bGUgPSBsaXN0KA0KICAgICAgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQVpVTF9CQVNFLCBmb250V2VpZ2h0ID0gImJvbGQiLCBmb250U2l6ZSA9ICIxOHB4IikNCiAgICApLA0KICAgIHN1YnRpdGxlID0gbGlzdCgNCiAgICAgIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTywgZm9udFNpemUgPSAiMTJweCIpDQogICAgKSwNCiAgICB4QXhpcyA9IGxpc3QoDQogICAgICBncmlkTGluZVdpZHRoID0gMCwNCiAgICAgIGxpbmVDb2xvciA9IElCX0NJTlpBX0NMQVJPLA0KICAgICAgdGlja0NvbG9yID0gSUJfQ0lOWkFfQ0xBUk8sDQogICAgICBsYWJlbHMgPSBsaXN0KHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTywgZm9udFNpemUgPSAiMTFweCIpKQ0KICAgICksDQogICAgeUF4aXMgPSBsaXN0KA0KICAgICAgZ3JpZExpbmVDb2xvciA9ICIjRjBGMEYwIiwNCiAgICAgIGxpbmVDb2xvciA9IElCX0NJTlpBX0NMQVJPLA0KICAgICAgbGFiZWxzID0gbGlzdChzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8sIGZvbnRTaXplID0gIjExcHgiKSkNCiAgICApLA0KICAgIGxlZ2VuZCA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIGl0ZW1TdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9BWlVMX0JBU0UsIGZvbnRXZWlnaHQgPSAibm9ybWFsIiwgZm9udFNpemUgPSAiMTJweCIpDQogICAgKQ0KICApDQopDQoNCiMgSGVscGVyIGdlbsOpcmljbyBkZSBmb3JtYXRhw6fDo28gKHTDrXR1bG8sIHN1YnTDrXR1bG8sIGNyw6lkaXRvcywgZXhwb3J0YcOnw6NvKQ0KaGNfZm9ybWF0YXJfYmFzZSA8LSBmdW5jdGlvbihoYywgdGl0dWxvLCBzdWJ0aXR1bG8sIGZvbnRlKSB7DQogIGhjICU+JQ0KICAgIGhjX2FkZF90aGVtZSh0ZW1hX2libWFjcm8pICU+JQ0KICAgIGhjX3RpdGxlKHRleHQgPSB0aXR1bG8sIGFsaWduID0gImxlZnQiKSAlPiUNCiAgICBoY19zdWJ0aXRsZSh0ZXh0ID0gc3VidGl0dWxvLCBhbGlnbiA9ICJsZWZ0IikgJT4lDQogICAgaGNfY3JlZGl0cygNCiAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgdGV4dCA9IGZvbnRlLA0KICAgICAgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQ0lOWkFfQ0xBUk8sIGZvbnRTaXplID0gIjEwcHgiKQ0KICAgICkgJT4lDQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFKQ0KfQ0KDQojIEhlbHBlciB1c2FkbyBubyBHcsOhZmljbyAyLjEgKHTDrXR1bG8sIHN1YnTDrXR1bG8sIGZvbnRlIGUgZXhwb3J0YcOnw6NvKQ0KZmluYWxpemFyX2dyYWZpY28gPC0gZnVuY3Rpb24oZ3JhZmljbywgdGl0dWxvLCBzdWJ0aXR1bG8sIGZvbnRlLCBub21lX2FycXVpdm8pIHsNCiAgZ3JhZmljbyB8Pg0KICAgIGhjX2FkZF90aGVtZSh0ZW1hX2libWFjcm8pIHw+DQogICAgaGNfdGl0bGUodGV4dCA9IHRpdHVsbykgfD4NCiAgICBoY19zdWJ0aXRsZSh0ZXh0ID0gc3VidGl0dWxvKSB8Pg0KICAgIGhjX2NyZWRpdHMoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIHRleHQgPSBwYXN0ZTAoIkZvbnRlOiAiLCBmb250ZSwgIi4gRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIiksDQogICAgICBzdHlsZSA9IGxpc3QoY29sb3IgPSAiIzZCNzI4MCIsIGZvbnRTaXplID0gIjEwcHgiKQ0KICAgICkgfD4NCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsIGZpbGVuYW1lID0gbm9tZV9hcnF1aXZvKQ0KfQ0KYGBgDQoNCiMgUGFydGUgMSDigJQgQ8OibWJpbywgaW5mbGHDp8OjbyBlIHBvZGVyIGRlIGNvbXByYQ0KDQojIyAxLjEgQSBkaW7Dom1pY2EgaW5mbGFjaW9uw6FyaWEgZSBvIHBhcGVsIGRvIGPDom1iaW8gbmEgZWNvbm9taWEgYnJhc2lsZWlyYQ0KDQpBIGVzdGFiaWxpZGFkZSBkZSBwcmXDp29zIG5vIEJyYXNpbCDDqSB1bSB0ZW1hIGNlbnRyYWwgcGFyYSBhIGNvbmR1w6fDo28gZGEgcG9sw610aWNhIG1hY3JvZWNvbsO0bWljYSwgZmlndXJhbmRvIGNvbW8gY29uZGnDp8OjbyBwcsOpdmlhIHBhcmEgbyBjcmVzY2ltZW50byBzdXN0ZW50w6F2ZWwgZSBvIGJlbS1lc3RhciBzb2NpYWwuIEVtIHVtYSBlY29ub21pYSBhYmVydGEgZSBmb3J0ZW1lbnRlIGludGVncmFkYSBhb3MgbWVyY2Fkb3MgZ2xvYmFpcyBkZSBtYXTDqXJpYXMtcHJpbWFzLCBhIHZhcmlhw6fDo28gZGEgdGF4YSBkZSBjw6JtYmlvIChEw7NsYXIgUHRheCkgZGVzZW1wZW5oYSB1bSBwYXBlbCBkZXRlcm1pbmFudGUgbmEgZm9ybWHDp8OjbyBkZSBwcmXDp29zIGRvbcOpc3RpY29zLiANCg0KTyBjYW5hbCBkZSB0cmFuc21pc3PDo28gY2FtYmlhbCwgY29uaGVjaWRvIG5hIGxpdGVyYXR1cmEgZWNvbsO0bWljYSBjb21vIHBhc3MtdGhyb3VnaCwgb3BlcmEgbsOjbyBhcGVuYXMgZGUgZm9ybWEgZGlyZXRhIHNvYnJlIG9zIGJlbnMgY29tZXJjaWFsaXrDoXZlaXMgKHRyYWRhYmxlcyksIG1hcyB0YW1iw6ltIGluZGlyZXRhLCBhbyBpbXBhY3RhciBjdXN0b3MgZGUgaW5zdW1vcyBwcm9kdXRpdm9zLCBmZXJ0aWxpemFudGVzLCBlbmVyZ2lhIGUgY29tYnVzdMOtdmVpcyBhbyBsb25nbyBkZSB0b2RhIGEgY2FkZWlhIGRlIHN1cHJpbWVudG9zLg0KDQpDb250dWRvLCBhIHRyYW5zbWlzc8OjbyBkbyBjaG9xdWUgY2FtYmlhbCBwYXJhIG9zIHByZcOnb3MgYW8gY29uc3VtaWRvciBuw6NvIG9jb3JyZSBkZSBtYW5laXJhIHNpbXVsdMOibmVhIG91IGhvbW9nw6puZWEuIEV4aXN0ZSB1bWEgZGVmYXNhZ2VtIHRlbXBvcmFsIGluZXJlbnRlIGFvcyBwcm9jZXNzb3MgZGUgcmVuZWdvY2lhw6fDo28gZGUgY29udHJhdG9zLCBlc3RvcXVlcyBlIG1hcmdlbnMgZGUgbHVjcm8gZGFzIGVtcHJlc2FzLiANCkFsw6ltIGRpc3NvLCBhcyBmbHV0dWHDp8O1ZXMgZGEgdGF4YSBkZSBjw6JtYmlvIGUgZG9zIHByZcOnb3MgZGFzIGNvbW1vZGl0aWVzIGludGVybmFjaW9uYWlzIGdlcmFtIGltcGFjdG9zIHJlZGlzdHJpYnV0aXZvcyBhc3NpbcOpdHJpY29zIGVudHJlIGFzIGRpZmVyZW50ZXMgZmFpeGFzIGRlIHJlbmRhIGRhIHBvcHVsYcOnw6NvLCBkZSBtb2RvIHF1ZSBlbnF1YW50byBmYW3DrWxpYXMgZGUgbWVub3IgcmVuZGEgY29tcHJvbWV0ZW0gcGFyY2VsYSBleHByZXNzaXZhIGRlIHNldXMgb3LDp2FtZW50b3MgY29tIGJlbnMgZXNzZW5jaWFpcyBlIGFsaW1lbnRhw6fDo28gbm8gZG9taWPDrWxpbyDigJQgaXRlbnMgYWx0YW1lbnRlIHN1c2NldMOtdmVpcyBhIGNob3F1ZXMgY2FtYmlhaXMg4oCULCBmYW3DrWxpYXMgZGUgbWFpb3IgcmVuZGEgZGVzdGluYW0gcHJvcG9yw6fDtWVzIG1haXMgZWxldmFkYXMgZG8gc2V1IGNvbnN1bW8gYSBzZXJ2acOnb3MsIGN1amEgZGluw6JtaWNhIGluZmxhY2lvbsOhcmlhIMOpIGRvbWluYWRhIHBlbGEgcmlnaWRleiBzYWxhcmlhbCwgbWVyY2FkbyBkZSB0cmFiYWxobyBpbnRlcm5vIGUgaW7DqXJjaWEgY29udHJhdHVhbC4NCg0KRGlhbnRlIGRlc3NlIGNlbsOhcmlvLCBlc3RlIHJlbGF0w7NyaW8gYW5hbGlzYSBhIHRyYWpldMOzcmlhIGRhIGluZmxhw6fDo28gb2ZpY2lhbCAoSVBDQSkgZSBzZXVzIGRldGVybWluYW50ZXMgc29iIGEgw7N0aWNhIGRhIHRyYW5zbWlzc8OjbyBjYW1iaWFsIGUgZGEgaGV0ZXJvZ2VuZWlkYWRlIHNvY2lhbC4gRXNzZSBlc3R1ZG8gbWFwZWlhIG8gdGVtcG8gZGUgcmVzcG9zdGEgZSBhIG1hZ25pdHVkZSBkb3MgY2hvcXVlcyBkZSB0YXhhIGRlIGPDom1iaW8gc29icmUgYSBpbmZsYcOnw6NvIGdlcmFsLCBpbnZlc3RpZ2FuZG8gY29tbyBhIHZhcmlhw6fDo28gZG8gZMOzbGFyIGFmZXRhIGRpZmVyZW5jaWFsbWVudGUgYXMgZmFtw61saWFzIGJyYXNpbGVpcmFzIGRlIGFjb3JkbyBjb20gc3VhcyBmYWl4YXMgZGUgcmVuZGEgZSBlc3RydXR1cmFzIGRlIGNvbnN1bW8uDQoNCiMjIDEuMiBJbmZsYcOnw6NvIGFjdW11bGFkYSBlbSAxMiBtZXNlcyB2cy4gbWV0YSAoSVBDQSkNCg0KQSBhbsOhbGlzZSBkbyBJUENBIGFjdW11bGFkbyBlbSAxMiBtZXNlcyByZXZlbGEgcXVlLCBhbyBsb25nbyBkbyBwZXLDrW9kbyBvYnNlcnZhZG8sIGEgaW5mbGHDp8OjbyBvZmljaWFsIHBlcm1hbmVjZXUgc2lzdGVtYXRpY2FtZW50ZSBhY2ltYSBkYSBtZXRhIGNlbnRyYWwgZXN0aXB1bGFkYSBwZWxvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsICgzLDAlKS4gRW0gZGl2ZXJzb3MgaW50ZXJ2YWxvcyDigJQgY29tIGRlc3RhcXVlIHBhcmEgbyBpbsOtY2lvIGRlIDIwMjMsIG8gcHJpbWVpcm8gc2VtZXN0cmUgZGUgMjAyNSBlIG1lYWRvcyBkZSAyMDI2IOKAlCwgbyDDrW5kaWNlIGZ1cm91IG8gdGV0byBkbyBpbnRlcnZhbG8gZGUgdG9sZXLDom5jaWEgZGUgNCw1JS4NCg0KRXNzZSBjb21wb3J0YW1lbnRvIHBlcnNpc3RlbnRlIHNpbmFsaXphIHByZXNzw7VlcyBpbmZsYWNpb27DoXJpYXMgc3ViamFjZW50ZXMgbm8gcGVyw61vZG8uIE8gZGlzdGFuY2lhciBkYSBpbmZsYcOnw6NvIGVtIHJlbGHDp8OjbyBhbyBjZW50cm8gZGEgbWV0YSBleGlnZSB1bWEgaW52ZXN0aWdhw6fDo28gZGV0YWxoYWRhIHNvYnJlIG9zIHNldXMgZGV0ZXJtaW5hbnRlcyBkZSBvZmVydGEgZSBkZW1hbmRhLCBjb20gZm9jbyByZW5vdmFkbyBub3MgY2hvcXVlcyBleHRlcm5vcyB0cmFuc21pdGlkb3MgdmlhIHRheGEgZGUgY8OibWJpby4NCg0KIyMgMS4zIEludGVyYcOnw6NvIGVudHJlIGluZmxhw6fDo28gZSBjw6JtYmlvDQoNClNhYmUtc2UgcXVlIGEgaW5mbGHDp8OjbyDDqSB1bWEgdmFyacOhdmVsIGRlZmFzYWRhIGVtIHJlbGHDp8OjbyBhIGNpY2xvcyBlY29uw7RtaWNvcy4gUG9kZW1vcyBwZXJjZWJlciBqdW50YW1lbnRlIGVzc2EgY2FyYWN0ZXLDrXN0aWNhIHF1YW5kbyBvbGhhbW9zIHBhcmEgc3VhIHJlbGHDp8OjbyBjb20gbyBkw7NsYXIuDQoNCioqR3LDoWZpY28gMS4xIOKAlCBUcmFqZXTDs3JpYSBkZSBjdXJ0byBwcmF6bzogZMOzbGFyIFB0YXggdnMuIElQQ0EgbWVuc2FsIGUgYSBoaXDDs3Rlc2UgZGEgZGVmYXNhZ2VtKioNCg0KYGBge3IgcDEtZG9sYXItaXBjYX0NCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCmxpYnJhcnkoanNvbmxpdGUpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDEuIENPUkVTIOKAlCBQQURSw4NPIElCTUVDIE1BQ1JPDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjb2xvcnMgPC0gYygNCiAgIiNGRUI3MTIiLA0KICAiIzAyMDIzQyIsDQogICIjMzYzRTZCIiwNCiAgIiNGRkQ1N0EiLA0KICAiIzQ2QjFFMSIsDQogICIjQTZBNkE2IiwNCiAgIiMxMTE4MjciDQopDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDIuIERBRE9TIERPIEJBQ0VOIOKAlCBTR1MNCiMgU8OpcmllIDEgICA9IETDs2xhciBQdGF4ICh2ZW5kYSwgZGnDoXJpbykNCiMgU8OpcmllIDQzMyA9IElQQ0EgbWVuc2FsICglIHZhcmlhw6fDo28pDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpkYXRhX2luaWNpYWwgPC0gIjAxLzAxLzIwMjIiDQpkYXRhX2ZpbmFsICAgPC0gZm9ybWF0KFN5cy5EYXRlKCksICIlZC8lbS8lWSIpDQoNCnVybF9kb2xhciA8LSBwYXN0ZTAoDQogICJodHRwczovL2FwaS5iY2IuZ292LmJyL2RhZG9zL3NlcmllL2JjZGF0YS5zZ3MuMS9kYWRvcz8iLA0KICAiZm9ybWF0bz1qc29uJmRhdGFJbmljaWFsPSIsIGRhdGFfaW5pY2lhbCwNCiAgIiZkYXRhRmluYWw9IiwgZGF0YV9maW5hbA0KKQ0KDQp1cmxfaXBjYSA8LSBwYXN0ZTAoDQogICJodHRwczovL2FwaS5iY2IuZ292LmJyL2RhZG9zL3NlcmllL2JjZGF0YS5zZ3MuNDMzL2RhZG9zPyIsDQogICJmb3JtYXRvPWpzb24mZGF0YUluaWNpYWw9IiwgZGF0YV9pbmljaWFsLA0KICAiJmRhdGFGaW5hbD0iLCBkYXRhX2ZpbmFsDQopDQoNCmRmX2RvbGFyX3JhdyA8LSB0cnlDYXRjaCgNCiAgZnJvbUpTT04odXJsX2RvbGFyKSwNCiAgZXJyb3IgPSBmdW5jdGlvbihlKSBzdG9wKCJGYWxoYSBhbyBidXNjYXIgZGFkb3MgZG8gZMOzbGFyIChzw6lyaWUgMSkgbm8gQkFDRU46ICIsIGUkbWVzc2FnZSkNCikNCg0KZGZfaXBjYV9yYXcgPC0gdHJ5Q2F0Y2goDQogIGZyb21KU09OKHVybF9pcGNhKSwNCiAgZXJyb3IgPSBmdW5jdGlvbihlKSBzdG9wKCJGYWxoYSBhbyBidXNjYXIgZGFkb3MgZG8gSVBDQSAoc8OpcmllIDQzMykgbm8gQkFDRU46ICIsIGUkbWVzc2FnZSkNCikNCg0KaWYgKG5yb3coZGZfZG9sYXJfcmF3KSA9PSAwKSBzdG9wKCJBUEkgZG8gZMOzbGFyIHJldG9ybm91IHZhemlvLiIpDQppZiAobnJvdyhkZl9pcGNhX3JhdykgPT0gMCkgc3RvcCgiQVBJIGRvIElQQ0EgcmV0b3Jub3UgdmF6aW8uIikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMy4gVFJBVEFNRU5UTw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZGZfZG9sYXJfcmF3JGRhdGEgIDwtIGFzLkRhdGUoZGZfZG9sYXJfcmF3JGRhdGEsIGZvcm1hdCA9ICIlZC8lbS8lWSIpDQpkZl9kb2xhcl9yYXckdmFsb3IgPC0gYXMubnVtZXJpYyhkZl9kb2xhcl9yYXckdmFsb3IpDQoNCmRmX2lwY2FfcmF3JGRhdGEgIDwtIGFzLkRhdGUoZGZfaXBjYV9yYXckZGF0YSwgZm9ybWF0ID0gIiVkLyVtLyVZIikNCmRmX2lwY2FfcmF3JHZhbG9yIDwtIGFzLm51bWVyaWMoZGZfaXBjYV9yYXckdmFsb3IpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDQuIE3DiURJQSBNRU5TQUwgRE8gRMOTTEFSDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpkZl9kb2xhcl9yYXckbWVzIDwtIGFzLkRhdGUoZm9ybWF0KGRmX2RvbGFyX3JhdyRkYXRhLCAiJVktJW0tMDEiKSkNCg0KZG9sYXJfbWVuc2FsIDwtIGFnZ3JlZ2F0ZSgNCiAgdmFsb3IgfiBtZXMsDQogIGRhdGEgPSBkZl9kb2xhcl9yYXcsDQogIEZVTiA9IG1lYW4sDQogIG5hLnJtID0gVFJVRQ0KKQ0KY29sbmFtZXMoZG9sYXJfbWVuc2FsKSA8LSBjKCJkYXRhIiwgImRvbGFyIikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNS4gSVBDQSBNRU5TQUwNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmRmX2lwY2FfcmF3JG1lcyA8LSBhcy5EYXRlKGZvcm1hdChkZl9pcGNhX3JhdyRkYXRhLCAiJVktJW0tMDEiKSkNCmlwY2FfbWVuc2FsIDwtIGRmX2lwY2FfcmF3WywgYygibWVzIiwgInZhbG9yIildDQpjb2xuYW1lcyhpcGNhX21lbnNhbCkgPC0gYygiZGF0YSIsICJpcGNhIikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNi4gSlVOw4fDg08NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmRmX2FuYWxpc2UgPC0gbWVyZ2UoZG9sYXJfbWVuc2FsLCBpcGNhX21lbnNhbCwgYnkgPSAiZGF0YSIpDQpkZl9hbmFsaXNlIDwtIGRmX2FuYWxpc2VbZGZfYW5hbGlzZSRkYXRhID49IGFzLkRhdGUoIjIwMjItMDEtMDEiKSwgXQ0KZGZfYW5hbGlzZSA8LSBkZl9hbmFsaXNlW29yZGVyKGRmX2FuYWxpc2UkZGF0YSksIF0NCmRmX2FuYWxpc2UkZGF0YV9zdHIgPC0gZm9ybWF0KGRmX2FuYWxpc2UkZGF0YSwgIiViLyVZIikNCg0KaWYgKG5yb3coZGZfYW5hbGlzZSkgPT0gMCkgc3RvcCgiTWVyZ2UgcmVzdWx0b3UgZW0gemVybyBsaW5oYXMg4oCUIGNvbmZpcmEgc2UgYXMgZGF0YXMgbWVuc2FpcyBiYXRlbSBlbnRyZSBhcyBkdWFzIHPDqXJpZXMuIikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNy4gR1LDgUZJQ08NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCnAgPC0gcGxvdF9seShkYXRhID0gZGZfYW5hbGlzZSkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRhdGEsIHkgPSB+ZG9sYXIsDQogICAgbmFtZSA9ICJEw7NsYXIgUHRheCAoUiQpIiwNCiAgICB0eXBlID0gInNjYXR0ZXIiLCBtb2RlID0gImxpbmVzK21hcmtlcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gY29sb3JzWzJdLCB3aWR0aCA9IDMpLA0KICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSBjb2xvcnNbMl0sIHNpemUgPSA2KSwNCiAgICBob3ZlcmluZm8gPSAidGV4dCIsDQogICAgdGV4dCA9IH5wYXN0ZTAoDQogICAgICAiPGI+RGF0YTo8L2I+ICIsIGRhdGFfc3RyLA0KICAgICAgIjxicj48Yj5Ew7NsYXIgUHRheDo8L2I+IFIkICIsIHNwcmludGYoIiUuMmYiLCBkb2xhcikNCiAgICApDQogICkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRhdGEsIHkgPSB+aXBjYSwNCiAgICBuYW1lID0gIklQQ0EgTWVuc2FsICglKSIsDQogICAgeWF4aXMgPSAieTIiLA0KICAgIHR5cGUgPSAic2NhdHRlciIsIG1vZGUgPSAibGluZXMrbWFya2VycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSBjb2xvcnNbMV0sIHdpZHRoID0gMywgZGFzaCA9ICJkb3QiKSwNCiAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gY29sb3JzWzFdLCBzaXplID0gNiksDQogICAgaG92ZXJpbmZvID0gInRleHQiLA0KICAgIHRleHQgPSB+cGFzdGUwKA0KICAgICAgIjxiPkRhdGE6PC9iPiAiLCBkYXRhX3N0ciwNCiAgICAgICI8YnI+PGI+SVBDQSBNZW5zYWw6PC9iPiAiLCBzcHJpbnRmKCIlLjJmIiwgaXBjYSksICIlIg0KICAgICkNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiVHJhamV0w7NyaWEgZG8gSVBDQSBlIGRvIETDs2xhciBQdGF4IiwNCiAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiwgY29sb3IgPSBjb2xvcnNbMl0sIHNpemUgPSAyMCksDQogICAgICB4ID0gMC41DQogICAgKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QobGlzdCgNCiAgICAgIHggPSAwLjUsIHkgPSAxLjA1LCB4cmVmID0gInBhcGVyIiwgeXJlZiA9ICJwYXBlciIsDQogICAgICB0ZXh0ID0gIkFuw6FsaXNlIGRhIGNvLW1vdmltZW50YcOnw6NvIGVudHJlIGEgdGF4YSBkZSBjw6JtYmlvIGUgYSBpbmZsYcOnw6NvIGFvIGNvbnN1bWlkb3IiLA0KICAgICAgc2hvd2Fycm93ID0gRkFMU0UsDQogICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQXJpYWwiLCBzaXplID0gMTMsIGNvbG9yID0gIiM0QjU1NjMiKQ0KICAgICkpLA0KICAgIHBsb3RfYmdjb2xvciA9ICIjRkZGRkZGIiwNCiAgICBwYXBlcl9iZ2NvbG9yID0gIiNGRkZGRkYiLA0KICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiwgY29sb3IgPSBjb2xvcnNbN10pLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICIiLCBzaG93Z3JpZCA9IFRSVUUsIGdyaWRjb2xvciA9ICIjRjNGNEY2IiksDQogICAgeWF4aXMgPSBsaXN0KA0KICAgICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiRMOzbGFyIFB0YXgg4oCUIE3DqWRpYSBNZW5zYWwgKFIkKSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sb3JzWzJdLCBzaXplID0gMTMpKSwNCiAgICAgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbG9yc1syXSksDQogICAgICBzaG93Z3JpZCA9IFRSVUUsIGdyaWRjb2xvciA9ICIjRjNGNEY2IiwgemVyb2xpbmUgPSBGQUxTRQ0KICAgICksDQogICAgeWF4aXMyID0gbGlzdCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIklQQ0EgTWVuc2FsICglKSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sb3JzWzFdLCBzaXplID0gMTMpKSwNCiAgICAgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbG9yc1sxXSksDQogICAgICBvdmVybGF5aW5nID0gInkiLCBzaWRlID0gInJpZ2h0IiwNCiAgICAgIHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gVFJVRSwgemVyb2xpbmVjb2xvciA9ICIjRTVFN0VCIg0KICAgICksDQogICAgaG92ZXJsYWJlbCA9IGxpc3QoDQogICAgICBiZ2NvbG9yID0gY29sb3JzWzJdLCBib3JkZXJjb2xvciA9IGNvbG9yc1sxXSwNCiAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCIsIHNpemUgPSAxMywgY29sb3IgPSAiI0ZGRkZGRiIpDQogICAgKSwNCiAgICBsZWdlbmQgPSBsaXN0KG9yaWVudGF0aW9uID0gImgiLCB4ID0gMC41LCB5ID0gLTAuMTUsIHhhbmNob3IgPSAiY2VudGVyIiksDQogICAgbWFyZ2luID0gbGlzdChsID0gNzAsIHIgPSA3MCwgdCA9IDEwMCwgYiA9IDgwKQ0KICApDQoNCnANCmBgYA0KDQpBcyBvc2NpbGHDp8O1ZXMgZG8gRMOzbGFyIFB0YXggZXhpYmVtIHZvbGF0aWxpZGFkZSBlbGV2YWRhIGRlIGN1cnRvIHByYXpvLCBxdWUgcG9kZW0gc2VyIG9yaWdpbmFkYXMgZGEgcHJvY3VyYSBkZSBtb2VkYXMgZXN0cmFuZ2VpcmFzIGVtIHVtIG1lcmNhZG8gZ2xvYmFsLiBRdWFuZG8gaMOhIG1haXMgcGVzc29hcyBxdWVyZW5kbyBjb21wcmFyIHVtYSBtb2VkYSwgbyBwcmXDp28gZGVsYSBzb2JlOyBxdWFuZG8gaMOhIG1haXMgcGVzc29hcyBxdWVyZW5kbyB2ZW5kZXIsIG8gcHJlw6dvIGNhaS4gQSBpbmZsYcOnw6NvLCBwb3Igc3VhIHZleiwgdGVuZGUgYSB0ZXIgbWVub3Igdm9sYXRpbGlkYWRlLCBwcmluY2lwYWxtZW50ZSBncmHDp2FzIGEgcG9sw610aWNhcyBtb25ldMOhcmlhcywgb3Ugc2VqYSwgaW50ZXJ2ZW7Dp8O1ZXMgZG8gZ292ZXJubyBxdWUgYnVzY2FtIGNvbnRyb2xhciBhIG9mZXJ0YSBkZSBtb2VkYSBwYXJhIG1hbnRlciBhIGluZmxhw6fDo28gZGVudHJvIGRhIG1ldGEuDQoNCkEgYWx0YSBkbyBkw7NsYXIgcHJlc3Npb25hIGEgaW5mbGHDp8OjbyBubyBCcmFzaWwgcG9ycXVlIGVuY2FyZWNlIHByb2R1dG9zIGltcG9ydGFkb3MsIG1hdMOpcmlhcy1wcmltYXMgZSBtZXJjYWRvcmlhcyBjb3RhZGFzIGVtIG1vZWRhIGVzdHJhbmdlaXJhLCBjb21vIGNvbWJ1c3TDrXZlaXMgZSBhbGltZW50b3MuIA0KDQpBbyBjb25mcm9udGFyIGEgdHJhamV0w7NyaWEgZGEgdGF4YSBkZSBjw6JtYmlvIGNvbWVyY2lhbCAoRMOzbGFyIFB0YXgpIGNvbSBhIHZhcmlhw6fDo28gbWVuc2FsIGRvIElQQ0EgYSBwYXJ0aXIgZGUgMjAyMiwgcGVyY2ViZS1zZSBxdWUgYXMgYWx0YXMgY2FtYmlhaXMgbsOjbyBzZSByZWZsZXRlbSBpbnN0YW50YW5lYW1lbnRlIG5vIMOtbmRpY2UgY2hlaW8gZGUgcHJlw6dvcy4gRXNzYSBhc3NpbWV0cmlhIHRlbXBvcmFsIHN1c3RlbnRhIGEgaGlww7N0ZXNlIGRhIHRyYW5zbWlzc8OjbyBkZWZhc2FkYSBkbyBjw6JtYmlvIChsYWdnZWQgcGFzcy10aHJvdWdoKS4NCg0KQSBsdXogZGEgdGVvcmlhIGVjb27DtG1pY2EsIG8gcmVwYXNzZSBjYW1iaWFsIHBhcmEgb3MgcHJlw6dvcyBmaW5haXMgw6kgYW1vcnRlY2lkbyBwb3IgZXRhcGFzIG9wZXJhY2lvbmFpcyBkYSBjYWRlaWEgZGUgc3VwcmltZW50b3MsIGNvbW8gcG9yIGV4ZW1wbG8sIGEgYWJzb3LDp8OjbyBpbmljaWFsIGRlIGluc3Vtb3MgZSBjb21wcmVzc8OjbyBkZSBtYXJnZW5zLCBubyBxdWFsIG9zIHByb2R1dG9zIGUgY29tZXJjaWFudGVzIHRlbmRlbSBhIGFic29ydmVyIHBhcnRlIGRhIG9zY2lsaWHDp8OjbywgcmVkdXppbmRvIHNldSBsdWNybyBwYXJhIHByZXNlcnZhciB2b2x1bWUgZGUgdmVuZGFzLiBPIGF1bWVudG8gZGUgY3VzdG9zIHJlcGFzc2EgZ3JhZGF0aXZhbWVudGUgcGFyYSBhcyBldGlxdWV0YXMgZG8gdmFyZWpvLCBhdGluZ2luZG8gbyDDrW5kaWNlIGNoZWlvIGRlIGluZmxhw6fDo28gY29uc3VtaWRhIHBlbGFzIGZhbcOtbGlhcy4gDQoNClBhcmEgdGVzdGFyIGVzdGF0aXN0aWNhbWVudGUgYSBleGlzdMOqbmNpYSBlIGEgZHVyYcOnw6NvIGRlc3NhIGRlZmFzYWdlbSwgdXRpbGl6YXJlbW9zIGEgZnVuw6fDo28gZGUgY29ycmVsYcOnw6NvIGNydXphZGEgZW50cmUgbyByZXRvcm5vIGxvZ2Fyw610bWljbyBtZW5zYWwgZG8gRMOzbGFyIFB0YXggKHQpIGUgYSB2YXJpYcOnw6NvIG1lbnNhbCBkbyBJUENBICh0K2spLg0KDQojIyAxLjQgQ2F1c2FsaWRhZGUgZXN0cnV0dXJhbCBlIGRpbsOibWljYSB0ZW1wb3JhbDogY29ycmVsYcOnw6NvIGNydXphZGEsIG1vZGVsbyBWQVIgZSBmdW7Dp8OjbyBpbXB1bHNvLXJlc3Bvc3RhIChJUkYpDQoNCioqR3LDoWZpY28gMS4yIOKAlCBDb3JyZWxhw6fDo28gY3J1emFkYSBlbnRyZSBvIHJldG9ybm8gZG8gZMOzbGFyIGUgbyBJUENBKioNCg0KYGBge3IgcDEtY29ycmVsYWNhby1jcnV6YWRhfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDkuIEJBU0UgUEFSQSBBIENPUlJFTEHDh8ODTyBDUlVaQURBDQojIENvbnN0cnXDrWRhIGEgcGFydGlyIGRlIGRmX2FuYWxpc2UgKGNyaWFkbyBubyBjaHVuayBkbyBHcsOhZmljbyAxLjEpDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpkZl9jY2YgPC0gZGZfYW5hbGlzZVtvcmRlcihkZl9hbmFsaXNlJGRhdGEpLCBdDQpkZl9jY2YkZG9sYXJfcmV0b3JubyA8LSBjKE5BLCAxMDAgKiBkaWZmKGxvZyhkZl9jY2YkZG9sYXIpKSkNCmRmX2NjZiA8LSBkZl9jY2ZbIWlzLm5hKGRmX2NjZiRkb2xhcl9yZXRvcm5vKSwgYygiZGF0YSIsICJkb2xhcl9yZXRvcm5vIiwgImlwY2EiKV0NCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTAuIENPUlJFTEHDh8ODTyBDUlVaQURBIENPTSBJTlRFUlBSRVRBw4fDg08gRUNPTsOUTUlDQQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KbGFncyA8LSAtNjo2DQoNCmNvcnJlbGFjb2VzIDwtIHNhcHBseShsYWdzLCBmdW5jdGlvbihrKSB7DQoNCiAgaWYgKGsgPj0gMCkgew0KDQogICAgeCA8LSBkZl9jY2YkZG9sYXJfcmV0b3Jub1sxOihucm93KGRmX2NjZikgLSBrKV0NCiAgICB5IDwtIGRmX2NjZiRpcGNhWygxICsgayk6bnJvdyhkZl9jY2YpXQ0KDQogIH0gZWxzZSB7DQoNCiAgICBrX2FicyA8LSBhYnMoaykNCg0KICAgIHggPC0gZGZfY2NmJGRvbGFyX3JldG9ybm9bKDEgKyBrX2Ficyk6bnJvdyhkZl9jY2YpXQ0KICAgIHkgPC0gZGZfY2NmJGlwY2FbMToobnJvdyhkZl9jY2YpIC0ga19hYnMpXQ0KICB9DQoNCiAgY29yKHgsIHksIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KfSkNCg0KcmVzdWx0YWRvX2NjZiA8LSBkYXRhLmZyYW1lKA0KICBsYWcgPSBsYWdzLA0KICBjb3JyZWxhY2FvID0gY29ycmVsYWNvZXMNCikNCg0KIyByZXN1bHRhZG9fY2NmICAgIyBkZXNjb21lbnRlIHBhcmEgdmVyIGEgdGFiZWxhIG5vIGNvbnNvbGUNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTEuIEdSw4FGSUNPIOKAlCBDT1JSRUxBw4fDg08gQ1JVWkFEQQ0KIyBSZXRvcm5vIGRvIGTDs2xhciBlbSB0IOKGkiBJUENBIGVtIHQraw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KcF9jY2YgPC0gcGxvdF9seSgNCiAgZGF0YSA9IHJlc3VsdGFkb19jY2YsDQogIHggPSB+bGFnLA0KICB5ID0gfmNvcnJlbGFjYW8sDQogIHR5cGUgPSAiYmFyIiwNCiAgbWFya2VyID0gbGlzdCgNCiAgICBjb2xvciA9IGlmZWxzZShyZXN1bHRhZG9fY2NmJGNvcnJlbGFjYW8gPj0gMCwNCiAgICAgICAgICAgICAgICAgICAiI0ZFQjcxMiIsDQogICAgICAgICAgICAgICAgICAgIiMwMjAyM0MiKQ0KICApLA0KICBob3ZlcnRlbXBsYXRlID0gcGFzdGUwKA0KICAgICI8Yj5EZWZhc2FnZW06PC9iPiAle3h9IG1lc2VzIiwNCiAgICAiPGJyPjxiPkNvcnJlbGHDp8Ojbzo8L2I+ICV7eTouM2Z9IiwNCiAgICAiPGV4dHJhPjwvZXh0cmE+Ig0KICApDQopICU+JQ0KICBhZGRfc2VnbWVudHMoDQogICAgeCA9IC02LCB4ZW5kID0gNiwNCiAgICB5ID0gMCwgeWVuZCA9IDAsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiI0E2QTZBNiIsIHdpZHRoID0gMSkNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiQ29ycmVsYcOnw6NvIGNydXphZGE6IHJldG9ybm8gZG8gZMOzbGFyIMOXIElQQ0EiLA0KICAgICAgZm9udCA9IGxpc3QoDQogICAgICAgIGZhbWlseSA9ICJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiwNCiAgICAgICAgY29sb3IgPSAiIzAyMDIzQyIsDQogICAgICAgIHNpemUgPSAyMA0KICAgICAgKSwNCiAgICAgIHggPSAwLjUNCiAgICApLA0KDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IDAuNSwNCiAgICAgICAgeSA9IDEuMDUsDQogICAgICAgIHhyZWYgPSAicGFwZXIiLA0KICAgICAgICB5cmVmID0gInBhcGVyIiwNCiAgICAgICAgdGV4dCA9ICJSZXRvcm5vIGRvIGTDs2xhciBlbSB0IOKGkiBJUENBIGVtIHQrayIsDQogICAgICAgIHNob3dhcnJvdyA9IEZBTFNFLA0KICAgICAgICBmb250ID0gbGlzdCgNCiAgICAgICAgICBmYW1pbHkgPSAiQXJpYWwiLA0KICAgICAgICAgIHNpemUgPSAxMywNCiAgICAgICAgICBjb2xvciA9ICIjNEI1NTYzIg0KICAgICAgICApDQogICAgICApDQogICAgKSwNCg0KICAgIHhheGlzID0gbGlzdCgNCiAgICAgIHRpdGxlID0gIkRlZmFzYWdlbSAobWVzZXMpIiwNCiAgICAgIHRpY2ttb2RlID0gImxpbmVhciIsDQogICAgICBkdGljayA9IDEsDQogICAgICBzaG93Z3JpZCA9IEZBTFNFLA0KICAgICAgemVyb2xpbmUgPSBGQUxTRQ0KICAgICksDQoNCiAgICB5YXhpcyA9IGxpc3QoDQogICAgICB0aXRsZSA9ICJDb3JyZWxhw6fDo28iLA0KICAgICAgc2hvd2dyaWQgPSBUUlVFLA0KICAgICAgZ3JpZGNvbG9yID0gIiNGM0Y0RjYiLA0KICAgICAgemVyb2xpbmUgPSBGQUxTRQ0KICAgICksDQoNCiAgICBwbG90X2JnY29sb3IgPSAiI0ZGRkZGRiIsDQogICAgcGFwZXJfYmdjb2xvciA9ICIjRkZGRkZGIiwNCg0KICAgIGZvbnQgPSBsaXN0KA0KICAgICAgZmFtaWx5ID0gIkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiLA0KICAgICAgY29sb3IgPSAiIzExMTgyNyINCiAgICApLA0KDQogICAgaG92ZXJsYWJlbCA9IGxpc3QoDQogICAgICBiZ2NvbG9yID0gIiMwMjAyM0MiLA0KICAgICAgYm9yZGVyY29sb3IgPSAiI0ZFQjcxMiIsDQogICAgICBmb250ID0gbGlzdCgNCiAgICAgICAgZmFtaWx5ID0gIkFyaWFsIiwNCiAgICAgICAgc2l6ZSA9IDEzLA0KICAgICAgICBjb2xvciA9ICIjRkZGRkZGIg0KICAgICAgKQ0KICAgICksDQoNCiAgICBtYXJnaW4gPSBsaXN0KA0KICAgICAgbCA9IDcwLA0KICAgICAgciA9IDQwLA0KICAgICAgdCA9IDEwMCwNCiAgICAgIGIgPSA3MA0KICAgICkNCiAgKQ0KDQpwX2NjZg0KYGBgDQpBIGZ1bsOnw6NvIGRlIGNvcnJlbGHDp8OjbyBjcnV6YWRhIGVudHJlIG8gcmV0b3JubyBtZW5zYWwgZG8gZMOzbGFyIGUgbyBJUENBIGV2aWRlbmNpYSB1bWEgZGluw6JtaWNhIHRlbXBvcmFsIG7Do28gY29udGVtcG9yw6JuZWEuIEFzIGNvcnJlbGHDp8O1ZXMgc8OjbyBuZWdhdGl2YXMgbm9zIHBlcsOtb2RvcyBkZSAwIGEgMiBtZXNlcyBhcMOzcyBhIHZhcmlhw6fDo28gY2FtYmlhbCwgdG9ybmFuZG8tc2UgcG9zaXRpdmFzIGEgcGFydGlyIGRvIHRlcmNlaXJvIG3DqnMuIEEgbWFpb3IgY29ycmVsYcOnw6NvIG9jb3JyZSBubyBxdWludG8gbcOqcyBhcMOzcyBvIG1vdmltZW50byBjYW1iaWFsLCBjb20gY29lZmljaWVudGUgZGUgMCw0MzIsIGVucXVhbnRvIG5vIHNleHRvIG3DqnMgcGVybWFuZWNlIHBvc2l0aXZhICgwLDI2MikuICANCg0KRXNzZSBwYWRyw6NvIHN1Z2VyZSB1bWEgYXNzb2NpYcOnw6NvIHRlbXBvcmFsIGRlZmFzYWRhIGVudHJlIG1vdmltZW50b3MgY2FtYmlhaXMgZSBpbmZsYcOnw6NvLCBjb21wYXTDrXZlbCBjb20gYSBoaXDDs3Rlc2UgZGUgcXVlIHBhcnRlIGRhIHRyYW5zbWlzc8OjbyBkbyBjw6JtYmlvIGFvcyBwcmXDp29zIG9jb3JyZSBncmFkdWFsbWVudGUuIEVudHJldGFudG8sIGEgY29ycmVsYcOnw6NvIGNydXphZGEgbsOjbyBwZXJtaXRlLCBpc29sYWRhbWVudGUsIGlkZW50aWZpY2FyIHJlbGHDp8OjbyBkZSBjYXVzYWxpZGFkZSwgY29udHJvbGFyIHBvciBvdXRyb3MgY2hvcXVlcyBkZSBvZmVydGEvZGVtYW5kYSBuZW0gcXVhbnRpZmljYXIgbyBjb2VmaWNpZW50ZSBleGF0byBkZSBwYXNzLXRocm91Z2guICANCg0KUGFyYSBpciBhbMOpbSBkYSBhc3NvY2lhw6fDo28gbGluZWFyIGUgaXNvbGFyIGEgcmVsYcOnw6NvIGRlIGNhdXNhbGlkYWRlIGVudHJlIGFzIHZhcmnDoXZlaXMsIGVzdGltb3Utc2UgdW0gbW9kZWxvIGRlIFZldG9yZXMgQXV0b3JyZWdyZXNzaXZvcyBkZSBvcmRlbSAzIOKAlCBWQVIoMykg4oCUIHV0aWxpemFuZG8gZGFkb3MgdHJpbWVzdHJhaXMgcXVlIHJlbGFjaW9uYW0gYSB2YXJpYcOnw6NvIGNhbWJpYWwgKM6UZSkgZSBhIHRheGEgdHJpbWVzdHJhbCBkbyBJUENBIChJUENBX3RyaSkuIEEgRnVuw6fDo28gSW1wdWxzby1SZXNwb3N0YSAoSVJGKSBnZXJhZGEgcGVsbyBtb2RlbG8gcGVybWl0ZSBzaW11bGFyIG8gY29tcG9ydGFtZW50byBkYSBpbmZsYcOnw6NvIGFvIGxvbmdvIGRlIDEyIHRyaW1lc3RyZXMgZGlhbnRlIGRlIHVtIGNob3F1ZSBuw6NvIGFudGVjaXBhZG8gZGUgZGVzdmFsb3JpemHDp8OjbyBkbyBjw6JtYmlvLg0KDQoqKkdyw6FmaWNvIDEuMyDigJQgRnVuw6fDo28gaW1wdWxzby1yZXNwb3N0YTogcmVzcG9zdGEgZG8gSVBDQSBhIHVtIGNob3F1ZSBjYW1iaWFsKioNCg0KYGBge3IgcDEtaXJmLCByZXN1bHRzPSdoaWRlJ30NCiMjIyAzLiBJUkYgVkFSSUFDQU8gVFJJTUVTVFJBTA0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAxLiBQQUNPVEVTDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpsaWJyYXJ5KGh0dHIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkodmFycykNCmxpYnJhcnkoZ2dwbG90MikNCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAyLiBGVU7Dh8ODTyBQQVJBIEJVU0NBUiBEQURPUyBETyBCQUNFTg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KYnVzY2FyX2JhY2VuIDwtIGZ1bmN0aW9uKHNlcmllLCBpbmljaW8sIGZpbSkgew0KICANCiAgdXJsIDwtIHBhc3RlMCgNCiAgICAiaHR0cHM6Ly9hcGkuYmNiLmdvdi5ici9kYWRvcy9zZXJpZS9iY2RhdGEuc2dzLiIsDQogICAgc2VyaWUsDQogICAgIi9kYWRvcz9mb3JtYXRvPWpzb24iLA0KICAgICImZGF0YUluaWNpYWw9IiwgaW5pY2lvLA0KICAgICImZGF0YUZpbmFsPSIsIGZpbQ0KICApDQogIA0KICByZXNwb3N0YSA8LSBHRVQodXJsKQ0KICANCiAgdGV4dG8gPC0gY29udGVudCgNCiAgICByZXNwb3N0YSwNCiAgICBhcyA9ICJ0ZXh0IiwNCiAgICBlbmNvZGluZyA9ICJVVEYtOCINCiAgKQ0KICANCiAgIyBWZXJpZmljYSBzZSBhIEFQSSByZXNwb25kZXUgY29ycmV0YW1lbnRlDQogIGlmIChzdGF0dXNfY29kZShyZXNwb3N0YSkgIT0gMjAwKSB7DQogICAgc3RvcCgNCiAgICAgIHBhc3RlKA0KICAgICAgICAiRXJybyBuYSBBUEkgZG8gQkFDRU4uIEPDs2RpZ286IiwNCiAgICAgICAgc3RhdHVzX2NvZGUocmVzcG9zdGEpLA0KICAgICAgICAiXG4iLA0KICAgICAgICB0ZXh0bw0KICAgICAgKQ0KICAgICkNCiAgfQ0KICANCiAgZGFkb3MgPC0gZnJvbUpTT04oDQogICAgdGV4dG8sDQogICAgc2ltcGxpZnlWZWN0b3IgPSBUUlVFDQogICkNCiAgDQogICMgU2UgdmllciBjb21vIGxpc3RhLCB0cmFuc2Zvcm1hIGVtIGRhdGEuZnJhbWUNCiAgaWYgKGlzLmxpc3QoZGFkb3MpICYmICFpcy5kYXRhLmZyYW1lKGRhZG9zKSkgew0KICAgIGRhZG9zIDwtIGJpbmRfcm93cyhkYWRvcykNCiAgfQ0KICANCiAgZGFkb3MgPC0gYXMuZGF0YS5mcmFtZShkYWRvcykNCiAgDQogICMgUGFkcm9uaXphIG9zIG5vbWVzDQogIGRhZG9zIDwtIGRhZG9zICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIGRhdGEgPSBkbXkoZGF0YSksDQogICAgICB2YWxvciA9IGFzLm51bWVyaWModmFsb3IpDQogICAgKQ0KICANCiAgcmV0dXJuKGRhZG9zKQ0KfQ0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAzLiBQRVLDjU9ETw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZmltIDwtIFN5cy5EYXRlKCkNCmluaWNpbyA8LSBmaW0gJW0tJSB5ZWFycygxNSkNCg0KaW5pY2lvDQpmaW0NCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNC4gU8OJUklFIDEg4oCUIEPDgk1CSU8NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgUHJpbWVpcm9zIDEwIGFub3MNCmNhbWJpb18xIDwtIGJ1c2Nhcl9iYWNlbigNCiAgMSwNCiAgZm9ybWF0KGluaWNpbywgIiVkLyVtLyVZIiksDQogIGZvcm1hdChpbmljaW8gJW0rJSB5ZWFycygxMCksICIlZC8lbS8lWSIpDQopDQoNCiMgw5psdGltb3MgNSBhbm9zDQpjYW1iaW9fMiA8LSBidXNjYXJfYmFjZW4oDQogIDEsDQogIGZvcm1hdChpbmljaW8gJW0rJSB5ZWFycygxMCkgKyBkYXlzKDEpLCAiJWQvJW0vJVkiKSwNCiAgZm9ybWF0KGZpbSwgIiVkLyVtLyVZIikNCikNCg0KIyBKdW50YQ0KY2FtYmlvIDwtIGJpbmRfcm93cygNCiAgY2FtYmlvXzEsDQogIGNhbWJpb18yDQopICU+JQ0KICBkaXN0aW5jdChkYXRhLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUNCiAgYXJyYW5nZShkYXRhKQ0KDQpoZWFkKGNhbWJpbykNCnRhaWwoY2FtYmlvKQ0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyA1LiBTw4lSSUUgNDMzIOKAlCBJUENBDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppcGNhIDwtIGJ1c2Nhcl9iYWNlbigNCiAgNDMzLA0KICBmb3JtYXQoaW5pY2lvLCAiJWQvJW0vJVkiKSwNCiAgZm9ybWF0KGZpbSwgIiVkLyVtLyVZIikNCikNCg0KaGVhZChpcGNhKQ0KdGFpbChpcGNhKQ0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyA2LiBDw4JNQklPIFRSSU1FU1RSQUwNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNhbWJpb190cmkgPC0gY2FtYmlvICU+JQ0KICBtdXRhdGUoDQogICAgdHJpbWVzdHJlID0gcGFzdGUwKA0KICAgICAgeWVhcihkYXRhKSwNCiAgICAgICItVCIsDQogICAgICBxdWFydGVyKGRhdGEpDQogICAgKQ0KICApICU+JQ0KICBncm91cF9ieSh0cmltZXN0cmUpICU+JQ0KICBzbGljZV9tYXgoZGF0YSwgbiA9IDEpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGFycmFuZ2UoZGF0YSkgJT4lDQogIHNlbGVjdCgNCiAgICB0cmltZXN0cmUsDQogICAgY2FtYmlvID0gdmFsb3INCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGRlbHRhX2UgPSAxMDAgKiAoDQogICAgICBsb2coY2FtYmlvKSAtIGxhZyhsb2coY2FtYmlvKSkNCiAgICApDQogICkNCiAgDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyA3LiBJUENBIFRSSU1FU1RSQUwNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmlwY2FfdHJpIDwtIGlwY2EgJT4lDQogIG11dGF0ZSgNCiAgICB0cmltZXN0cmUgPSBwYXN0ZTAoDQogICAgICB5ZWFyKGRhdGEpLA0KICAgICAgIi1UIiwNCiAgICAgIHF1YXJ0ZXIoZGF0YSkNCiAgICApDQogICkgJT4lDQogIGdyb3VwX2J5KHRyaW1lc3RyZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBpcGNhX3RyaSA9ICgNCiAgICAgIHByb2QoMSArIHZhbG9yIC8gMTAwKSAtIDENCiAgICApICogMTAwLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KICANCiAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgOC4gQkFTRSBGSU5BTA0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZGFkb3NfdHJpIDwtIGNhbWJpb190cmkgJT4lDQogIGlubmVyX2pvaW4oDQogICAgaXBjYV90cmksDQogICAgYnkgPSAidHJpbWVzdHJlIg0KICApICU+JQ0KICBzZWxlY3QoDQogICAgdHJpbWVzdHJlLA0KICAgIGRlbHRhX2UsDQogICAgaXBjYV90cmkNCiAgKSAlPiUNCiAgZHJvcF9uYSgpDQoNCmhlYWQoZGFkb3NfdHJpKQ0KdGFpbChkYWRvc190cmkpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDkuIFZBUg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KbGlicmFyeSh2YXJzKQ0KDQojIEJhc2UgcGFyYSBvIFZBUg0KdmFyX2RhdGEgPC0gZGFkb3NfdHJpICU+JQ0KICBzZWxlY3QoZGVsdGFfZSwgaXBjYV90cmkpDQoNCiMgVmVyaWZpY2HDp8Ojbw0KaGVhZCh2YXJfZGF0YSkNCnN1bW1hcnkodmFyX2RhdGEpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDkuMSBTRUxFw4fDg08gRE8gTsOaTUVSTyBERSBERUZBU0FHRU5TDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpsYWdfc2VsZWN0aW9uIDwtIFZBUnNlbGVjdCgNCiAgdmFyX2RhdGEsDQogIGxhZy5tYXggPSA4LA0KICB0eXBlID0gImNvbnN0Ig0KKQ0KDQpsYWdfc2VsZWN0aW9uJHNlbGVjdGlvbg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAxMC4gRVNUSU1Bw4fDg08gRE8gVkFSDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQptb2RlbG9fdmFyIDwtIFZBUigNCiAgdmFyX2RhdGEsDQogIHAgPSAzLA0KICB0eXBlID0gImNvbnN0Ig0KKQ0KDQpzdW1tYXJ5KG1vZGVsb192YXIpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDExLiBGVU7Dh8ODTyBJTVBVTFNPLVJFU1BPU1RBDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppcmZfY2FtYmlvIDwtIGlyZigNCiAgbW9kZWxvX3ZhciwNCiAgaW1wdWxzZSA9ICJkZWx0YV9lIiwNCiAgcmVzcG9uc2UgPSAiaXBjYV90cmkiLA0KICBuLmFoZWFkID0gMTIsDQogIG9ydGhvID0gVFJVRSwNCiAgYm9vdCA9IFRSVUUsDQogIHJ1bnMgPSAxMDAwLA0KICBjaSA9IDAuOTUNCikNCg0Kc3RyKGlyZl9jYW1iaW8pDQoNCmlyZl9jYW1iaW8kaXJmJGRlbHRhX2UNCg0KaXJmX2NhbWJpbyRMb3dlciRkZWx0YV9lDQppcmZfY2FtYmlvJFVwcGVyJGRlbHRhX2UNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTIuIElSRiDigJQgQ0hPUVVFIENBTUJJQUwg4oaSIElQQ0ENCiMgUEFEUsODTyBJQk1BQ1JPDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTIuMSBFWFRSQUlSIFJFU1VMVEFET1MgREEgSVJGDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppcmZfZGYgPC0gZGF0YS5mcmFtZSgNCiAgcGVyaW9kbyA9IDA6MTIsDQogIHJlc3Bvc3RhID0gYXMubnVtZXJpYyhpcmZfY2FtYmlvJGlyZiRkZWx0YV9lKSwNCiAgaW5mZXJpb3IgPSBhcy5udW1lcmljKGlyZl9jYW1iaW8kTG93ZXIkZGVsdGFfZSksDQogIHN1cGVyaW9yID0gYXMubnVtZXJpYyhpcmZfY2FtYmlvJFVwcGVyJGRlbHRhX2UpDQopDQoNCiMgQ29uZmVyaXINCnByaW50KGlyZl9kZikNCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAxMi4yIENPUkVTIOKAlCBQQURSw4NPIElCTUFDUk8NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmlibWFjcm9fYmx1ZSA8LSAiIzAyMDIzQyINCmlibWFjcm9fYmx1ZTIgPC0gIiMzNjNFNkIiDQppYm1hY3JvX3llbGxvdyA8LSAiI0ZFQjcxMiINCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAxMi4zIEdSw4FGSUNPDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpncmFmaWNvX2lyZiA8LSBnZ3Bsb3QoDQogIGlyZl9kZiwNCiAgYWVzKHggPSBwZXJpb2RvLCB5ID0gcmVzcG9zdGEpDQopICsNCg0KICAjIEludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICBnZW9tX3JpYmJvbigNCiAgICBhZXMoDQogICAgICB5bWluID0gaW5mZXJpb3IsDQogICAgICB5bWF4ID0gc3VwZXJpb3INCiAgICApLA0KICAgIGZpbGwgPSBpYm1hY3JvX2JsdWUyLA0KICAgIGFscGhhID0gMC4xOA0KICApICsNCg0KICAjIExpbmhhIGhvcml6b250YWwgZW0gemVybw0KICBnZW9tX2hsaW5lKA0KICAgIHlpbnRlcmNlcHQgPSAwLA0KICAgIGNvbG9yID0gaWJtYWNyb19ibHVlLA0KICAgIGxpbmV3aWR0aCA9IDAuNw0KICApICsNCg0KICAjIFJlc3Bvc3RhIGRhIElSRg0KICBnZW9tX2xpbmUoDQogICAgY29sb3IgPSBpYm1hY3JvX3llbGxvdywNCiAgICBsaW5ld2lkdGggPSAxLjMNCiAgKSArDQoNCiAgIyBQb250b3MgZGEgcmVzcG9zdGENCiAgZ2VvbV9wb2ludCgNCiAgICBjb2xvciA9IGlibWFjcm9feWVsbG93LA0KICAgIHNpemUgPSAyLjINCiAgKSArDQoNCiAgIyBFaXhvcw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgYnJlYWtzID0gMDoxMiwNCiAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMiwgMC4wMikpDQogICkgKw0KDQogICMgVMOtdHVsb3MNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSZXNwb3N0YSBkbyBJUENBIGEgdW0gY2hvcXVlIGNhbWJpYWwiLA0KICAgIHN1YnRpdGxlID0gIkZ1bsOnw6NvIGltcHVsc28tcmVzcG9zdGEg4oCUIFZBUigzKSwgZGFkb3MgdHJpbWVzdHJhaXMiLA0KICAgIHggPSAiVHJpbWVzdHJlcyBhcMOzcyBvIGNob3F1ZSIsDQogICAgeSA9ICJSZXNwb3N0YSBkbyBJUENBIg0KICApICsNCg0KICAjIFRlbWEgSUJNYWNybw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArDQoNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGNvbG9yID0gaWJtYWNyb19ibHVlLA0KICAgICAgc2l6ZSA9IDE2LA0KICAgICAgZmFjZSA9ICJib2xkIiwNCiAgICAgIGhqdXN0ID0gMA0KICAgICksDQoNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgY29sb3IgPSBpYm1hY3JvX2JsdWUyLA0KICAgICAgc2l6ZSA9IDExLA0KICAgICAgaGp1c3QgPSAwDQogICAgKSwNCg0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoDQogICAgICBjb2xvciA9IGlibWFjcm9fYmx1ZSwNCiAgICAgIGZhY2UgPSAiYm9sZCINCiAgICApLA0KDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KA0KICAgICAgY29sb3IgPSBpYm1hY3JvX2JsdWUNCiAgICApLA0KDQogICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCg0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZSgNCiAgICAgIGNvbG9yID0gIiNFNUU1RTUiLA0KICAgICAgbGluZXdpZHRoID0gMC40DQogICAgKSwNCg0KICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgNCiAgICAgIGNvbG9yID0gaWJtYWNyb19ibHVlLA0KICAgICAgbGluZXdpZHRoID0gMC41DQogICAgKSwNCg0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKA0KICAgICAgMTUsIDIwLCAxNSwgMTUNCiAgICApDQogICkNCg0KZ3JhZmljb19pcmYNCmBgYA0KDQpBIHJlc3Bvc3RhIGRhIGluZmxhw6fDo28gYWNlbGVyYSBpbnRlbnNhbWVudGUgbm8gMsK6IHRyaW1lc3RyZSBhcMOzcyBvIGNob3F1ZSwgYXRpbmdpbmRvIHNldSBwb250byBtw6F4aW1vIGVtICswLDQwLiBFc3NlIHJlc3VsdGFkbyBjb25maXJtYSBmb3JtYWxtZW50ZSBvIHBhZHLDo28gb2JzZXJ2YWRvIG5hIGNvcnJlbGHDp8OjbyBjcnV6YWRhOiBjb21vIDIgdHJpbWVzdHJlcyBjb3JyZXNwb25kZW0gYSBhcHJveGltYWRhbWVudGUgNSBhIDYgbWVzZXMsIGVzdGUgw6kgbyBpbnRlcnZhbG8gZXhhdG8gbmVjZXNzw6FyaW8gcGFyYSBxdWUgbyBhdW1lbnRvIGRlIGN1c3RvcyBkb3MgaW5zdW1vcyBpbXBvcnRhZG9zIGUgY29tbW9kaXRpZXMgcGVycGFzc2UgaW50ZWdyYWxtZW50ZSBhIGNhZGVpYSBwcm9kdXRpdmEgZSBjaGVndWUgw6BzIGV0aXF1ZXRhcyBkbyB2YXJlam8uIEFsw6ltIGRpc3NvLCBub3RhLXNlIHF1ZSBubyB0cmltZXN0cmUgMiBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JSAoc29tYnJhIGNpbnphKSBmaWNhIGludGVpcmFtZW50ZSBhY2ltYSBkYSBsaW5oYSBkZSB6ZXJvLCBjb21wcm92YW5kbyBxdWUgbyBpbXBhY3RvIHBvc2l0aXZvIGRvIGPDom1iaW8gc29icmUgYSBpbmZsYcOnw6NvIMOpIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlDQoNCkNvbSBpc3NvLCBhIGV2aWTDqm5jaWEgZW1ww61yaWNhIG9idGlkYSBjb25maXJtYSBxdWUgbyBjw6JtYmlvIG9wZXJhIGNvbW8gdW0gY2hvcXVlIGRlIG9mZXJ0YSBleMOzZ2VubyByZWxldmFudGUgbm8gQnJhc2lsLiBBIHRyYW5zbWlzc8OjbyBuw6NvIMOpIGltZWRpYXRhLCBleGliaW5kbyB1bWEgZGVmYXNhZ2VtIGVzdHJ1dHVyYWwgZGUgY2VyY2EgZGUgZG9pcyB0cmltZXN0cmVzIGF0w6kgYXRpbmdpciBzZXUgaW1wYWN0byBtw6F4aW1vIG5vIElQQ0EsIHBhcmEgZW50w6NvIGRpc3NpcGFyLXNlIGdyYWR1YWxtZW50ZSBhbyBsb25nbyBkb3MgYW5vcyBzdWJzZXF1ZW50ZXMuDQoNCiMjIDEuNSBBbsOhbGlzZSBkaXN0cmlidXRpdmEgZGEgaW5mbGHDp8OjbzogaGV0ZXJvZ2VuZWlkYWRlIGRvIGltcGFjdG8gcG9yIGZhaXhhIGRlIHJlbmRhDQoNCkEgYW7DoWxpc2UgZG9zIGFncmVnYWRvcyBtYWNyb2Vjb27DtG1pY29zIGUgYSBpZGVudGlmaWNhw6fDo28gZG8gcGFzcy10aHJvdWdoIGNhbWJpYWwgdmlhIG1vZGVsbyBWQVIgZGVtb25zdHJhbSBxdWUgY2hvcXVlcyBuYSB0YXhhIGRlIGPDom1iaW8gYWx0ZXJhbSBhIHRyYWpldMOzcmlhIGRvIElQQ0EgY2hlaW8gZGUgZm9ybWEgZGVmYXNhZGEuIE5vIGVudGFudG8sIG8gw61uZGljZSBnZXJhbCBvY3VsdGEgZGlzcGFyaWRhZGVzIGNydWNpYWlzIG5hIGV4cGVyacOqbmNpYSBpbmZsYWNpb27DoXJpYSBkYXMgZmFtw61saWFzLiBVbWEgdmV6IHF1ZSBvIHBhZHLDo28gZGUgY29uc3VtbyB2YXJpYSBzaWduaWZpY2F0aXZhbWVudGUgY29uZm9ybWUgbyBuw612ZWwgZGUgcmVuZGltZW50bywgb3MgY2hvcXVlcyBkZSBwcmXDp29zIOKAlCBlc3BlY2lhbG1lbnRlIGFxdWVsZXMgb3JpdW5kb3MgZG8gY8OibWJpbyBlIGRhcyBjb21tb2RpdGllcyDigJQgbsOjbyBpbXBhY3RhbSBhIHBvcHVsYcOnw6NvIGRlIGZvcm1hIGhvbW9nw6puZWEuDQoNClBhcmEgY29tcHJlZW5kZXIgYSBkaW7Dom1pY2EgZGUgdHJhbnNtaXNzw6NvIGRhIGluZmxhw6fDo28gcGFyYSBvIHBvZGVyIGRlIGNvbXByYSBlIGEgcmVkaXN0cmlidWnDp8OjbyBkYSByZW5kYSByZWFsLCBlc3RhIHNlw6fDo28gYW5hbGlzYSBhIHRyYWpldMOzcmlhIGRvIElQQ0EgZGVzYWdyZWdhZG8gcG9yIGZhaXhhcyBzb2Npb2Vjb27DtG1pY2FzIChjb20gZGFkb3MgZG8gSXBlYSksIGludmVzdGlnYW5kbyBhcyBhc3NpbWV0cmlhcyBuYSBjb21wb3Npw6fDo28gZGEgY2VzdGEgZGUgY29uc3VtbywgYSBpbnZlcnPDo28gZGUgcGF0YW1hcmVzIG9ic2VydmFkYSBlbSAyMDI2IGUgYSBzZW5zaWJpbGlkYWRlIGRvIGdydXBvIGRlIGFsaW1lbnRvcyBmcmVudGUgw6BzIG9zY2lsYcOnw7VlcyBjYW1iaWFpcy4NCg0KIyMgMS42IEEgaW52ZXJzw6NvIGVzdHJ1dHVyYWwgcG9yIGZhaXhhIGRlIHJlbmRhDQoNCkVtIG1vbWVudG9zIGRlIGNob3F1ZSBkZSBvZmVydGEg4oCUIGNvbW8gZGVzdmFsb3JpemHDp8O1ZXMgY2FtYmlhaXMgYWNlbnR1YWRhcyBvdSBxdWVicmFzIGRlIHNhZnJhIOKAlCwgYSBpbmZsYcOnw6NvIGNvc3R1bWEgcGVuYWxpemFyIG1haXMgc2V2ZXJhbWVudGUgYXMgZmFtw61saWFzIGRlIG1lbm9yIHJlbmRhLCBxdWUgcG9zc3VlbSBiYWl4YSBtYXJnZW0gZGUgc3Vic3RpdHVpw6fDo28gbmEgc3VhIGNlc3RhIGRlIGNvbnN1bW8uIENvbnR1ZG8sIHF1YW5kbyBvIGNlbsOhcmlvIG1hY3JvZWNvbsO0bWljbyB0cmFuc2l0YSBwYXJhIHVtIHBlcsOtb2RvIGRlIGFwcmVjaWHDp8OjbyBkYSBtb2VkYSBuYWNpb25hbCBlIGFycmVmZWNpbWVudG8gZGFzIGNvbW1vZGl0aWVzIGFncsOtY29sYXMgbm8gbWVyY2FkbyBpbnRlcm5hY2lvbmFsLCBlc3NlIGNhbmFsIGRlIHRyYW5zbWlzc8OjbyB0ZW5kZSBhIHNlIGludmVydGVyLiBBIHJlZHXDp8OjbyBkb3MgY3VzdG9zIGRlIGJlbnMgY29tZXJjaWFsaXrDoXZlaXMgKHRyYWRhYmxlcykgYWxpdmlhIGEgYmFzZSBkYSBwaXLDom1pZGUsIGVucXVhbnRvIGEgaW5mbGHDp8OjbyBkbyB0b3BvIHBlcm1hbmVjZSBhdHJlbGFkYSDDoCBkaW7Dom1pY2EgZG8gbWVyY2FkbyBkZSB0cmFiYWxobyBlIGRvIHNldG9yIGRlIHNlcnZpw6dvcyAobm9uLXRyYWRhYmxlcykuDQoNCioqR3LDoWZpY28gMS40IOKAlCBJbmZsYcOnw6NvIGFjdW11bGFkYSBlbSAxMiBtZXNlcyBwb3IgZmFpeGEgZGUgcmVuZGEqKg0KDQpgYGB7ciBwMS1pbmZsYWNhby1yZW5kYX0NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIERBRE9TIOKAlCBJbmZsYcOnw6NvIGFjdW11bGFkYSBlbSAxMiBtZXNlcyBwb3IgZmFpeGEgZGUgcmVuZGENCiMgRm9udGU6IEdydXBvIGRlIENvbmp1bnR1cmEvRGltYWMvSXBlYQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCm1lc2VzIDwtIGMoImp1bi8yMDI0IiwianVsLzIwMjQiLCJhZ28vMjAyNCIsInNldC8yMDI0Iiwib3V0LzIwMjQiLCJub3YvMjAyNCIsImRlei8yMDI0IiwNCiAgICAgICAgICAgImphbi8yMDI1IiwiZmV2LzIwMjUiLCJtYXIvMjAyNSIsImFici8yMDI1IiwibWFpLzIwMjUiLCJqdW4vMjAyNSIsImp1bC8yMDI1IiwNCiAgICAgICAgICAgImFnby8yMDI1Iiwic2V0LzIwMjUiLCJvdXQvMjAyNSIsIm5vdi8yMDI1IiwiZGV6LzIwMjUiLCJqYW4vMjAyNiIsImZldi8yMDI2IiwNCiAgICAgICAgICAgIm1hci8yMDI2IiwiYWJyLzIwMjYiLCJtYWkvMjAyNiIpDQoNCmRhdGFzIDwtIHNlcShhcy5EYXRlKCIyMDI0LTA2LTAxIiksIGFzLkRhdGUoIjIwMjYtMDUtMDEiKSwgYnkgPSAibW9udGgiKQ0KDQppbmZsYWNhbyA8LSBsaXN0KA0KICBgUmVuZGEgbXVpdG8gYmFpeGFgICA9IGMoMy42NiwgNC4wNSwgMy43MiwgNC4zNCwgNC45OSwgNS4wNSwgNC45MSwgNC4wNCwgNC44OCwgNS4yNCwgNS40MywgNS4zNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjI0LCA1LjM0LCA1LjIzLCA1LjI0LCA0LjQzLCA0LjE2LCAzLjgxLCA0LjMxLCAzLjIwLCAzLjUwLCAzLjgzLCA0LjI5KSwNCiAgYFJlbmRhIGJhaXhhYCAgICAgICAgPSBjKDMuODUsIDQuMTgsIDMuODcsIDQuMzYsIDQuOTYsIDUuMDgsIDUuMDIsIDQuMzIsIDUuMDcsIDUuNDIsIDUuNjAsIDUuNDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4zOCwgNS40MywgNS4zMywgNS4zNywgNC42NSwgNC4zNywgNC4wNSwgNC40OSwgMy40NiwgMy44MywgNC4xNSwgNC41NCksDQogIGBSZW5kYSBtw6lkaWEtYmFpeGFgICA9IGMoNC4wMywgNC4zMSwgMy45OSwgNC4yOCwgNC43MiwgNC44OSwgNC44NiwgNC40MSwgNS4wMywgNS40NSwgNS41NCwgNS4zOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjM3LCA1LjMxLCA1LjE5LCA1LjI1LCA0LjY3LCA0LjQwLCA0LjEzLCA0LjQ1LCAzLjU5LCAzLjk1LCA0LjIyLCA0LjU3KSwNCiAgYFJlbmRhIG3DqWRpYWAgICAgICAgID0gYyg0LjMzLCA0LjU1LCA0LjI4LCA0LjM1LCA0LjY4LCA0Ljg0LCA0Ljg2LCA0LjcwLCA1LjE0LCA1LjU2LCA1LjU2LCA1LjM0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzgsIDUuMTksIDUuMDgsIDUuMTUsIDQuNzAsIDQuNDgsIDQuMjksIDQuNDUsIDMuODUsIDQuMjAsIDQuNDQsIDQuNzEpLA0KICBgUmVuZGEgbcOpZGlhLWFsdGFgICAgPSBjKDQuNTUsIDQuNjYsIDQuNDIsIDQuMzYsIDQuNjMsIDQuNzUsIDQuNzgsIDQuNzQsIDUuMDgsIDUuNTMsIDUuNTAsIDUuMjgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4zNywgNS4xNiwgNS4wNywgNS4xNSwgNC43OCwgNC42NSwgNC41MiwgNC41NywgNC4wOSwgNC4zNywgNC41NiwgNC43OSksDQogIGBSZW5kYSBhbHRhYCAgICAgICAgID0gYyg0Ljc5LCA1LjA5LCA0Ljk3LCA0LjcyLCA0LjQ0LCA0LjUwLCA0LjQzLCA0Ljk2LCA1LjAzLCA1LjYxLCA1LjU1LCA1LjE1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNDAsIDUuMDQsIDUuMDAsIDUuMDIsIDQuOTYsIDQuNzYsIDQuNzIsIDQuMzQsIDQuNjAsIDQuODUsIDQuOTUsIDUuMjYpDQopDQoNCmNvcmVzIDwtIGMoDQogICIjRkVCNzEyIiwgICMgYW1hcmVsbyBJQk1hY3JvDQogICIjMDIwMjNDIiwgICMgYXp1bCBlc2N1cm8NCiAgIiMzNjNFNkIiLCAgIyBhenVsIG3DqWRpbw0KICAiI0ZGRDU3QSIsICAjIGFtYXJlbG8gY2xhcm8NCiAgIiM0NkIxRTEiLCAgIyBhenVsIGNsYXJvDQogICIjQTZBNkE2IiAgICMgY2luemENCikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgR1LDgUZJQ08NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpncmFmX2luZmxhY2FvIDwtIGhpZ2hjaGFydCgpIHw+DQogIGhjX2NoYXJ0KA0KICAgIHR5cGUgPSAic3BsaW5lIiwNCiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAid2hpdGUiLA0KICAgIHN0eWxlID0gbGlzdChmb250RmFtaWx5ID0gInNhbnMtc2VyaWYiKQ0KICApIHw+DQogIGhjX3hBeGlzKA0KICAgIGNhdGVnb3JpZXMgPSBtZXNlcywNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9IE5VTEwpLA0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICBzdHlsZSA9IGxpc3QoY29sb3IgPSAiIzNhM2EzYSIsIGZvbnRTaXplID0gIjEwcHgiKSwNCiAgICAgIHN0ZXAgPSAyDQogICAgKQ0KICApIHw+DQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiSW5mbGHDp8OjbyBhY3VtdWxhZGEgZW0gMTIgbWVzZXMgKCUpIiwNCiAgICAgIHN0eWxlID0gbGlzdChjb2xvciA9ICIjM2EzYTNhIikNCiAgICApLA0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICBmb3JtYXQgPSAie3ZhbHVlfSUiLA0KICAgICAgc3R5bGUgPSBsaXN0KGNvbG9yID0gIiMzYTNhM2EiKQ0KICAgICkNCiAgKSB8Pg0KICBoY190b29sdGlwKA0KICAgIHNoYXJlZCA9IFRSVUUsDQogICAgdmFsdWVTdWZmaXggPSAiJSIsDQogICAgdmFsdWVEZWNpbWFscyA9IDINCiAgKSB8Pg0KICBoY190aXRsZSgNCiAgICB0ZXh0ID0gIkNvbW8gYSBpbmZsYcOnw6NvIG11ZGEgY29uZm9ybWUgYSByZW5kYSIsDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzAyMDIzYyIsDQogICAgICBmb250V2VpZ2h0ID0gImJvbGQiLA0KICAgICAgZm9udFNpemUgPSAiMTZweCINCiAgICApDQogICkgfD4NCiAgaGNfc3VidGl0bGUoDQogICAgdGV4dCA9ICLihpIgSXBlYSwgMjAyNeKAkzIwMjYsIGRhZG8gYXR1YWwuIiwNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjb2xvciA9ICIjM2EzYTNhIiwNCiAgICAgIGZvbnRTaXplID0gIjEycHgiDQogICAgKQ0KICApIHw+DQogIGhjX2NhcHRpb24oDQogICAgdGV4dCA9ICJGb250ZTogR3J1cG8gZGUgQ29uanVudHVyYS9EaW1hYy9JcGVhLiBFbGFib3Jhw6fDo28gcHLDs3ByaWEuIiwNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjb2xvciA9ICIjYTZhNmE2IiwNCiAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgKQ0KICApIHw+DQogIGhjX2xlZ2VuZCgNCiAgICBhbGlnbiA9ICJjZW50ZXIiLA0KICAgIHZlcnRpY2FsQWxpZ24gPSAiYm90dG9tIiwNCiAgICBsYXlvdXQgPSAiaG9yaXpvbnRhbCINCiAgKSB8Pg0KICBoY19wbG90T3B0aW9ucygNCiAgICBzcGxpbmUgPSBsaXN0KA0KICAgICAgbWFya2VyID0gbGlzdChlbmFibGVkID0gRkFMU0UpLA0KICAgICAgbGluZVdpZHRoID0gMi41DQogICAgKQ0KICApIHw+DQogIGhjX2NyZWRpdHMoZW5hYmxlZCA9IEZBTFNFKSB8Pg0KICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpDQoNCmZvciAoaSBpbiBzZXFfYWxvbmcoaW5mbGFjYW8pKSB7DQogIGdyYWZfaW5mbGFjYW8gPC0gZ3JhZl9pbmZsYWNhbyB8Pg0KICAgIGhjX2FkZF9zZXJpZXMoDQogICAgICBuYW1lID0gbmFtZXMoaW5mbGFjYW8pW2ldLA0KICAgICAgZGF0YSA9IGluZmxhY2FvW1tpXV0sDQogICAgICBjb2xvciA9IGNvcmVzW2ldDQogICAgKQ0KfQ0KDQpncmFmX2luZmxhY2FvDQpgYGANCg0KQXTDqSBtZWFkb3MgZGUgMjAyNSwgbyBjb21wb3J0YW1lbnRvIGRhcyBjdXJ2YXMgcmVmbGV0aWEgYSB2dWxuZXJhYmlsaWRhZGUgaGlzdMOzcmljYSBkYSBiYWl4YSByZW5kYS4gQXMgZmFpeGFzIGRlIFJlbmRhIG11aXRvIGJhaXhhIGUgUmVuZGEgYmFpeGEgcmVnaXN0cmF2YW0gcGljb3MgaW5mbGFjaW9uw6FyaW9zIG1haXMgYWNlbnR1YWRvcyDigJQgc3VwZXJhbmRvIDUsNDAlIGVtIG1lYWRvcyBkZSAyMDI1IOKAlCwgaW1wdWxzaW9uYWRhcyBwZWxhIHZvbGF0aWxpZGFkZSBkb3MgYWxpbWVudG9zLg0KDQpFbSBmZXZlcmVpcm8gZGUgMjAyNiwgY29uc29saWRhLXNlIHVtYSBpbnZlcnPDo28gZXN0cnV0dXJhbCBkbyBwYWRyw6NvIGhpc3TDs3JpY28uIEEgaW5mbGHDp8OjbyBhY3VtdWxhZGEgcGFyYSBhIGNsYXNzZSBkZSBSZW5kYSBtdWl0byBiYWl4YSBzb2ZyZSB1bWEgcXVlZGEgZXhwcmVzc2l2YSBwYXJhIDMsMjAlICh2aW5kYSBkZSA0LDMxJSBlbSBqYW5laXJvLzIwMjYpLiBFbSBjb250cmFwYXJ0aWRhLCBhIGluZmxhw6fDo28gZGEgUmVuZGEgYWx0YSBzb2JlIHBhcmEgNCw2MCUgbm8gbWVzbW8gbcOqcywgbWFudGVuZG8gdHJhamV0w7NyaWEgYXNjZW5kZW50ZSBhdMOpIGF0aW5naXIgNSwyNiUgZW0gbWFpbyBkZSAyMDI2Lg0KDQpFc3NhIGRpdmVyZ8OqbmNpYSBvY29ycmUgcG9ycXVlIGEgYXByZWNpYcOnw6NvIGRvIFJlYWwgKHF1ZWRhIGRvIGTDs2xhcikgb2JzZXJ2YWRhIG5vIHBlcsOtb2RvIGF0dW91IGNvbW8gdW1hIMOibmNvcmEgZGUgcHJlw6dvcyBwYXJhIGJlbnMgY29tZXJjaWFsaXrDoXZlaXMgKHRyYWRhYmxlcykuIEFsaW1lbnRvcyBlIGluc3Vtb3MgaW1wb3J0YWRvcywgcXVlIHBvc3N1ZW0gcGVzbyBkZXNwcm9wb3JjaW9uYWwgbmEgY2VzdGEgZG9zIG1haXMgcG9icmVzLCBkZXNhY2VsZXJhcmFtIHJhcGlkYW1lbnRlLiBFbnF1YW50byBpc3NvLCBhIGZhaXhhIGRlIGFsdGEgcmVuZGEgcGVybWFuZWNldSBwcmVzc2lvbmFkYSBwZWxhIHJpZ2lkZXogZG8gc2V0b3IgZGUgc2VydmnDp29zIGUgZ2FzdG9zIGRpc2NyaWNpb27DoXJpb3MuDQoNClBhcmEgYXZhbGlhciBzZSB1bWEgbXVkYW7Dp2EgbmEgZGluw6JtaWNhIGNhbWJpYWwgYWx0ZXJhIG8gcGF0YW1hciBkZSBiZW0tZXN0YXIgZGFzIGZhbcOtbGlhcyBkZSBmb3JtYSBkdXJhZG91cmEsIGEgYW7DoWxpc2UgZGUgY3VydMOtc3NpbW8gcHJhem8gKG3DqnMgYSBtw6pzKSBwb2RlIHNlciBpbnN1ZmljaWVudGUgZGV2aWRvIGEgcnXDrWRvcyBzYXpvbmFpcy4gQSBjb21wYXJhw6fDo28gZGFzIG3DqWRpYXMgYWN1bXVsYWRhcyBlbSBqYW5lbGFzIGFudWFpcyBob23Ds2xvZ2FzIChjb21vIG8gcHJpbWVpcm8gcXVhZHJpbWVzdHJlL3F1aW5xdcOqbmlvIGRlIGFub3MgY29uc2VjdXRpdm9zKSBwZXJtaXRlIGV4cHVyZ2FyIHNhem9uYWxpZGFkZXMgZSBpc29sYXIgbyBlZmVpdG8gY3VtdWxhdGl2byBkZSB1bSBjaWNsbyBkZSB2YWxvcml6YcOnw6NvIGRvIGPDom1iaW8gc29icmUgYSBpbmZsYcOnw6NvIG3DqWRpYSBwZXJjZWJpZGEgcG9yIGNhZGEgY2xhc3NlIHNvY2lhbC4NCg0KKipHcsOhZmljbyAxLjUg4oCUIEluZmxhw6fDo28gbcOpZGlhIHBvciBmYWl4YSBkZSByZW5kYTogamFu4oCTbWFpIDIwMjUgdnMuIGphbuKAk21haSAyMDI2KioNCg0KYGBge3IgcDEtY29tcGFyYXRpdm8tcmVuZGF9DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBEQURPUyDigJQgbcOpZGlhIEphbi1NYWkgcG9yIGZhaXhhIGRlIHJlbmRhDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KY2F0ZWdvcmlhc19yZW5kYSA8LSBjKCJNdWl0byBiYWl4YSIsICJCYWl4YSIsICJNw6lkaWEtYmFpeGEiLCAiTcOpZGlhIiwgIk3DqWRpYS1hbHRhIiwgIkFsdGEiKQ0KbWVkaWFfMjAyNSA8LSBjKDQuOTksIDUuMTgsIDUuMTYsIDUuMjYsIDUuMjMsIDUuMjYpDQptZWRpYV8yMDI2IDwtIGMoMy44MywgNC4wOSwgNC4xNiwgNC4zMywgNC40OCwgNC44MCkNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgR1LDgUZJQ08NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpncmFmX2NvbXBhcmF0aXZvIDwtIGhpZ2hjaGFydCgpIHw+DQogIGhjX2NoYXJ0KHR5cGUgPSAiY29sdW1uIiwgYmFja2dyb3VuZENvbG9yID0gIndoaXRlIiwgc3R5bGUgPSBsaXN0KGZvbnRGYW1pbHkgPSAic2Fucy1zZXJpZiIpKSB8Pg0KICBoY194QXhpcyhjYXRlZ29yaWVzID0gY2F0ZWdvcmlhc19yZW5kYSwgdGl0bGUgPSBsaXN0KHRleHQgPSAiRmFpeGEgZGUgcmVuZGEiKSkgfD4NCiAgaGNfeUF4aXMoDQogICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiSW5mbGHDp8OjbyBhY3VtdWxhZGEgZW0gMTIgbWVzZXMgKCUpIiwgc3R5bGUgPSBsaXN0KGNvbG9yID0gIiMzYTNhM2EiKSksDQogICAgbGFiZWxzID0gbGlzdChmb3JtYXQgPSAie3ZhbHVlfSUiLCBzdHlsZSA9IGxpc3QoY29sb3IgPSAiIzM2M0U2QiIpKQ0KICApIHw+DQogIGhjX3Rvb2x0aXAoc2hhcmVkID0gVFJVRSwgdmFsdWVTdWZmaXggPSAiJSIsIHZhbHVlRGVjaW1hbHMgPSAyKSB8Pg0KICBoY190aXRsZSgNCiAgICB0ZXh0ID0gIkNvbXBhcmF0aXZvIG11ZGFuw6dhIGRhIGluZmxhw6fDo28gY29uZm9ybWUgcmVuZGEgLSBKYW5laXJvIGEgTWFpbyBkZSAyMDI1IHZzIDIwMjYiLA0KICAgIHN0eWxlID0gbGlzdChjb2xvciA9ICIjMzYzRTZCIiwgZm9udFdlaWdodCA9ICJib2xkIiwgZm9udFNpemUgPSAiMTZweCIpDQogICkgfD4NCiAgaGNfc3VidGl0bGUoDQogICAgdGV4dCA9ICLihpIgSXBlYSIsDQogICAgc3R5bGUgPSBsaXN0KGNvbG9yID0gIiMzNjNFNkIiLCBmb250U2l6ZSA9ICIxMnB4IikNCiAgKSB8Pg0KICBoY19jYXB0aW9uKA0KICAgIHRleHQgPSAiRm9udGU6IEdydXBvIGRlIENvbmp1bnR1cmEvRGltYWMvSXBlYS4gRWxhYm9yYcOnw6NvIHByw7NwcmlhLiBNw6lkaWFzIGRvIHBlcsOtb2RvIEphbi1NYWkgZGUgY2FkYSBhbm8uIiwNCiAgICBzdHlsZSA9IGxpc3QoY29sb3IgPSAiI2E2YTZhNiIsIGZvbnRTaXplID0gIjEwcHgiKQ0KICApIHw+DQogIGhjX2xlZ2VuZChhbGlnbiA9ICJjZW50ZXIiLCB2ZXJ0aWNhbEFsaWduID0gImJvdHRvbSIsIGxheW91dCA9ICJob3Jpem9udGFsIikgfD4NCiAgaGNfcGxvdE9wdGlvbnMoY29sdW1uID0gbGlzdChncm91cGluZyA9IFRSVUUsIGJvcmRlcldpZHRoID0gMCkpIHw+DQogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJKYW4tTWFpIDIwMjUiLCBkYXRhID0gbWVkaWFfMjAyNSwgY29sb3IgPSAiI0ZFQjcxMiIpIHw+DQogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJKYW4tTWFpIDIwMjYiLCBkYXRhID0gbWVkaWFfMjAyNiwgY29sb3IgPSAiIzAyMDIzYyIpIHw+DQogIGhjX2NyZWRpdHMoZW5hYmxlZCA9IEZBTFNFKSB8Pg0KICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUpDQoNCmdyYWZfY29tcGFyYXRpdm8NCmBgYA0KDQpOb3RhLXNlIHF1ZSBhIG3DqWRpYSBkYSBpbmZsYcOnw6NvIGFjdW11bGFkYSBlbSAxMiBtZXNlcyByZWN1b3UgZW0gdG9kYXMgYXMgZmFpeGFzIHNvY2lvZWNvbsO0bWljYXMgZW50cmUgb3MgZG9pcyBwZXLDrW9kb3MuIENvbnR1ZG8sIGEgbWFnbml0dWRlIGRhIHF1ZWRhIGZvaSBkZWNyZXNjZW50ZSDDoCBtZWRpZGEgcXVlIHNlIGF2YW7Dp2EgbmEgcGlyw6JtaWRlIGRlIHJlbmRhLiAgDQoNCk5hIGZhaXhhIGRlIFJlbmRhIG11aXRvIGJhaXhhLCBhIGluZmxhw6fDo28gbcOpZGlhIGRlc2NldSBkZSA0LDk5JSBlbSAyMDI1IHBhcmEgMyw4MyUgZW0gMjAyNiDigJQgdW1hIGV4cHJlc3NpdmEgcmVkdcOnw6NvIGRlIDEsMTZwLnAuLiBKw6EgcGFyYSBhIFJlbmRhIGFsdGEsIGEgZGVzYWNlbGVyYcOnw6NvIGZvaSBtYXJnaW5hbCwgcGFzc2FuZG8gZGUgNSwyNiUgcGFyYSA0LDgwJSAocXVlZGEgZGUgYXBlbmFzIDAsNDZwLnAuKS4gIA0KDQpPIHJlY3VvIGRvIGTDs2xhciBhbyBsb25nbyBkZSAxMiBtZXNlcyBhbGl2aW91IGEgZXN0cnV0dXJhIGRlIGN1c3RvcyBkZSBiZW5zIGbDrXNpY29zIGUgaW5zdW1vcy4gQ29tbyBhIHByb3BlbnPDo28gbWFyZ2luYWwgYSBjb25zdW1pciBiZW5zIGRlIHN1YnNpc3TDqm5jaWEgw6kgbWFpb3IgbmFzIGZhaXhhcyBkZSBtZW5vciByZW5kYSwgYSBxdWVkYSBub3MgcHJlw6dvcyBkb3MgY29tZXJjaWFsaXrDoXZlaXMgcmVwYXNzb3UgdW0gZ2FuaG8gcmVsYXRpdm8gZGUgcG9kZXIgZGUgY29tcHJhIG11aXRvIHN1cGVyaW9yIHBhcmEgYSBiYXNlIGRhIHBpcsOibWlkZS4NCg0KIyMgMS43IEFuYXRvbWlhIGRhIGNlc3RhIGRlIGNvbnN1bW8NCg0KQSBoZXRlcm9nZW5laWRhZGUgZGEgdGF4YSBkZSBpbmZsYcOnw6NvIHBlcmNlYmlkYSBuw6NvIMOpIHVtIGZlbsO0bWVubyBjYXN1YWwsIG1hcyBvIHJlc3VsdGFkbyBkaXJldG8gZGFzIHJlc3RyacOnw7VlcyBvcsOnYW1lbnTDoXJpYXMgZGFzIGZhbcOtbGlhcy4gQ29uZm9ybWUgYSByZW5kYSBmYW1pbGlhciBhdW1lbnRhLCBhIHByb3BvcsOnw6NvIGRvIG9yw6dhbWVudG8gZGVzdGluYWRhIGEgYmVucyBkZSBwcmltZWlyYSBuZWNlc3NpZGFkZSAoY29tbyBhbGltZW50YcOnw6NvIGUgbW9yYWRpYSkgZGltaW51aSwgY2VkZW5kbyBlc3Bhw6dvIHBhcmEgc2VydmnDp29zLCBlZHVjYcOnw6NvLCBzYcO6ZGUgZSBsYXplci4gDQoNCioqR3LDoWZpY28gMS42IOKAlCBDb21wb3Npw6fDo28gZG9zIGdhc3RvcyBkYXMgZmFtw61saWFzIHBvciBmYWl4YSBkZSByZW5kYSoqDQoNCmBgYHtyIHAxLXBvZn0NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIERBRE9TIOKAlCBjb21wb3Npw6fDo28gZG8gb3LDp2FtZW50byBwb3IgZmFpeGEgZGUgcmVuZGENCiMgRm9udGU6IFBPRiAyMDE34oCTMjAxOA0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KY2F0ZWdvcmlhcyA8LSBjKA0KICAiQXTDqSBSJCAxLjkwOCIsDQogICJSJCAxLjkwOOKAkzIuODYyIiwNCiAgIlIkIDIuODYy4oCTNS43MjQiLA0KICAiUiQgNS43MjTigJM5LjU0MCIsDQogICJSJCA5LjU0MOKAkzE0LjMxMCIsDQogICJSJCAxNC4zMTDigJMyMy44NTAiLA0KICAiPiBSJCAyMy44NTAiDQopDQoNCmRlc3Blc2FzIDwtIGxpc3QoDQogICJBbGltZW50YcOnw6NvIiA9IGMoMjMuOCwgMjEuMywgMTkuNywgMTYuNiwgMTUuNiwgMTMuNywgMTEuNSksDQogICJIYWJpdGHDp8OjbyIgICA9IGMoMzguNSwgMzYuNiwgMzIuOCwgMjkuNCwgMzAuMywgMzAuNiwgMzAuOCksDQogICJUcmFuc3BvcnRlIiAgPSBjKDEwLjIsIDEyLjYsIDE2LjMsIDIwLjUsIDIwLjMsIDIyLjEsIDIyLjUpLA0KICAiU2HDumRlIiAgICAgICA9IGMoNi40LCA3LjgsIDcuNSwgOC4xLCA5LjEsIDguOSwgOC41KSwNCiAgIkVkdWNhw6fDo28iICAgID0gYygyLjAsIDIuNiwgMy40LCA0LjcsIDUuMywgNS44LCA3LjMpDQopDQoNCmNvcmVzIDwtIGMoDQogICIjRkVCNzEyIiwNCiAgIiMwMjAyM0MiLA0KICAiIzM2M0U2QiIsDQogICIjRkZENTdBIiwNCiAgIiM0NkIxRTEiDQopDQoNCmdyYWZfcG9mIDwtIGhpZ2hjaGFydCgpIHw+DQogIGhjX2NoYXJ0KA0KICAgIHR5cGUgPSAiY29sdW1uIiwNCiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAid2hpdGUiLA0KICAgIHN0eWxlID0gbGlzdChmb250RmFtaWx5ID0gInNhbnMtc2VyaWYiKQ0KICApIHw+DQogIGhjX3Bsb3RPcHRpb25zKA0KICAgIGNvbHVtbiA9IGxpc3QoDQogICAgICBzdGFja2luZyA9ICJub3JtYWwiLA0KICAgICAgYm9yZGVyV2lkdGggPSAwDQogICAgKQ0KICApIHw+DQogIGhjX3hBeGlzKA0KICAgIGNhdGVnb3JpZXMgPSBjYXRlZ29yaWFzLA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIkNsYXNzZXMgZGUgcmVuZGltZW50byBtZW5zYWwgZmFtaWxpYXIiKQ0KICApIHw+DQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiJSBkYSBkZXNwZXNhIGRlIGNvbnN1bW8iLA0KICAgICAgc3R5bGUgPSBsaXN0KGNvbG9yID0gIiMzYTNhM2EiKQ0KICAgICksDQogICAgbGFiZWxzID0gbGlzdCgNCiAgICAgIGZvcm1hdCA9ICJ7dmFsdWV9JSIsDQogICAgICBzdHlsZSA9IGxpc3QoY29sb3IgPSAiIzNhM2EzYSIpDQogICAgKSwNCiAgICBtYXggPSAxMDANCiAgKSB8Pg0KICBoY190b29sdGlwKA0KICAgIHNoYXJlZCA9IFRSVUUsDQogICAgdmFsdWVTdWZmaXggPSAiJSIsDQogICAgdmFsdWVEZWNpbWFscyA9IDENCiAgKSB8Pg0KICBoY190aXRsZSgNCiAgICB0ZXh0ID0gIk11ZGFuw6dhIG5hIGNvbXBvc2nDp8OjbyBkbyBvcsOnYW1lbnRvIGRhcyBmYW3DrWxpYXMgY29uZm9ybWUgYSByZW5kYSIsDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzAyMDIzYyIsDQogICAgICBmb250V2VpZ2h0ID0gImJvbGQiLA0KICAgICAgZm9udFNpemUgPSAiMTZweCINCiAgICApDQogICkgfD4NCiAgaGNfc3VidGl0bGUoDQogICAgdGV4dCA9ICLihpIgUE9GIDIwMTfigJMyMDE4LCBkYWRvIGVzdHJ1dHVyYWwuIiwNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjb2xvciA9ICIjM2EzYTNhIiwNCiAgICAgIGZvbnRTaXplID0gIjEycHgiDQogICAgKQ0KICApIHw+DQogIGhjX2NhcHRpb24oDQogICAgdGV4dCA9ICJGb250ZTogSUJHRSwgUGVzcXVpc2EgZGUgT3LDp2FtZW50b3MgRmFtaWxpYXJlcyAyMDE3LTIwMTguIEVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYm1hY3JvIEJoLiIsDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiI2E2YTZhNiIsDQogICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICkNCiAgKSB8Pg0KICBoY19sZWdlbmQoDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICB2ZXJ0aWNhbEFsaWduID0gImJvdHRvbSIsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiDQogICkgfD4NCiAgaGNfY3JlZGl0cyhlbmFibGVkID0gRkFMU0UpIHw+DQogIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSkNCg0KIyBhZGljaW9uYSB1bWEgc8OpcmllIHBvciB0aXBvIGRlIGRlc3Blc2EsIGNhZGEgdW1hIGNvbSBzdWEgY29yDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGRlc3Blc2FzKSkgew0KICBncmFmX3BvZiA8LSBncmFmX3BvZiB8Pg0KICAgIGhjX2FkZF9zZXJpZXMoDQogICAgICBuYW1lID0gbmFtZXMoZGVzcGVzYXMpW2ldLA0KICAgICAgZGF0YSA9IGRlc3Blc2FzW1tpXV0sDQogICAgICBjb2xvciA9IGNvcmVzW2ldDQogICAgKQ0KfQ0KDQpncmFmX3BvZg0KYGBgDQoNCkNvbW8gYSB0YXhhIGRlIGPDom1iaW8gYWZldGEgcHJpbWFyaWFtZW50ZSBiZW5zIGNvbWVyY2lhbGl6w6F2ZWlzLCBhcyBkaWZlcmVuw6dhcyBuYXMgZXN0cnV0dXJhcyBkZSBwb25kZXJhw6fDo28gZGEgUGVzcXVpc2EgZGUgT3LDp2FtZW50b3MgRmFtaWxpYXJlcyAoUE9GL0lCR0UpIGZ1bmNpb25hbSBjb21vIG8gbWVjYW5pc21vIGRlIHRyYW5zbWlzc8OjbyBxdWUgZGlzdHJpYnVpIG9zIGNob3F1ZXMgZGUgcHJlw6dvcyBkZSBmb3JtYSBkZXNpZ3VhbC4NCg0KRmFtw61saWFzIGRlIG1lbm9yIHJlbmRpbWVudG8gY29tcHJvbWV0ZW0gYSBtYWlvciBmYXRpYSBkbyBzZXUgb3LDp2FtZW50byBjb20gb3MgZ3J1cG9zIEFsaW1lbnRhw6fDo28gbm8gRG9taWPDrWxpbyBlIEhhYml0YcOnw6NvL0VuZXJnaWEuIENvbW8gb3MgYWxpbWVudG9zIHPDo28gYmVucyBjb21lcmNpYWxpesOhdmVpcyBpbnRlcm5hY2lvbmFsbWVudGUsIHNldXMgcHJlw6dvcyBkb23DqXN0aWNvcyBzw6NvIGRpcmV0YW1lbnRlIGFyYml0cmFkb3MgcGVsYSB0YXhhIGRlIGPDom1iaW8gZSBwZWxhcyBjb3Rhw6fDtWVzIGRhcyBjb21tb2RpdGllcyBnbG9iYWlzIGVtIGTDs2xhci4gQ29udHVkbywgYXMgZmFtw61saWFzIGRlIG1haW9yIHJlbmRhIGRpcmVjaW9uYW0gcGFyY2VsYSBleHByZXNzaXZhIGRvIGNvbnN1bW8gYW8gc2V0b3IgZGUgU2VydmnDp29zIChlZHVjYcOnw6NvIHByaXZhZGEsIHNhw7pkZSwgc2VydmnDp29zIHBlc3NvYWlzIGUgcmVjcmVhw6fDo28pIGUgVHJhbnNwb3J0ZXMuIEVzc2VzIHNlcnZpw6dvcyBzw6NvIG7Do28gY29tZXJjaWFsaXrDoXZlaXMgaW50ZXJuYWNpb25hbG1lbnRlIChub24tdHJhZGFibGVzKSwgZSBzZXVzIHByZcOnb3MgZGVwZW5kZW0gZGEgbWFzc2Egc2FsYXJpYWwgZG9tw6lzdGljYSwgZG8gbsOtdmVsIGRlIGVtcHJlZ28gZSBkYSBpbmRleGHDp8OjbyBjb250cmF0dWFsLCBleGliaW5kbyBlbGV2YWRhIGluw6lyY2lhIG5vbWluYWwuDQoNCiMjIDEuOCBSZXBhc3NlIGNhbWJpYWwgZW0gYWxpbWVudGHDp8OjbyBubyBkb21pY8OtbGlvDQoNCkEgdHJhbnNtaXNzw6NvIGRhIHRheGEgZGUgY8OibWJpbyBwYXJhIG9zIHByZcOnb3MgZG9zIGFsaW1lbnRvcyBubyB2YXJlam8gZW52b2x2ZSBjYWRlaWFzIGdsb2JhaXMgZGUgc3VwcmltZW50b3MgZSBjdXN0b3MgZGUgcHJvZHXDp8OjbyBkbyBhZ3JvbmVnw7NjaW8uDQoNCkVtYm9yYSBvIEJyYXNpbCBzZWphIHVtIGRvcyBtYWlvcmVzIHByb2R1dG9yZXMgYWdyw61jb2xhcyBkbyBtdW5kbywgYSBlc3RydXR1cmEgcHJvZHV0aXZhIGRvIGNhbXBvIGV4aWdlIGluc3Vtb3MgY290YWRvcyBlbSBtb2VkYSBlc3RyYW5nZWlyYSwgdGFpcyBjb21vIGZlcnRpbGl6YW50ZXMgTlBLLCBkZWZlbnNpdm9zIGUgY29tYnVzdMOtdmVsIHBhcmEgbWFxdWluw6FyaW8uIEF2YWxpYXIgbyBjb2VmaWNpZW50ZSBkZSByZXBhc3NlIGNhbWJpYWwgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gZ3J1cG8gZGUgYWxpbWVudGHDp8OjbyBubyBkb21pY8OtbGlvIMOpIGZ1bmRhbWVudGFsIHBhcmEgbWVuc3VyYXIgYSBpbnRlbnNpZGFkZSBlIG8gdGVtcG8gY29tIHF1ZSB1bWEgZGVzdmFsb3JpemHDp8OjbyBkYSBtb2VkYSBzZSB0cmFuc2Zvcm1hIGVtIHBlcmRhIGRlIHBvZGVyIGRlIGNvbXByYSBuYSBtZXNhIGRhIHBvcHVsYcOnw6NvLg0KDQpgYGB7ciBwMS1wcm9qZWNhby1sb2NhbCwgZXZhbD1GQUxTRX0NCiMgREVTQVRJVkFETyAoZXZhbCA9IEZBTFNFKSwgY29tbyBubyBvcmlnaW5hbCBjb20gaWYoRkFMU0UpLg0KIyBQYXJhIGV4aWJpciBvIGdyw6FmaWNvLCB0cm9xdWUgcGFyYSBldmFsID0gVFJVRSBlIGNvbG9xdWUgYWNpbWEgZG8gY2h1bms6DQojICoqR3LDoWZpY28gMS43IOKAlCBQcm9qZcOnw6NvIGxvY2FsOiByZXBhc3NlIGNhbWJpYWwgw6AgYWxpbWVudGHDp8OjbyBubyBkb21pY8OtbGlvKioNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgUkVQQVNTRSBDQU1CSUFMIFBBUkEgQSBJTkZMQcOHw4NPIERFIEFMSU1FTlRBw4fDg08gTk8gRE9NSUPDjUxJTw0KIyBMT0NBTCBQUk9KRUNUSU9OUyDigJQgMCBBIDI0IE1FU0VTDQojIFBBRFLDg08gSUJNQUNSTw0KIw0KIyBTw6lyaWVzIEJDQiAvIFNHUzoNCiMgMzY5OCAgPSBDw6JtYmlvDQojIDI3NTc0ID0gQ29tbW9kaXRpZXMNCiMgMjc4NjQgPSBJUENBIC0gQWxpbWVudGHDp8OjbyBubyBkb21pY8OtbGlvDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDEuIFBBQ09URVMNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmxpYnJhcnkocmJjYikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkocGxvdGx5KQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDIuIENPUkVTIOKAlCBQQURSw4NPIElCTUFDUk8NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNvbG9ycyA8LSBjKA0KICAiI0ZFQjcxMiIsICAgIyAxIOKAlCBkb3VyYWRvDQogICIjMDIwMjNDIiwgICAjIDIg4oCUIGF6dWwgZXNjdXJvDQogICIjMzYzRTZCIiwgICAjIDMg4oCUIGF6dWwgbcOpZGlvDQogICIjRkZENTdBIiwgICAjIDQg4oCUIGRvdXJhZG8gY2xhcm8NCiAgIiM0NkIxRTEiLCAgICMgNSDigJQgYXp1bCBjbGFybw0KICAiI0E2QTZBNiIsICAgIyA2IOKAlCBjaW56YQ0KICAiIzExMTgyNyIgICAgIyA3IOKAlCBxdWFzZSBwcmV0bw0KKQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDMuIEJBSVhBUiBBUyBUUsOKUyBTw4lSSUVTIERPIEJDQg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2VyaWVzX2JjYiA8LSByYmNiOjpnZXRfc2VyaWVzKA0KICBjKA0KICAgIGNhbWJpbyA9IDM2OTgsDQogICAgY29tbW9kaXR5ID0gMjc1NzQsDQogICAgYWxpbWVudGFjYW8gPSAyNzg2NA0KICApLA0KICBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLA0KICBlbmRfZGF0ZSAgID0gZm9ybWF0KFN5cy5EYXRlKCksICIlWS0lbS0lZCIpDQopDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNC4gT1JHQU5JWkFSIEPDgk1CSU8NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNhbWJpbyA8LSBzZXJpZXNfYmNiJGNhbWJpbw0KDQpuYW1lcyhjYW1iaW8pIDwtIGMoDQogICJkYXRhIiwNCiAgImNhbWJpbyINCikNCg0KY2FtYmlvJGRhdGEgPC0gYXMuRGF0ZShjYW1iaW8kZGF0YSkNCg0KIyBDw6JtYmlvIGRpw6FyaW8g4oaSIG3DqWRpYSBtZW5zYWwNCg0KY2FtYmlvIDwtIGNhbWJpbyAlPiUNCiAgbXV0YXRlKA0KICAgIGRhdGEgPSBmbG9vcl9kYXRlKGRhdGEsICJtb250aCIpDQogICkgJT4lDQogIGdyb3VwX2J5KGRhdGEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgY2FtYmlvID0gbWVhbihjYW1iaW8sIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNS4gT1JHQU5JWkFSIENPTU1PRElUSUVTDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjb21tb2RpdGllcyA8LSBzZXJpZXNfYmNiJGNvbW1vZGl0eQ0KDQpuYW1lcyhjb21tb2RpdGllcykgPC0gYygNCiAgImRhdGEiLA0KICAiY29tbW9kaXR5Ig0KKQ0KDQpjb21tb2RpdGllcyRkYXRhIDwtIGFzLkRhdGUoY29tbW9kaXRpZXMkZGF0YSkNCg0KIyBDb21tb2RpdGllcyDihpIgbcOpZGlhIG1lbnNhbA0KDQpjb21tb2RpdGllcyA8LSBjb21tb2RpdGllcyAlPiUNCiAgbXV0YXRlKA0KICAgIGRhdGEgPSBmbG9vcl9kYXRlKGRhdGEsICJtb250aCIpDQogICkgJT4lDQogIGdyb3VwX2J5KGRhdGEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgY29tbW9kaXR5ID0gbWVhbigNCiAgICAgIGNvbW1vZGl0eSwNCiAgICAgIG5hLnJtID0gVFJVRQ0KICAgICksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNi4gT1JHQU5JWkFSIElQQ0Eg4oCUIEFMSU1FTlRBw4fDg08gTk8gRE9NSUPDjUxJTw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KYWxpbWVudGFjYW8gPC0gc2VyaWVzX2JjYiRhbGltZW50YWNhbw0KDQpuYW1lcyhhbGltZW50YWNhbykgPC0gYygNCiAgImRhdGEiLA0KICAiaXRlbSINCikNCg0KYWxpbWVudGFjYW8kZGF0YSA8LSBhcy5EYXRlKA0KICBhbGltZW50YWNhbyRkYXRhDQopDQoNCmFsaW1lbnRhY2FvIDwtIGFsaW1lbnRhY2FvICU+JQ0KICBtdXRhdGUoDQogICAgZGF0YSA9IGZsb29yX2RhdGUoDQogICAgICBkYXRhLA0KICAgICAgIm1vbnRoIg0KICAgICksDQoNCiAgICBpdGVtID0gYXMubnVtZXJpYyhpdGVtKQ0KICApICU+JQ0KICBhcnJhbmdlKGRhdGEpDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgNy4gQ0hFQ0FHRU0gREFTIFPDiVJJRVMNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikNCmNhdCgiQ0hFQ0FHRU0gREFTIFPDiVJJRVMg4oCUIEJDQiAvIFNHU1xuIikNCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIikNCg0KY2F0KA0KICAiQ8OibWJpbzpcbiIsDQogIGZvcm1hdChtaW4oY2FtYmlvJGRhdGEpLCAiJW0vJVkiKSwNCiAgImF0w6kiLA0KICBmb3JtYXQobWF4KGNhbWJpbyRkYXRhKSwgIiVtLyVZIiksDQogICJcblxuIg0KKQ0KDQpjYXQoDQogICJDb21tb2RpdGllczpcbiIsDQogIGZvcm1hdChtaW4oY29tbW9kaXRpZXMkZGF0YSksICIlbS8lWSIpLA0KICAiYXTDqSIsDQogIGZvcm1hdChtYXgoY29tbW9kaXRpZXMkZGF0YSksICIlbS8lWSIpLA0KICAiXG5cbiINCikNCg0KY2F0KA0KICAiQWxpbWVudGHDp8OjbyBubyBkb21pY8OtbGlvOlxuIiwNCiAgZm9ybWF0KG1pbihhbGltZW50YWNhbyRkYXRhKSwgIiVtLyVZIiksDQogICJhdMOpIiwNCiAgZm9ybWF0KG1heChhbGltZW50YWNhbyRkYXRhKSwgIiVtLyVZIiksDQogICJcblxuIg0KKQ0KDQpjYXQoDQogICJOQSBhbGltZW50YcOnw6NvOiIsDQogIHN1bShpcy5uYShhbGltZW50YWNhbyRpdGVtKSksDQogICJcbiINCikNCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyA4LiBCQVNFIEZJTkFMDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpiYXNlIDwtIGFsaW1lbnRhY2FvICU+JQ0KDQogIGlubmVyX2pvaW4oDQogICAgY2FtYmlvLA0KICAgIGJ5ID0gImRhdGEiDQogICkgJT4lDQoNCiAgaW5uZXJfam9pbigNCiAgICBjb21tb2RpdGllcywNCiAgICBieSA9ICJkYXRhIg0KICApICU+JQ0KDQogIGFycmFuZ2UoZGF0YSkNCg0KDQpjYXQoDQogICJcbk9ic2VydmHDp8O1ZXMgYXDDs3Mgb3Mgam9pbnM6IiwNCiAgbnJvdyhiYXNlKSwNCiAgIlxuIg0KKQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDkuIFZBUklBw4fDlUVTIE1FTlNBSVMNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmJhc2UgPC0gYmFzZSAlPiUNCg0KICBtdXRhdGUoDQoNCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgIyBWYXJpYcOnw6NvIG1lbnNhbCBkbyBjw6JtYmlvDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIGNhbWJpb192YXIgPQ0KICAgICAgMTAwICoNCiAgICAgICgNCiAgICAgICAgbG9nKGNhbWJpbykgLQ0KICAgICAgICBsb2cobGFnKGNhbWJpbykpDQogICAgICApLA0KDQoNCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgIyBWYXJpYcOnw6NvIG1lbnNhbCBkYXMgY29tbW9kaXRpZXMNCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgY29tbW9kaXR5X3ZhciA9DQogICAgICAxMDAgKg0KICAgICAgKA0KICAgICAgICBsb2coY29tbW9kaXR5KSAtDQogICAgICAgIGxvZyhsYWcoY29tbW9kaXR5KSkNCiAgICAgICkNCiAgKQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDEwLiBGVU7Dh8ODTyBERSBMT0NBTCBQUk9KRUNUSU9ODQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjYWxjdWxhcl9yZXBhc3NlIDwtIGZ1bmN0aW9uKGgpIHsNCg0KICBkYWRvcyA8LSBiYXNlDQoNCg0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgIyBJbmZsYcOnw6NvIGFjdW11bGFkYSBlbnRyZSB0IGUgdCtoDQogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIGRhZG9zJGluZmxhY2FvX2FjdW0gPC0gTkFfcmVhbF8NCg0KDQogIGZvciAoaSBpbiAxOm5yb3coZGFkb3MpKSB7DQoNCiAgICBmaW0gPC0gaSArIGgNCg0KDQogICAgaWYgKGZpbSA8PSBucm93KGRhZG9zKSkgew0KDQogICAgICBqYW5lbGEgPC0gZGFkb3MkaXRlbVtpOmZpbV0NCg0KDQogICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgIyBWZXJpZmljYXIgc2UgZXhpc3RlbSBOQQ0KICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgaWYgKCFhbnkoaXMubmEoamFuZWxhKSkpIHsNCg0KICAgICAgICBkYWRvcyRpbmZsYWNhb19hY3VtW2ldIDwtDQogICAgICAgICAgMTAwICoNCiAgICAgICAgICAoDQogICAgICAgICAgICBwcm9kKA0KICAgICAgICAgICAgICAxICsgamFuZWxhIC8gMTAwDQogICAgICAgICAgICApIC0gMQ0KICAgICAgICAgICkNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KDQogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAjIFNlbGVjaW9uYXIgb2JzZXJ2YcOnw7VlcyB2w6FsaWRhcw0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBkYWRvc19tb2RlbG8gPC0gZGFkb3MgJT4lDQoNCiAgICBmaWx0ZXIoDQogICAgICAhaXMubmEoaW5mbGFjYW9fYWN1bSksDQogICAgICAhaXMubmEoY2FtYmlvX3ZhciksDQogICAgICAhaXMubmEoY29tbW9kaXR5X3ZhcikNCiAgICApDQoNCg0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgIyBNT0RFTE8gREUgUFJPSkXDh8ODTyBMT0NBTA0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBtb2RlbG8gPC0gbG0oDQoNCiAgICBpbmZsYWNhb19hY3VtIH4NCiAgICAgIGNhbWJpb192YXIgKw0KICAgICAgY29tbW9kaXR5X3ZhciwNCg0KICAgIGRhdGEgPSBkYWRvc19tb2RlbG8NCiAgKQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgRVJSTy1QQURSw4NPIFJPQlVTVE8gSEMxDQogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIHJvYnVzdG8gPC0gY29lZnRlc3QoDQoNCiAgICBtb2RlbG8sDQoNCiAgICB2Y292ID0NCiAgICAgIHZjb3ZIQygNCiAgICAgICAgbW9kZWxvLA0KICAgICAgICB0eXBlID0gIkhDMSINCiAgICAgICkNCiAgKQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgQ09FRklDSUVOVEUgRE8gQ8OCTUJJTw0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBiZXRhIDwtIHJvYnVzdG9bDQogICAgImNhbWJpb192YXIiLA0KICAgICJFc3RpbWF0ZSINCiAgXQ0KDQoNCiAgZXJybyA8LSByb2J1c3RvWw0KICAgICJjYW1iaW9fdmFyIiwNCiAgICAiU3RkLiBFcnJvciINCiAgXQ0KDQoNCiAgcHZhbG9yIDwtIHJvYnVzdG9bDQogICAgImNhbWJpb192YXIiLA0KICAgICJQcig+fHR8KSINCiAgXQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgSUMgREUgOTAlDQogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIGxpbWl0ZV9pbmZlcmlvciA8LQ0KICAgIGJldGEgLQ0KICAgIDEuNjQ1ICogZXJybw0KDQoNCiAgbGltaXRlX3N1cGVyaW9yIDwtDQogICAgYmV0YSArDQogICAgMS42NDUgKiBlcnJvDQoNCg0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgIyBSRVRPUk5BUiBSRVNVTFRBRE8NCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgZGF0YS5mcmFtZSgNCg0KICAgIGhvcml6b250ZSA9IGgsDQoNCiAgICBjb2VmaWNpZW50ZSA9IGJldGEsDQoNCiAgICBlcnJvX3BhZHJhbyA9IGVycm8sDQoNCiAgICBwX3ZhbG9yID0gcHZhbG9yLA0KDQogICAgbGltaXRlX2luZmVyaW9yID0NCiAgICAgIGxpbWl0ZV9pbmZlcmlvciwNCg0KICAgIGxpbWl0ZV9zdXBlcmlvciA9DQogICAgICBsaW1pdGVfc3VwZXJpb3IsDQoNCiAgICBvYnNlcnZhY29lcyA9DQogICAgICBucm93KGRhZG9zX21vZGVsbykNCiAgKQ0KfQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDExLiBFU1RJTUFSIDAgQSAyNCBNRVNFUw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KcmVzdWx0YWRvcyA8LSBiaW5kX3Jvd3MoDQoNCiAgbGFwcGx5KA0KICAgIDA6MjQsDQogICAgY2FsY3VsYXJfcmVwYXNzZQ0KICApDQopDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTIuIE1PU1RSQVIgVE9ET1MgT1MgUkVTVUxUQURPUw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KY2F0KCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQ0KY2F0KCJSRVBBU1NFIENBTUJJQUwg4oCUIEFMSU1FTlRBw4fDg08gTk8gRE9NSUPDjUxJT1xuIikNCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIikNCg0KcHJpbnQocmVzdWx0YWRvcykNCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAxMy4gSE9SSVpPTlRFUyBERSBJTlRFUkVTU0UNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikNCmNhdCgiSE9SSVpPTlRFUyBTRUxFQ0lPTkFET1NcbiIpDQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpDQoNCnByaW50KA0KDQogIHJlc3VsdGFkb3MgJT4lDQoNCiAgICBmaWx0ZXIoDQogICAgICBob3Jpem9udGUgJWluJQ0KICAgICAgICBjKA0KICAgICAgICAgIDAsDQogICAgICAgICAgMywNCiAgICAgICAgICA2LA0KICAgICAgICAgIDEyLA0KICAgICAgICAgIDE4LA0KICAgICAgICAgIDI0DQogICAgICAgICkNCiAgICApDQopDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTQuIENPRUZJQ0lFTlRFUyBERSAxMiBFIDI0IE1FU0VTDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpiZXRhXzEyIDwtIHJlc3VsdGFkb3MgJT4lDQoNCiAgZmlsdGVyKA0KICAgIGhvcml6b250ZSA9PSAxMg0KICApICU+JQ0KDQogIHB1bGwoDQogICAgY29lZmljaWVudGUNCiAgKQ0KDQoNCmJldGFfMjQgPC0gcmVzdWx0YWRvcyAlPiUNCg0KICBmaWx0ZXIoDQogICAgaG9yaXpvbnRlID09IDI0DQogICkgJT4lDQoNCiAgcHVsbCgNCiAgICBjb2VmaWNpZW50ZQ0KICApDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMTUuIElOVEVSUFJFVEHDh8ODTw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KY2F0KCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQ0KY2F0KCJJTlRFUlBSRVRBw4fDg09cbiIpDQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpDQoNCmNhdCgNCiAgIkNvZWZpY2llbnRlIGVtIDEyIG1lc2VzOiIsDQogIHJvdW5kKGJldGFfMTIsIDMpLA0KICAiXG4iDQopDQoNCmNhdCgNCiAgIkNvZWZpY2llbnRlIGVtIDI0IG1lc2VzOiIsDQogIHJvdW5kKGJldGFfMjQsIDMpLA0KICAiXG5cbiINCikNCg0KY2F0KA0KICAiVW1hIGRlcHJlY2lhw6fDo28gY2FtYmlhbCBkZSAxMCUgZXN0w6EgYXNzb2NpYWRhIGEgYXByb3hpbWFkYW1lbnRlICIsDQogIHJvdW5kKGJldGFfMTIgKiAxMCwgMiksDQogICIgcC5wLiBkZSBpbmZsYcOnw6NvIGFjdW11bGFkYSBkZSBhbGltZW50YcOnw6NvIG5vIGRvbWljw61saW8gZW0gMTIgbWVzZXMuXG4iLA0KICBzZXAgPSAiIg0KKQ0KDQpjYXQoDQogICJFbSAyNCBtZXNlcywgbyBlZmVpdG8gY29ycmVzcG9uZGVudGUgc2VyaWEgZGUgYXByb3hpbWFkYW1lbnRlICIsDQogIHJvdW5kKGJldGFfMjQgKiAxMCwgMiksDQogICIgcC5wLlxuIiwNCiAgc2VwID0gIiINCikNCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAxNi4gR1LDgUZJQ08g4oCUIFBBRFLDg08gSUJNQUNSTw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZ3JhZmljbyA8LSBwbG90X2x5KA0KDQogIGRhdGEgPSByZXN1bHRhZG9zLA0KDQogIHggPSB+aG9yaXpvbnRlDQoNCikgJT4lDQoNCg0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgIyBJTlRFUlZBTE8gREUgQ09ORklBTsOHQQ0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBhZGRfcmliYm9ucygNCg0KICAgIHltaW4gPQ0KICAgICAgfmxpbWl0ZV9pbmZlcmlvciwNCg0KICAgIHltYXggPQ0KICAgICAgfmxpbWl0ZV9zdXBlcmlvciwNCg0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAidHJhbnNwYXJlbnQiDQogICAgKSwNCg0KICAgIGZpbGxjb2xvciA9DQogICAgICAicmdiYSgyNTQsMTgzLDE4LDAuMTgpIiwNCg0KICAgIG5hbWUgPSAiSUMgOTAlIiwNCg0KICAgIGhvdmVyaW5mbyA9ICJza2lwIg0KICApICU+JQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgQ09FRklDSUVOVEUgREUgUkVQQVNTRQ0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBhZGRfdHJhY2UoDQoNCiAgICB5ID0gfmNvZWZpY2llbnRlLA0KDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCg0KICAgIG1vZGUgPSAibGluZXMrbWFya2VycyIsDQoNCiAgICBuYW1lID0gIkNvZWZpY2llbnRlIGRlIHJlcGFzc2UiLA0KDQogICAgbGluZSA9IGxpc3QoDQoNCiAgICAgIGNvbG9yID0NCiAgICAgICAgY29sb3JzWzJdLA0KDQogICAgICB3aWR0aCA9IDMNCiAgICApLA0KDQogICAgbWFya2VyID0gbGlzdCgNCg0KICAgICAgY29sb3IgPQ0KICAgICAgICBjb2xvcnNbMV0sDQoNCiAgICAgIHNpemUgPSA3LA0KDQogICAgICBsaW5lID0gbGlzdCgNCg0KICAgICAgICBjb2xvciA9DQogICAgICAgICAgY29sb3JzWzJdLA0KDQogICAgICAgIHdpZHRoID0gMQ0KICAgICAgKQ0KICAgICksDQoNCiAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUwKA0KDQogICAgICAiPGI+SG9yaXpvbnRlOjwvYj4gJXt4fSBtZXNlcyIsDQoNCiAgICAgICI8YnI+PGI+Q29lZmljaWVudGU6PC9iPiAle3k6LjNmfSIsDQoNCiAgICAgICI8ZXh0cmE+PC9leHRyYT4iDQogICAgKQ0KICApICU+JQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgTElOSEEgWkVSTw0KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBhZGRfc2VnbWVudHMoDQoNCiAgICB4ID0gMCwNCg0KICAgIHhlbmQgPSAyNCwNCg0KICAgIHkgPSAwLA0KDQogICAgeWVuZCA9IDAsDQoNCiAgICBsaW5lID0gbGlzdCgNCg0KICAgICAgY29sb3IgPQ0KICAgICAgICBjb2xvcnNbM10sDQoNCiAgICAgIHdpZHRoID0gMS41LA0KDQogICAgICBkYXNoID0gImRhc2giDQogICAgKSwNCg0KICAgIHNob3dsZWdlbmQgPSBGQUxTRQ0KICApICU+JQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgTElOSEEgVkVSVElDQUwg4oCUIDEyIE1FU0VTDQogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIGFkZF9zZWdtZW50cygNCg0KICAgIHggPSAxMiwNCg0KICAgIHhlbmQgPSAxMiwNCg0KICAgIHkgPQ0KICAgICAgbWluKA0KICAgICAgICByZXN1bHRhZG9zJGxpbWl0ZV9pbmZlcmlvciwNCiAgICAgICAgbmEucm0gPSBUUlVFDQogICAgICApLA0KDQogICAgeWVuZCA9DQogICAgICBtYXgoDQogICAgICAgIHJlc3VsdGFkb3MkbGltaXRlX3N1cGVyaW9yLA0KICAgICAgICBuYS5ybSA9IFRSVUUNCiAgICAgICksDQoNCiAgICBsaW5lID0gbGlzdCgNCg0KICAgICAgY29sb3IgPQ0KICAgICAgICBjb2xvcnNbMV0sDQoNCiAgICAgIHdpZHRoID0gMiwNCg0KICAgICAgZGFzaCA9ICJkb3QiDQogICAgKSwNCg0KICAgIHNob3dsZWdlbmQgPSBGQUxTRQ0KICApICU+JQ0KDQoNCiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICMgTElOSEEgVkVSVElDQUwg4oCUIDI0IE1FU0VTDQogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIGFkZF9zZWdtZW50cygNCg0KICAgIHggPSAyNCwNCg0KICAgIHhlbmQgPSAyNCwNCg0KICAgIHkgPQ0KICAgICAgbWluKA0KICAgICAgICByZXN1bHRhZG9zJGxpbWl0ZV9pbmZlcmlvciwNCiAgICAgICAgbmEucm0gPSBUUlVFDQogICAgICApLA0KDQogICAgeWVuZCA9DQogICAgICBtYXgoDQogICAgICAgIHJlc3VsdGFkb3MkbGltaXRlX3N1cGVyaW9yLA0KICAgICAgICBuYS5ybSA9IFRSVUUNCiAgICAgICksDQoNCiAgICBsaW5lID0gbGlzdCgNCg0KICAgICAgY29sb3IgPQ0KICAgICAgICBjb2xvcnNbM10sDQoNCiAgICAgIHdpZHRoID0gMiwNCg0KICAgICAgZGFzaCA9ICJkb3QiDQogICAgKSwNCg0KICAgIHNob3dsZWdlbmQgPSBGQUxTRQ0KICApICU+JQ0KDQoNCiAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICMgTEFZT1VUDQogICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQogIGxheW91dCgNCg0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAjIFTDjVRVTE8NCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICB0aXRsZSA9IGxpc3QoDQoNCiAgICAgIHRleHQgPQ0KICAgICAgICAiUmVwYXNzZSBjYW1iaWFsIGFjdW11bGFkbyBwYXJhIGFsaW1lbnRhw6fDo28gbm8gZG9taWPDrWxpbyIsDQoNCiAgICAgIGZvbnQgPSBsaXN0KA0KDQogICAgICAgIGZhbWlseSA9DQogICAgICAgICAgIkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiLA0KDQogICAgICAgIGNvbG9yID0NCiAgICAgICAgICBjb2xvcnNbMl0sDQoNCiAgICAgICAgc2l6ZSA9IDIwDQogICAgICApLA0KDQogICAgICB4ID0gMC41DQogICAgKSwNCg0KDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICMgQU5PVEHDh8OVRVMNCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQoNCg0KICAgICAgIyBTdWJ0w610dWxvDQoNCiAgICAgIGxpc3QoDQoNCiAgICAgICAgeCA9IDAuNSwNCg0KICAgICAgICB5ID0gMS4wNSwNCg0KICAgICAgICB4cmVmID0gInBhcGVyIiwNCg0KICAgICAgICB5cmVmID0gInBhcGVyIiwNCg0KICAgICAgICB0ZXh0ID0NCiAgICAgICAgICAiUHJvamXDp8O1ZXMgbG9jYWlzIOKAlCBjb2VmaWNpZW50ZSBhc3NvY2lhZG8gYSB1bWEgZGVwcmVjaWHDp8OjbyBjYW1iaWFsIGRlIDElIiwNCg0KICAgICAgICBzaG93YXJyb3cgPSBGQUxTRSwNCg0KICAgICAgICBmb250ID0gbGlzdCgNCg0KICAgICAgICAgIGZhbWlseSA9ICJBcmlhbCIsDQoNCiAgICAgICAgICBzaXplID0gMTMsDQoNCiAgICAgICAgICBjb2xvciA9ICIjNEI1NTYzIg0KICAgICAgICApDQogICAgICApLA0KDQoNCiAgICAgICMgMTIgbWVzZXMNCg0KICAgICAgbGlzdCgNCg0KICAgICAgICB4ID0gMTIsDQoNCiAgICAgICAgeSA9IGJldGFfMTIsDQoNCiAgICAgICAgeHJlZiA9ICJ4IiwNCg0KICAgICAgICB5cmVmID0gInkiLA0KDQogICAgICAgIHRleHQgPSBwYXN0ZTAoDQoNCiAgICAgICAgICAiMTIgbWVzZXM6ICIsDQoNCiAgICAgICAgICByb3VuZCgNCiAgICAgICAgICAgIGJldGFfMTIsDQogICAgICAgICAgICAyDQogICAgICAgICAgKQ0KICAgICAgICApLA0KDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQoNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCg0KICAgICAgICBheCA9IDQ1LA0KDQogICAgICAgIGF5ID0gLTQwLA0KDQogICAgICAgIGZvbnQgPSBsaXN0KA0KDQogICAgICAgICAgZmFtaWx5ID0gIkFyaWFsIiwNCg0KICAgICAgICAgIGNvbG9yID0NCiAgICAgICAgICAgIGNvbG9yc1syXSwNCg0KICAgICAgICAgIHNpemUgPSAxMg0KICAgICAgICApDQogICAgICApLA0KDQoNCiAgICAgICMgMjQgbWVzZXMNCg0KICAgICAgbGlzdCgNCg0KICAgICAgICB4ID0gMjQsDQoNCiAgICAgICAgeSA9IGJldGFfMjQsDQoNCiAgICAgICAgeHJlZiA9ICJ4IiwNCg0KICAgICAgICB5cmVmID0gInkiLA0KDQogICAgICAgIHRleHQgPSBwYXN0ZTAoDQoNCiAgICAgICAgICAiMjQgbWVzZXM6ICIsDQoNCiAgICAgICAgICByb3VuZCgNCiAgICAgICAgICAgIGJldGFfMjQsDQogICAgICAgICAgICAyDQogICAgICAgICAgKQ0KICAgICAgICApLA0KDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQoNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCg0KICAgICAgICBheCA9IC01MCwNCg0KICAgICAgICBheSA9IC00MCwNCg0KICAgICAgICBmb250ID0gbGlzdCgNCg0KICAgICAgICAgIGZhbWlseSA9ICJBcmlhbCIsDQoNCiAgICAgICAgICBjb2xvciA9DQogICAgICAgICAgICBjb2xvcnNbMl0sDQoNCiAgICAgICAgICBzaXplID0gMTINCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICksDQoNCg0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAjIEVJWE8gWA0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIHhheGlzID0gbGlzdCgNCg0KICAgICAgdGl0bGUgPSBsaXN0KA0KDQogICAgICAgIHRleHQgPQ0KICAgICAgICAgICJIb3Jpem9udGUgYXDDs3MgYSB2YXJpYcOnw6NvIGNhbWJpYWwgKG1lc2VzKSIsDQoNCiAgICAgICAgZm9udCA9IGxpc3QoDQoNCiAgICAgICAgICBmYW1pbHkgPSAiQXJpYWwiLA0KDQogICAgICAgICAgc2l6ZSA9IDEzLA0KDQogICAgICAgICAgY29sb3IgPQ0KICAgICAgICAgICAgY29sb3JzWzddDQogICAgICAgICkNCiAgICAgICksDQoNCiAgICAgIGR0aWNrID0gMiwNCg0KICAgICAgc2hvd2dyaWQgPSBUUlVFLA0KDQogICAgICBncmlkY29sb3IgPQ0KICAgICAgICAiI0YzRjRGNiIsDQoNCiAgICAgIHplcm9saW5lID0gRkFMU0UsDQoNCiAgICAgIHRpY2tmb250ID0gbGlzdCgNCg0KICAgICAgICBmYW1pbHkgPSAiQXJpYWwiLA0KDQogICAgICAgIHNpemUgPSAxMSwNCg0KICAgICAgICBjb2xvciA9DQogICAgICAgICAgY29sb3JzWzddDQogICAgICApDQogICAgKSwNCg0KDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICMgRUlYTyBZDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgeWF4aXMgPSBsaXN0KA0KDQogICAgICB0aXRsZSA9IGxpc3QoDQoNCiAgICAgICAgdGV4dCA9DQogICAgICAgICAgIkNvZWZpY2llbnRlIGRlIHJlcGFzc2UgY2FtYmlhbCIsDQoNCiAgICAgICAgZm9udCA9IGxpc3QoDQoNCiAgICAgICAgICBmYW1pbHkgPSAiQXJpYWwiLA0KDQogICAgICAgICAgc2l6ZSA9IDEzLA0KDQogICAgICAgICAgY29sb3IgPQ0KICAgICAgICAgICAgY29sb3JzWzddDQogICAgICAgICkNCiAgICAgICksDQoNCiAgICAgIHNob3dncmlkID0gVFJVRSwNCg0KICAgICAgZ3JpZGNvbG9yID0NCiAgICAgICAgIiNGM0Y0RjYiLA0KDQogICAgICB6ZXJvbGluZSA9IFRSVUUsDQoNCiAgICAgIHplcm9saW5lY29sb3IgPQ0KICAgICAgICAiI0QxRDVEQiIsDQoNCiAgICAgIHRpY2tmb250ID0gbGlzdCgNCg0KICAgICAgICBmYW1pbHkgPSAiQXJpYWwiLA0KDQogICAgICAgIHNpemUgPSAxMSwNCg0KICAgICAgICBjb2xvciA9DQogICAgICAgICAgY29sb3JzWzddDQogICAgICApDQogICAgKSwNCg0KDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICMgRlVORE8NCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICBwbG90X2JnY29sb3IgPQ0KICAgICAgIiNGRkZGRkYiLA0KDQogICAgcGFwZXJfYmdjb2xvciA9DQogICAgICAiI0ZGRkZGRiIsDQoNCg0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAjIEZPTlRFIEdMT0JBTA0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIGZvbnQgPSBsaXN0KA0KDQogICAgICBmYW1pbHkgPQ0KICAgICAgICAiQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIsDQoNCiAgICAgIGNvbG9yID0NCiAgICAgICAgY29sb3JzWzddDQogICAgKSwNCg0KDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICMgTEVHRU5EQQ0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIGxlZ2VuZCA9IGxpc3QoDQoNCiAgICAgIG9yaWVudGF0aW9uID0gImgiLA0KDQogICAgICB4ID0gMC41LA0KDQogICAgICB5ID0gLTAuMTgsDQoNCiAgICAgIHhhbmNob3IgPSAiY2VudGVyIiwNCg0KICAgICAgZm9udCA9IGxpc3QoDQoNCiAgICAgICAgZmFtaWx5ID0gIkFyaWFsIiwNCg0KICAgICAgICBzaXplID0gMTENCiAgICAgICkNCiAgICApLA0KDQoNCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgIyBIT1ZFUg0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIGhvdmVybGFiZWwgPSBsaXN0KA0KDQogICAgICBiZ2NvbG9yID0NCiAgICAgICAgY29sb3JzWzJdLA0KDQogICAgICBib3JkZXJjb2xvciA9DQogICAgICAgIGNvbG9yc1sxXSwNCg0KICAgICAgZm9udCA9IGxpc3QoDQoNCiAgICAgICAgZmFtaWx5ID0gIkFyaWFsIiwNCg0KICAgICAgICBzaXplID0gMTMsDQoNCiAgICAgICAgY29sb3IgPSAiI0ZGRkZGRiINCiAgICAgICkNCiAgICApLA0KDQoNCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgIyBNQVJHRU5TDQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgbWFyZ2luID0gbGlzdCgNCg0KICAgICAgbCA9IDc1LA0KDQogICAgICByID0gNDAsDQoNCiAgICAgIHQgPSAxMDUsDQoNCiAgICAgIGIgPSA5MA0KICAgICkNCiAgKQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIDE3LiBNT1NUUkFSIEdSw4FGSUNPDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpncmFmaWNvDQpgYGANCg0KTyBtb2RlbG8gZGUgUHJvamXDp8O1ZXMgTG9jYWlzIGVzdGltYWRvIGRlbW9uc3RyYSBxdWUgbyBjb2VmaWNpZW50ZSBkZSByZXBhc3NlIGNhbWJpYWwgKCRcYmV0YV9oJCkgYXByZXNlbnRhIGNhcsOhdGVyIGFjdW11bGF0aXZvIGFvIGxvbmdvIGRvIHRlbXBvLiBObyBob3Jpem9udGUgZGUgKioxMiBtZXNlcyoqLCBvIGNvZWZpY2llbnRlIGF0aW5nZSAkXGJldGFfezEyfSA9IDAsMTkkLCBpbmRpY2FuZG8gcXVlIHVtYSBkZXByZWNpYcOnw6NvIGNhbWJpYWwgZGUgMTAlIHNlIHRyYWR1eiBlbSB1bSBhdW1lbnRvIGFjdW11bGFkbyBkZSAqKjEsOSBwLnAuKiogbmEgaW5mbGHDp8OjbyBkZSBhbGltZW50YcOnw6NvIG5vIGRvbWljw61saW8gYW8gZmltIGRlIHVtIGFuby4gTm8gaG9yaXpvbnRlIGRlICoqMjQgbWVzZXMqKiwgbyBpbXBhY3RvIGFjdW11bGFkbyBhdGluZ2UgJFxiZXRhX3syNH0gPSAwLDM3JC4NCg0KQSBlbGV2YcOnw6NvIGRhIHRheGEgZGUgY8OibWJpbyBlbmNhcmVjZSBvIGN1c3RvIGRlIHByb2R1w6fDo28gYWdyw61jb2xhIChjb3N0LXB1c2ggZWZmZWN0KSwgZm9yw6dhbmRvIG8gcmVhanVzdGUgbm9zIHByZcOnb3MgZG9zIGFsaW1lbnRvcyBwcm9jZXNzYWRvcyBlIGluIG5hdHVyYSwgbyBxdWUgcmVkdXogZGVzcHJvcG9yY2lvbmFsbWVudGUgbyBwb2RlciBkZSBjb21wcmEgZGFzIGNsYXNzZXMgdnVsbmVyw6F2ZWlzLiANCg0KQ29tbyByZWZlcsOqbmNpYSBtZXRvZG9sw7NnaWNhLCBvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIGVzdGltYSBjb2VmaWNpZW50ZXMgZGUgcmVwYXNzZSBjYW1iaWFsIHBhcmEgbyBncnVwbyBkZSBhbGltZW50YcOnw6NvIG5vIGRvbWljw61saW8gZGUgYXByb3hpbWFkYW1lbnRlICoqMCwyNioqIGVtIDEyIG1lc2VzIGUgKiowLDMzKiogZW0gMjQgbWVzZXMuIEEgZGl2ZXJnw6puY2lhIG1vZGVyYWRhIGVudHJlIG9zIHJlc3VsdGFkb3MgZGEgbGl0ZXJhdHVyYSBvZmljaWFsIGUgb3Mgb2J0aWRvcyBuZXN0YSBhbsOhbGlzZSDDqSBmcnV0byBkbyBncmF1IGRlIHBhcmNpbcO0bmlhIGRhIGVzcGVjaWZpY2HDp8OjbyB1dGlsaXphZGEuIA0KDQpBIHByb2plw6fDo28gbG9jYWwgYWRvdGFkYSBzZWd1aXUgdW1hIGVzcGVjaWZpY2HDp8OjbyBzaW1wbGlmaWNhZGEgY29udHJvbGFuZG8gZnVuZGFtZW50YWxtZW50ZSBwZWxhcyB2YXJpYcOnw7VlcyBkbyBjw6JtYmlvIGUgZG8gw61uZGljZSBnbG9iYWwgZGUgY29tbW9kaXRpZXM6DQoNCiQkXHBpX3t0LHQraH1ee2FsaW19ID0gXGFscGhhX2ggKyBcYmV0YV9oIFxEZWx0YSBcbG4oQ8OibWJpb190KSArIFxnYW1tYV9oIFxEZWx0YSBcbG4oQ29tbW9kaXR5X3QpICsgXHZhcmVwc2lsb25fe3QraH0kJA0KQW8gbsOjbyBpbmNsdWlyIGV4cGxpY2l0YW1lbnRlIHZhcmnDoXZlaXMgZGUgY29udHJvbGUgYWRpY2lvbmFpcyDigJQgdGFpcyBjb21vIG1lZGlkYXMgZGUgaGlhdG8gZG8gcHJvZHV0bywgaW7DqXJjaWEgaW5mbGFjaW9uw6FyaWEgZGVmYXNhZGEsIGV4cGVjdGF0aXZhcyBkZSBpbmZsYcOnw6NvIChGb2N1cykgZSBjaG9xdWVzIGNsaW3DoXRpY29zIChjb21vIG8gZWZlaXRvIEVsIE5pw7FvL0xhIE5pw7FhKSDigJQsIG8gbW9kZWxvIGNhcHRhIHVtIHNpbmFsIGRpcmV0byBkbyBjaG9xdWUgY2FtYmlhbCBzZW0gZmlsdHJhciBpbnRlcmHDp8O1ZXMgZGUgc2VndW5kYSBvcmRlbS4gDQoNCkNvbnR1ZG8sIGFwZXNhciBkbyBtZW5vciBuw7ptZXJvIGRlIGNvdmFyacOhdmVpcywgbyBtb2RlbG8gc2ltcGxpZmljYWRvIGFwcmVzZW50b3UgZm9ydGUgYWRlcsOqbmNpYSBlbXDDrXJpY2EgYW9zIHBhcsOibWV0cm9zIGRvIEJBQ0VOLCBwcmVzZXJ2YW5kbyBhIG1hZ25pdHVkZSwgbyBzaW5hbCBlIGEgdHJhamV0w7NyaWEgZGUgbG9uZ28gcHJhem8gZG8gcmVwYXNzZSBjYW1iaWFsIHNvYnJlIGEgY2VzdGEgYsOhc2ljYS4NCg0KIyMgMS45IERpdmVyZ8OqbmNpYSBkZSBjYW5haXM6IGTDs2xhciwgZ2Fzb2xpbmEgZSBzZXJ2acOnb3MNCg0KQmVucyBlbmVyZ8OpdGljb3MgZSBjb21idXN0w612ZWlzIHBvc3N1ZW0gcHJlw6dvcyBsaWdhZG9zIGFvIG1lcmNhZG8gaW50ZXJuYWNpb25hbCBlIGFvIGPDom1iaW8sIHRyYW5zbWl0aW5kbyBpbXB1bHNvcyBkZSBhbHRhIHZvbGF0aWxpZGFkZS4gUG9yIG91dHJvIGxhZG8sIG8gc2V0b3IgZGUgc2VydmnDp29zIG9wZXJhIHNvYiByZWdyYXMgZGUgaW5kZXhhw6fDo28sIG1hcmdlbnMgZGUgZGVtYW5kYSBlIG5lZ29jaWHDp8O1ZXMgc2FsYXJpYWlzLiANCg0KTyBJUENBIEdhc29saW5hIGFwcmVzZW50YSBmb3J0ZSBjby1tb3ZpbWVudGHDp8OjbyBjb20gYSB0YXhhIGRlIGPDom1iaW8uIFNlbmRvIHVtYSBjb21tb2RpdHkgbMOtcXVpZGEgaW50ZXJuYWNpb25hbCAocGV0csOzbGVvKSwgb3MgcmVhanVzdGVzIG5hcyByZWZpbmFyaWFzIGluY29ycG9yYW0gYXMgdmFyaWHDp8O1ZXMgZG8gZMOzbGFyLCBnZXJhbmRvIHJlcGFzc2VzIGRlIGFsdGEgYW1wbGl0dWRlIHF1ZSBhZmV0YW0gY3VzdG9zIGRlIHRyYW5zcG9ydGUgZSBmcmV0ZS4gSsOhIGEgc8OpcmllIGRvIElQQ0EgU2VydmnDp29zIGV4aWJlIGVzdGFiaWxpZGFkZSBlIGRlc2NvbGFtZW50byBlbSByZWxhw6fDo28gw6BzIG9zY2lsYcOnw7VlcyBkZSBjdXJ0byBwcmF6byBkbyBkw7NsYXIuICANCg0KUG9yIHNlciB1bSBzZXRvciBpbnRlbnNpdm8gZW0gbcOjbyBkZSBvYnJhIGludGVybmEgZSBwcm90ZWdpZG8gZGEgY29tcGV0acOnw6NvIGludGVybmFjaW9uYWwsIG8gc2VnbWVudG8gZGUgc2VydmnDp29zIG7Do28gw6kgYmVuZWZpY2lhZG8gZGUgZm9ybWEgZGlyZXRhIHBlbGFzIGFwcmVjaWHDp8O1ZXMgZG8gZMOzbGFyLiBDb21vIGVzc2VzIGl0ZW5zIHBvc3N1ZW0gbWFpb3IgcGVzbyBubyBjb25zdW1vIGRhIGFsdGEgcmVuZGEsIGEgaW5mbGHDp8OjbyBkZXNzZSBncnVwbyBwZXJtYW5lY2V1IHN1c3RlbnRhZGEgcG9yIHByZXNzw7VlcyBzYWxhcmlhaXMgZSBkZW1hbmRhIGFxdWVjaWRhLCBleHBsaWNhbmRvIGEgcmVzaWxpw6puY2lhIGRvIElQQ0Egbm8gdG9wbyBkYSBkaXN0cmlidWnDp8OjbyBkZSByZW5kYS4NCg0KDQojIFBhcnRlIDIg4oCUIEPDom1iaW8sIGVtcHJlZ28gZSByZW5kaW1lbnRvIG5vcyBzZXRvcmVzIHRyYW5zYWNpb27DoXZlaXMNCg0KQSB0YXhhIGRlIGPDom1iaW8gaW50ZXJmZXJlIG5vIG1lcmNhZG8gZGUgdHJhYmFsaG8gcG9yIGNhbWluaG9zIHF1ZSBwb2RlbSBhdHVhciBlbSBkaXJlw6fDtWVzIG9wb3N0YXMuIFF1YW5kbyBvIHJlYWwgcGVyZGUgdmFsb3IsIGVtcHJlc2FzIGV4cG9ydGFkb3JhcyByZWNlYmVtIG1haXMgcmVhaXMgcG9yIHVtYSBtZXNtYSByZWNlaXRhIG9idGlkYSBlbSBtb2VkYSBlc3RyYW5nZWlyYSBlIG9zIHByb2R1dG9zIGltcG9ydGFkb3MgcXVlIGNvbmNvcnJlbSBjb20gYSBwcm9kdcOnw6NvIG5hY2lvbmFsIGZpY2FtIG1haXMgY2Fyb3MuIEVzc2EgY29tYmluYcOnw6NvIHBvZGUgZmF2b3JlY2VyIHZlbmRhcywgcHJvZHXDp8OjbyBlIGNvbnRyYXRhw6fDtWVzLiBBbyBtZXNtbyB0ZW1wbywgYSBkZXN2YWxvcml6YcOnw6NvIGVuY2FyZWNlIG3DoXF1aW5hcywgcGXDp2FzIGUgaW5zdW1vcyBjb21wcmFkb3Mgbm8gZXh0ZXJpb3IsIHByZXNzaW9uYSBvcyBjdXN0b3MgZSBwb2RlIHJlZHV6aXIgYSBjYXBhY2lkYWRlIGRlIGNvbnRyYXRhci4gTyByZXN1bHRhZG8gc29icmUgbyBlbXByZWdvIGRlcGVuZGUgZGUgcXVhbCBkZXNzZXMgbW92aW1lbnRvcyBwcmV2YWxlY2UgZW0gY2FkYSBzZXRvciwgYWzDqW0gZG8gY29tcG9ydGFtZW50byBkYSBhdGl2aWRhZGUgZWNvbsO0bWljYSwgZG9zIHByZcOnb3MgaW50ZXJuYWNpb25haXMsIGRvcyBqdXJvcyBlIGRhIHByb2R1dGl2aWRhZGUuDQoNCiMjIDIuMSBFeHBvc2nDp8OjbyBjb21lcmNpYWwgZGEgQWdyb3BlY3XDoXJpYSBlIGRhIEluZMO6c3RyaWEgZ2VyYWwNCg0KTyBwcmltZWlybyBwYXNzbyDDqSBpZGVudGlmaWNhciBjb21vIGEgQWdyb3BlY3XDoXJpYSBlIGEgSW5kw7pzdHJpYSBnZXJhbCBwYXJ0aWNpcGFtIGRvIGNvbcOpcmNpbyBleHRlcmlvciBicmFzaWxlaXJvLCBwb2lzIHVtYSBtZXNtYSBtdWRhbsOnYSBjYW1iaWFsIHBvZGUgcHJvZHV6aXIgcmVzdWx0YWRvcyBkaWZlcmVudGVzIGNvbmZvcm1lIGEgcG9zacOnw6NvIGNvbWVyY2lhbCBkbyBzZXRvci4gUGFyYSBpc3NvLCBmb3JhbSB1dGlsaXphZG9zIGRvaXMgaW5kaWNhZG9yZXMuIE8gcHJpbWVpcm8gbWVkZSBhIHBhcnRpY2lwYcOnw6NvIGRlIGNhZGEgc2V0b3IgbmFzIGV4cG9ydGHDp8O1ZXMgYW5hbGlzYWRhcywgZW5xdWFudG8gbyBzZWd1bmRvIG1vc3RyYSBxdWFudG8gYXMgaW1wb3J0YcOnw7VlcyByZXByZXNlbnRhbSBuYSBjb3JyZW50ZSBkZSBjb23DqXJjaW8gZG8gcHLDs3ByaW8gc2V0b3IuDQoNCkEgcGFydGljaXBhw6fDo28gbmFzIGV4cG9ydGHDp8O1ZXMgZm9pIGNhbGN1bGFkYSBwZWxhIHJhesOjbyBlbnRyZSBvIHZhbG9yIGV4cG9ydGFkbyBwZWxvIHNldG9yIGUgYSBzb21hIGRhcyBleHBvcnRhw6fDtWVzIGRhIEFncm9wZWN1w6FyaWEgZSBkYSBJbmTDunN0cmlhIGdlcmFsOg0KDQokJA0KUEVfcyA9DQpcZnJhY3tYX3N9DQp7XGRpc3BsYXlzdHlsZVxzdW1fe2ogXGluIFN9IFhfan0NClx0aW1lcyAxMDANCiQkDQoNCmVtIHF1ZSAkWF9zJCByZXByZXNlbnRhIGFzIGV4cG9ydGHDp8O1ZXMgZG8gc2V0b3IgJHMkLCBlICRTJCBjb3JyZXNwb25kZSBhbyBjb25qdW50byBmb3JtYWRvIHBlbGEgQWdyb3BlY3XDoXJpYSBlIHBlbGEgSW5kw7pzdHJpYSBnZXJhbC4NCg0KQSBvcmllbnRhw6fDo28gaW1wb3J0YWRvcmEgZm9pIGNhbGN1bGFkYSBwZWxhIHBhcnRpY2lwYcOnw6NvIGRhcyBpbXBvcnRhw6fDtWVzIG5hIHNvbWEgZGFzIGV4cG9ydGHDp8O1ZXMgZSBpbXBvcnRhw6fDtWVzIGRvIHNldG9yOg0KDQokJA0KT0lfcyA9DQpcZnJhY3tNX3N9DQp7WF9zICsgTV9zfQ0KXHRpbWVzIDEwMA0KJCQNCg0KZW0gcXVlICRNX3MkIHJlcHJlc2VudGEgYXMgaW1wb3J0YcOnw7Vlcy4gRXNzZSBpbmRpY2Fkb3IgZGVzY3JldmUgYSBwb3Npw6fDo28gZG8gc2V0b3IgZW0gc2V1IGNvbcOpcmNpbyBpbnRlcm5hY2lvbmFsLCBtYXMgbsOjbyBtZWRlIGRpcmV0YW1lbnRlIHF1YW50byBzdWEgcHJvZHXDp8OjbyBkZXBlbmRlIGRlIGluc3Vtb3MgaW1wb3J0YWRvcywgasOhIHF1ZSBvcyBkYWRvcyBkbyBDb21leCBTdGF0IG7Do28gaW5mb3JtYW0gbyBkZXN0aW5vIHByb2R1dGl2byBkZSBjYWRhIG1lcmNhZG9yaWEgY29tcHJhZGEgbm8gZXh0ZXJpb3IuDQoNCg0KKipHcsOhZmljbyAyLjEg4oCUIEV4cG9zacOnw6NvIGNhbWJpYWwgZSBwZXJmaWwgZG8gdHJhYmFsaG8gbm9zIHNldG9yZXMgdHJhbnNhY2lvbsOhdmVpcyoqDQoNCmBgYHtyIHAyLWV4cG9zaWNhby1jYW1iaWFsLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIDEuIENvbcOpcmNpbyBleHRlcmlvciDigJQgQ29tZXggU3RhdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY29tZXggPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKA0KICBwYXRoID0gIkltcC1leHAtY29tZXhzdGF0Lnhsc3giLA0KICBzaGVldCA9ICJSZXN1bHRhZG8iDQopIHw+DQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0KY29tZXJjaW9fc2V0b3JpYWwgPC0gY29tZXggfD4NCiAgZHBseXI6OmZpbHRlcigNCiAgICBhbm8gPT0gMjAyNSwNCiAgICBjb2RpZ29faXNpY19zZWNhbyAlaW4lIGMoIkEiLCAiQiIsICJDIikNCiAgKSB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIHNldG9yID0gZHBseXI6OmNhc2Vfd2hlbigNCiAgICAgIGNvZGlnb19pc2ljX3NlY2FvID09ICJBIiB+ICJBZ3JvcGVjdcOhcmlhIiwNCiAgICAgIGNvZGlnb19pc2ljX3NlY2FvICVpbiUgYygiQiIsICJDIikgfiAiSW5kw7pzdHJpYSBnZXJhbCINCiAgICApLA0KDQogICAgZmx1eG8gPSBkcGx5cjo6Y2FzZV93aGVuKA0KICAgICAgZmx1eG8gPT0gIkV4cG9ydGHDp8OjbyIgfiAiZXhwb3J0YWNvZXNfdXNkIiwNCiAgICAgIGZsdXhvID09ICJJbXBvcnRhw6fDo28iIH4gImltcG9ydGFjb2VzX3VzZCINCiAgICApDQogICkgfD4NCiAgZHBseXI6Omdyb3VwX2J5KHNldG9yLCBmbHV4bykgfD4NCiAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICB2YWxvcl91c2QgPSBzdW0odmFsb3JfdXNfZm9iKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgfD4NCiAgdGlkeXI6OnBpdm90X3dpZGVyKA0KICAgIG5hbWVzX2Zyb20gPSBmbHV4bywNCiAgICB2YWx1ZXNfZnJvbSA9IHZhbG9yX3VzZA0KICApIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgcGFydGljaXBhY2FvX2V4cG9ydGFjb2VzID0NCiAgICAgIGV4cG9ydGFjb2VzX3VzZCAvIHN1bShleHBvcnRhY29lc191c2QpICogMTAwLA0KDQogICAgb3JpZW50YWNhb19pbXBvcnRhZG9yYSA9DQogICAgICBpbXBvcnRhY29lc191c2QgLw0KICAgICAgKGV4cG9ydGFjb2VzX3VzZCArIGltcG9ydGFjb2VzX3VzZCkgKiAxMDANCiAgKQ0KDQoNCiMgMi4gUGVzc29hcyBvY3VwYWRhcyDigJQgU0lEUkEgNDM2MiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCm9jdXBhZG9zX2JydXRvcyA8LSByZWFkeGw6OnJlYWRfZXhjZWwoDQogIHBhdGggPSAiRGFkb3Muc2lkcmEueGxzeCIsDQogIHNoZWV0ID0gIlRhYmVsYSIsDQogIGNvbF9uYW1lcyA9IEZBTFNFDQopDQoNCmFub3NfZGlzcG9uaXZlaXMgPC0gYXMuY2hhcmFjdGVyKA0KICB1bmxpc3QoDQogICAgb2N1cGFkb3NfYnJ1dG9zWzQsIF0sDQogICAgdXNlLm5hbWVzID0gRkFMU0UNCiAgKQ0KKQ0KDQpjb2x1bmFfMjAyNSA8LSB3aGljaCgNCiAgYW5vc19kaXNwb25pdmVpcyA9PSAiMjAyNSINCilbMV0NCg0Kb2N1cGFkb3Nfc2V0b3JpYWlzIDwtIHRpYmJsZTo6dGliYmxlKA0KICBzZXRvcl9vcmlnaW5hbCA9IGFzLmNoYXJhY3RlcigNCiAgICBvY3VwYWRvc19icnV0b3NbWzJdXQ0KICApLA0KDQogIG9jdXBhZG9zX21pbCA9IGFzLm51bWVyaWMoDQogICAgb2N1cGFkb3NfYnJ1dG9zW1tjb2x1bmFfMjAyNV1dDQogICkNCikgfD4NCiAgZHBseXI6OmZpbHRlcigNCiAgICBzZXRvcl9vcmlnaW5hbCAlaW4lIGMoDQogICAgICBwYXN0ZTAoDQogICAgICAgICJBZ3JpY3VsdHVyYSwgcGVjdcOhcmlhLCBwcm9kdcOnw6NvIGZsb3Jlc3RhbCwgIiwNCiAgICAgICAgInBlc2NhIGUgYXF1aWN1bHR1cmEiDQogICAgICApLA0KICAgICAgIkluZMO6c3RyaWEgZ2VyYWwiDQogICAgKQ0KICApIHw+DQogIGRwbHlyOjp0cmFuc211dGUoDQogICAgc2V0b3IgPSBkcGx5cjo6cmVjb2RlKA0KICAgICAgc2V0b3Jfb3JpZ2luYWwsDQoNCiAgICAgICJBZ3JpY3VsdHVyYSwgcGVjdcOhcmlhLCBwcm9kdcOnw6NvIGZsb3Jlc3RhbCwgcGVzY2EgZSBhcXVpY3VsdHVyYSIgPQ0KICAgICAgICAiQWdyb3BlY3XDoXJpYSIsDQoNCiAgICAgICJJbmTDunN0cmlhIGdlcmFsIiA9DQogICAgICAgICJJbmTDunN0cmlhIGdlcmFsIg0KICAgICksDQoNCiAgICBvY3VwYWRvc19taWwNCiAgKQ0KDQoNCiMgMy4gUmVuZGltZW50byBtw6lkaW8gcmVhbCDigJQgU0lEUkEgNTQ0MiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpyZW5kaW1lbnRvX2JydXRvIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgNCiAgcGF0aCA9ICJTaWRyYS50cmltLnRyYWIueGxzeCIsDQogIHNoZWV0ID0gIlRhYmVsYSIsDQogIGNvbF9uYW1lcyA9IEZBTFNFDQopDQoNCnJlbmRpbWVudG9fdHJpbWVzdHJhbCA8LSB0aWJibGU6OnRpYmJsZSgNCiAgdHJpbWVzdHJlID0gYXMuY2hhcmFjdGVyKA0KICAgIHVubGlzdCgNCiAgICAgIHJlbmRpbWVudG9fYnJ1dG9bNCwgXSwNCiAgICAgIHVzZS5uYW1lcyA9IEZBTFNFDQogICAgKQ0KICApLA0KDQogIHNldG9yX29yaWdpbmFsID0gYXMuY2hhcmFjdGVyKA0KICAgIHVubGlzdCgNCiAgICAgIHJlbmRpbWVudG9fYnJ1dG9bNSwgXSwNCiAgICAgIHVzZS5uYW1lcyA9IEZBTFNFDQogICAgKQ0KICApLA0KDQogIHJlbmRpbWVudG9fcmVhbCA9IGFzLm51bWVyaWMoDQogICAgdW5saXN0KA0KICAgICAgcmVuZGltZW50b19icnV0b1s2LCBdLA0KICAgICAgdXNlLm5hbWVzID0gRkFMU0UNCiAgICApDQogICkNCikgfD4NCiAgdGlkeXI6OmZpbGwodHJpbWVzdHJlKSB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIHN0cmluZ3I6OnN0cl9kZXRlY3QodHJpbWVzdHJlLCAiMjAyNSIpLA0KDQogICAgc2V0b3Jfb3JpZ2luYWwgJWluJSBjKA0KICAgICAgcGFzdGUwKA0KICAgICAgICAiQWdyaWN1bHR1cmEsIHBlY3XDoXJpYSwgcHJvZHXDp8OjbyBmbG9yZXN0YWwsICIsDQogICAgICAgICJwZXNjYSBlIGFxdWljdWx0dXJhIg0KICAgICAgKSwNCiAgICAgICJJbmTDunN0cmlhIGdlcmFsIg0KICAgICkNCiAgKSB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIHNldG9yID0gZHBseXI6OnJlY29kZSgNCiAgICAgIHNldG9yX29yaWdpbmFsLA0KDQogICAgICAiQWdyaWN1bHR1cmEsIHBlY3XDoXJpYSwgcHJvZHXDp8OjbyBmbG9yZXN0YWwsIHBlc2NhIGUgYXF1aWN1bHR1cmEiID0NCiAgICAgICAgIkFncm9wZWN1w6FyaWEiLA0KDQogICAgICAiSW5kw7pzdHJpYSBnZXJhbCIgPQ0KICAgICAgICAiSW5kw7pzdHJpYSBnZXJhbCINCiAgICApDQogICkNCg0KcmVuZGltZW50b19zZXRvcmlhbCA8LSByZW5kaW1lbnRvX3RyaW1lc3RyYWwgfD4NCiAgZHBseXI6Omdyb3VwX2J5KHNldG9yKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKA0KICAgIHJlbmRpbWVudG9fcmVhbCA9IG1lYW4ocmVuZGltZW50b19yZWFsKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KDQojIDQuIEp1bsOnw6NvIGRhcyBiYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KZGFkb3NfZ3JhZmljbzEgPC0gY29tZXJjaW9fc2V0b3JpYWwgfD4NCiAgZHBseXI6OmZ1bGxfam9pbigNCiAgICBvY3VwYWRvc19zZXRvcmlhaXMsDQogICAgYnkgPSAic2V0b3IiDQogICkgfD4NCiAgZHBseXI6OmZ1bGxfam9pbigNCiAgICByZW5kaW1lbnRvX3NldG9yaWFsLA0KICAgIGJ5ID0gInNldG9yIg0KICApDQoNCnN0b3BpZm5vdCgNCiAgIkEganVuw6fDo28gbsOjbyByZXRvcm5vdSBvcyBkb2lzIHNldG9yZXMgZXNwZXJhZG9zLiIgPQ0KICAgIG5yb3coZGFkb3NfZ3JhZmljbzEpID09IDIsDQoNCiAgIkV4aXN0ZW0gdmFsb3JlcyBhdXNlbnRlcyBhcMOzcyBhIGp1bsOnw6NvIGRhcyBwbGFuaWxoYXMuIiA9DQogICAgIWFueU5BKGRhZG9zX2dyYWZpY28xKQ0KKQ0KDQpkYWRvc19ncmFmaWNvMSA8LSBkYWRvc19ncmFmaWNvMSB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIG9yZGVtID0gbWF0Y2goDQogICAgICBzZXRvciwNCiAgICAgIGMoIkFncm9wZWN1w6FyaWEiLCAiSW5kw7pzdHJpYSBnZXJhbCIpDQogICAgKSwNCg0KICAgIGNvcl9ib2xoYSA9IGRwbHlyOjppZl9lbHNlKA0KICAgICAgcmVuZGltZW50b19yZWFsID09IG1pbihyZW5kaW1lbnRvX3JlYWwpLA0KICAgICAgdW5uYW1lKGNvcmVzX2libWFjcm9bImFtYXJlbG8iXSksDQogICAgICB1bm5hbWUoY29yZXNfaWJtYWNyb1siYXp1bF9lc2N1cm8iXSkNCiAgICApDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2Uob3JkZW0pIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgc2V0b3IsDQogICAgZXhwb3J0YWNvZXNfdXNkLA0KICAgIGltcG9ydGFjb2VzX3VzZCwNCiAgICBwYXJ0aWNpcGFjYW9fZXhwb3J0YWNvZXMsDQogICAgb3JpZW50YWNhb19pbXBvcnRhZG9yYSwNCiAgICBvY3VwYWRvc19taWwsDQogICAgcmVuZGltZW50b19yZWFsLA0KICAgIGNvcl9ib2xoYQ0KICApDQoNCg0KIyA1LiBSw7N0dWxvcyBkb3Mgc2V0b3JlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0Kcm90dWxvc19zZXRvcmVzIDwtIHBhc3RlMCgNCiAgIjxkaXYgc3R5bGU9J3dpZHRoOjI0NXB4O3RleHQtYWxpZ246cmlnaHQ7Jz4iLA0KICAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzExMTgyNzsnPiIsDQogIGRhZG9zX2dyYWZpY28xJHNldG9yLA0KICAiPC9zcGFuPjxicj4iLA0KICAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiM2QjcyODA7Jz4iLA0KICBzY2FsZXM6Om51bWJlcigNCiAgICBkYWRvc19ncmFmaWNvMSRvY3VwYWRvc19taWwsDQogICAgYWNjdXJhY3kgPSAxLA0KICAgIGJpZy5tYXJrID0gIi4iLA0KICAgIGRlY2ltYWwubWFyayA9ICIsIg0KICApLA0KICAiIG1pbCBvY3VwYWRvcyB8IFIkICIsDQogIHNjYWxlczo6bnVtYmVyKA0KICAgIGRhZG9zX2dyYWZpY28xJHJlbmRpbWVudG9fcmVhbCwNCiAgICBhY2N1cmFjeSA9IDAuMDEsDQogICAgYmlnLm1hcmsgPSAiLiIsDQogICAgZGVjaW1hbC5tYXJrID0gIiwiDQogICksDQogICIgcG9yIG3DqnMiLA0KICAiPC9zcGFuPiIsDQogICI8L2Rpdj4iDQopDQoNCg0KIyA2LiBQb250b3MgZGFzIHPDqXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KcG9udG9zX2V4cG9ydGFjb2VzIDwtIGxhcHBseSgNCiAgc2VxX2xlbihucm93KGRhZG9zX2dyYWZpY28xKSksDQogIGZ1bmN0aW9uKGkpIHsNCiAgICBsaXN0KA0KICAgICAgeSA9IGRhZG9zX2dyYWZpY28xJHBhcnRpY2lwYWNhb19leHBvcnRhY29lc1tpXSwNCg0KICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgc2V0b3IgPSBkYWRvc19ncmFmaWNvMSRzZXRvcltpXSwNCiAgICAgICAgb2N1cGFkb3NfbWlsID0gZGFkb3NfZ3JhZmljbzEkb2N1cGFkb3NfbWlsW2ldLA0KICAgICAgICByZW5kaW1lbnRvX3JlYWwgPSBkYWRvc19ncmFmaWNvMSRyZW5kaW1lbnRvX3JlYWxbaV0NCiAgICAgICkNCiAgICApDQogIH0NCikNCg0KcG9udG9zX2ltcG9ydGFjb2VzIDwtIGxhcHBseSgNCiAgc2VxX2xlbihucm93KGRhZG9zX2dyYWZpY28xKSksDQogIGZ1bmN0aW9uKGkpIHsNCiAgICBsaXN0KA0KICAgICAgeSA9IGRhZG9zX2dyYWZpY28xJG9yaWVudGFjYW9faW1wb3J0YWRvcmFbaV0sDQoNCiAgICAgIGN1c3RvbSA9IGxpc3QoDQogICAgICAgIHNldG9yID0gZGFkb3NfZ3JhZmljbzEkc2V0b3JbaV0sDQogICAgICAgIG9jdXBhZG9zX21pbCA9IGRhZG9zX2dyYWZpY28xJG9jdXBhZG9zX21pbFtpXSwNCiAgICAgICAgcmVuZGltZW50b19yZWFsID0gZGFkb3NfZ3JhZmljbzEkcmVuZGltZW50b19yZWFsW2ldDQogICAgICApDQogICAgKQ0KICB9DQopDQoNCg0KIyA3LiBDb25zdHJ1w6fDo28gZG8gZ3LDoWZpY28gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpncmFmaWNvIDwtIGhpZ2hjaGFydGVyOjpoaWdoY2hhcnQoKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2hhcnQoDQogICAgdHlwZSA9ICJiYXIiLA0KICAgIGhlaWdodCA9IDQ4MCwNCiAgICBtYXJnaW5MZWZ0ID0gMzAwLA0KICAgIHNwYWNpbmdCb3R0b20gPSAzNQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY194QXhpcygNCiAgICBjYXRlZ29yaWVzID0gcm90dWxvc19zZXRvcmVzLA0KICAgIGxpbmVXaWR0aCA9IDAsDQogICAgdGlja1dpZHRoID0gMCwNCg0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICB1c2VIVE1MID0gVFJVRSwNCiAgICAgIGFsaWduID0gInJpZ2h0IiwNCiAgICAgIHggPSAtMTAsDQogICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgIGNvbG9yID0gIiMxMTE4MjciLA0KICAgICAgICBmb250U2l6ZSA9ICIxMnB4Ig0KICAgICAgKQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfeUF4aXMoDQogICAgbWluID0gMCwNCiAgICBtYXggPSAxMDAsDQogICAgdGlja0ludGVydmFsID0gMjAsDQoNCiAgICB0aXRsZSA9IGxpc3QoDQogICAgICB0ZXh0ID0gIlBlcmNlbnR1YWwgKCUpIg0KICAgICksDQoNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgZm9ybWF0ID0gInt2YWx1ZX0lIg0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3NlcmllcygNCiAgICBuYW1lID0gIlBhcnRpY2lwYcOnw6NvIG5hcyBleHBvcnRhw6fDtWVzIiwNCiAgICB0eXBlID0gImJhciIsDQogICAgZGF0YSA9IHBvbnRvc19leHBvcnRhY29lcywNCiAgICBjb2xvciA9IHVubmFtZShjb3Jlc19pYm1hY3JvWyJhbWFyZWxvIl0pLA0KICAgIGJvcmRlcldpZHRoID0gMA0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiT3JpZW50YcOnw6NvIGltcG9ydGFkb3JhIiwNCiAgICB0eXBlID0gImJhciIsDQogICAgZGF0YSA9IHBvbnRvc19pbXBvcnRhY29lcywNCiAgICBjb2xvciA9IHVubmFtZShjb3Jlc19pYm1hY3JvWyJhenVsX2VzY3VybyJdKSwNCiAgICBib3JkZXJXaWR0aCA9IDANCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfcGxvdE9wdGlvbnMoDQogICAgYmFyID0gbGlzdCgNCiAgICAgIGdyb3VwaW5nID0gVFJVRSwNCiAgICAgIGdyb3VwUGFkZGluZyA9IDAuMTgsDQogICAgICBwb2ludFBhZGRpbmcgPSAwLjA4LA0KICAgICAgYm9yZGVyV2lkdGggPSAwLA0KICAgICAgYm9yZGVyUmFkaXVzID0gNCwNCiAgICAgIG1heFBvaW50V2lkdGggPSA0MiwNCg0KICAgICAgZGF0YUxhYmVscyA9IGxpc3QoDQogICAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgICBpbnNpZGUgPSBGQUxTRSwNCiAgICAgICAgY3JvcCA9IEZBTFNFLA0KICAgICAgICBvdmVyZmxvdyA9ICJhbGxvdyIsDQoNCiAgICAgICAgZm9ybWF0dGVyID0gaGlnaGNoYXJ0ZXI6OkpTKA0KICAgICAgICAgICJmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICAgIHRoaXMueSwNCiAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgICAnLicNCiAgICAgICAgICAgICkgKyAnJSc7DQogICAgICAgICAgfSINCiAgICAgICAgKSwNCg0KICAgICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgICAgY29sb3IgPSAiIzExMTgyNyIsDQogICAgICAgICAgZm9udFNpemUgPSAiMTFweCIsDQogICAgICAgICAgZm9udFdlaWdodCA9ICJib2xkIiwNCiAgICAgICAgICB0ZXh0T3V0bGluZSA9ICJub25lIg0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190b29sdGlwKA0KICAgIHNoYXJlZCA9IFRSVUUsDQogICAgdXNlSFRNTCA9IFRSVUUsDQoNCiAgICBmb3JtYXR0ZXIgPSBoaWdoY2hhcnRlcjo6SlMoDQogICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICBjb25zdCBkYWRvcyA9IHRoaXMucG9pbnRzWzBdLnBvaW50LmN1c3RvbTsNCg0KICAgICAgICBjb25zdCBudW1lcm9CUiA9IGZ1bmN0aW9uKHZhbG9yLCBjYXNhcykgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHZhbG9yLA0KICAgICAgICAgICAgY2FzYXMsDQogICAgICAgICAgICAnLCcsDQogICAgICAgICAgICAnLicNCiAgICAgICAgICApOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IGluZGljYWRvcmVzID0gdGhpcy5wb2ludHMubWFwKGZ1bmN0aW9uKHBvbnRvKSB7DQogICAgICAgICAgcmV0dXJuICgNCiAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cImNvbG9yOicgKyBwb250by5jb2xvciArICdcIj7il488L3NwYW4+ICcgKw0KICAgICAgICAgICAgcG9udG8uc2VyaWVzLm5hbWUgKyAnOiA8Yj4nICsNCiAgICAgICAgICAgIG51bWVyb0JSKHBvbnRvLnksIDIpICsgJyU8L2I+Jw0KICAgICAgICAgICk7DQogICAgICAgIH0pLmpvaW4oJzxicj4nKTsNCg0KICAgICAgICByZXR1cm4gKA0KICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWluLXdpZHRoOjI5MHB4XCI+JyArDQogICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTNweDtmb250LXdlaWdodDpib2xkXCI+JyArDQogICAgICAgICAgICAgIGRhZG9zLnNldG9yICsNCiAgICAgICAgICAgICc8L3NwYW4+PGJyPjxicj4nICsNCiAgICAgICAgICAgIGluZGljYWRvcmVzICsNCiAgICAgICAgICAgICc8YnI+PGJyPicgKw0KICAgICAgICAgICAgJ1Blc3NvYXMgb2N1cGFkYXM6IDxiPicgKw0KICAgICAgICAgICAgICBudW1lcm9CUihkYWRvcy5vY3VwYWRvc19taWwsIDIpICsNCiAgICAgICAgICAgICAgJyBtaWw8L2I+PGJyPicgKw0KICAgICAgICAgICAgJ1JlbmRpbWVudG8gbcOpZGlvIHJlYWw6IDxiPlIkICcgKw0KICAgICAgICAgICAgICBudW1lcm9CUihkYWRvcy5yZW5kaW1lbnRvX3JlYWwsIDIpICsNCiAgICAgICAgICAgICAgJyBwb3IgbcOqczwvYj4nICsNCiAgICAgICAgICAnPC9kaXY+Jw0KICAgICAgICApOw0KICAgICAgfSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2xlZ2VuZCgNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBhbGlnbiA9ICJjZW50ZXIiLA0KICAgIHZlcnRpY2FsQWxpZ24gPSAidG9wIiwNCiAgICBsYXlvdXQgPSAiaG9yaXpvbnRhbCIsDQogICAgc3ltYm9sUmFkaXVzID0gMiwNCiAgICBpdGVtRGlzdGFuY2UgPSAzMA0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jYXB0aW9uKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiT3JpZW50YcOnw6NvIGltcG9ydGFkb3JhID0gaW1wb3J0YcOnw7VlcyBkaXZpZGlkYXMgcGVsYSAiLA0KICAgICAgImNvcnJlbnRlIGRlIGNvbcOpcmNpbyBkbyBwcsOzcHJpbyBzZXRvci4iDQogICAgKSwNCg0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkNCg0KDQojIDguIFRlbWEsIHTDrXR1bG9zLCBmb250ZSBlIGV4cG9ydGHDp8OjbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmdyYWZpY28gPC0gZmluYWxpemFyX2dyYWZpY28oDQogIGdyYWZpY28gPSBncmFmaWNvLA0KDQogIHRpdHVsbyA9IHBhc3RlMCgNCiAgICAiRXhwb3Npw6fDo28gY2FtYmlhbCBlIHBlcmZpbCBkbyB0cmFiYWxobyAiLA0KICAgICJub3Mgc2V0b3JlcyB0cmFuc2FjaW9uw6F2ZWlzIg0KICApLA0KDQogIHN1YnRpdHVsbyA9IHBhc3RlMCgNCiAgICAiSW5kaWNhZG9yZXMgZGUgY29tw6lyY2lvIGV4dGVyaW9yLCBvY3VwYcOnw6NvIGUgIiwNCiAgICAicmVuZGltZW50byBtw6lkaW8gcmVhbCDigJQgQnJhc2lsLCAyMDI1Ig0KICApLA0KDQogIGZvbnRlID0gcGFzdGUwKA0KICAgICJNRElDL0NvbWV4IFN0YXQgZSBJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyAiLA0KICAgICJTSURSQSA0MzYyIGUgNTQ0MiINCiAgKSwNCg0KICBub21lX2FycXVpdm8gPSAiZXhwb3NpY2FvLWNhbWJpYWwtZS10cmFiYWxoby0yMDI1Ig0KKQ0KDQoNCiMgOS4gRXhpYmnDp8OjbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpncmFmaWNvDQoNCmBgYA0KDQpPIEdyw6FmaWNvIDIuMSBtb3N0cmEgcXVlIGEgSW5kw7pzdHJpYSBnZXJhbCByZXNwb25kZXUgcG9yIDc3LDYlIGRhcyBleHBvcnRhw6fDtWVzIGRvcyBkb2lzIHNldG9yZXMgYW5hbGlzYWRvcyBlbSAyMDI1LCBlbnF1YW50byBhIEFncm9wZWN1w6FyaWEgY29uY2VudHJvdSAyMiw0JS4gQSBkaWZlcmVuw6dhIHNlIHRvcm5hIGFpbmRhIG1haXMgaW1wb3J0YW50ZSBxdWFuZG8gc2Ugb2JzZXJ2YSBhIG9yaWVudGHDp8OjbyBpbXBvcnRhZG9yYS4gTmEgQWdyb3BlY3XDoXJpYSwgYXMgaW1wb3J0YcOnw7VlcyByZXByZXNlbnRhcmFtIGFwZW5hcyA3LDIlIGRhIGNvcnJlbnRlIGRlIGNvbcOpcmNpbywgYW8gcGFzc28gcXVlLCBuYSBJbmTDunN0cmlhIGdlcmFsLCBjaGVnYXJhbSBhIDUwLDMlLCBwcmF0aWNhbWVudGUgbyBwb250byBkZSBlcXVpbMOtYnJpbyBlbnRyZSBjb21wcmFzIGUgdmVuZGFzIGV4dGVybmFzLg0KDQpFc3NhIGNvbmZpZ3VyYcOnw6NvIGluZGljYSBxdWUgYSBBZ3JvcGVjdcOhcmlhIGFwcmVzZW50YSB1bWEgZXhwb3Npw6fDo28gY29tZXJjaWFsIG1haXMgZmF2b3LDoXZlbCBhb3MgZ2FuaG9zIGRlIHVtYSBkZXN2YWxvcml6YcOnw6NvLCBwb3JxdWUgdmVuZGUgYW8gZXh0ZXJpb3IgZSBpbXBvcnRhIHJlbGF0aXZhbWVudGUgcG91Y28uIEEgSW5kw7pzdHJpYSBnZXJhbCB0YW1iw6ltIHBvZGUgZ2FuaGFyIGNvbXBldGl0aXZpZGFkZSBjb20gbyByZWFsIG1haXMgZnJhY28sIG1hcyBlbmZyZW50YSB1bWEgcHJlc3PDo28gbWFpb3IgcGVsbyBsYWRvIGRhcyBpbXBvcnRhw6fDtWVzLCBzb2JyZXR1ZG8gcXVhbmRvIHV0aWxpemEgbcOhcXVpbmFzLCBjb21wb25lbnRlcyBlIGJlbnMgaW50ZXJtZWRpw6FyaW9zIGVzdHJhbmdlaXJvcy4gTyBzZXRvciBpbmR1c3RyaWFsIGFpbmRhIHJldW5pYSAxMywzIG1pbGjDtWVzIGRlIG9jdXBhZG9zIGUgcmVuZGltZW50byBtw6lkaW8gcmVhbCBkZSBSJCAzLjUwNCw1MCwgZGlhbnRlIGRlIDcsOSBtaWxow7VlcyBkZSB0cmFiYWxoYWRvcmVzIGUgcmVuZGltZW50byBkZSBSJCAyLjMwNyw3NSBuYSBBZ3JvcGVjdcOhcmlhLCBvIHF1ZSBhbXBsaWEgbyBhbGNhbmNlIGRhcyBtdWRhbsOnYXMgaW5kdXN0cmlhaXMgc29icmUgbyBtZXJjYWRvIGRlIHRyYWJhbGhvLg0KDQoNCiMjIDIuMiBDw6JtYmlvIHJlYWwgZSBuw612ZWwgZGUgZW1wcmVnbw0KDQpEZXBvaXMgZGUgb2JzZXJ2YXIgYSBleHBvc2nDp8OjbyBjb21lcmNpYWwsIMOpIG5lY2Vzc8OhcmlvIGFjb21wYW5oYXIgY29tbyBvIGVtcHJlZ28gZG9zIGRvaXMgc2V0b3JlcyBzZSBjb21wb3J0b3UgYW8gbG9uZ28gZGFzIG11ZGFuw6dhcyBkYSB0YXhhIGRlIGPDom1iaW8gZWZldGl2YSByZWFsLiBFc3NhIG1lZGlkYSBjb25zaWRlcmEgYSByZWxhw6fDo28gZG8gcmVhbCBjb20gYXMgbW9lZGFzIGRvcyBwcmluY2lwYWlzIHBhcmNlaXJvcyBjb21lcmNpYWlzIGUgdGFtYsOpbSBjb3JyaWdlIGFzIGRpZmVyZW7Dp2FzIGRlIHByZcOnb3MgZW50cmUgb3MgcGHDrXNlcy4gVmFsb3JlcyBtYWlvcmVzIHJlcHJlc2VudGFtIGRlcHJlY2lhw6fDo28gcmVhbCBkbyByZWFsLCBlbnF1YW50byB2YWxvcmVzIG1lbm9yZXMgaW5kaWNhbSBhcHJlY2lhw6fDo28uDQoNCkNvbW8gbyBjw6JtYmlvIGUgbyBuw7ptZXJvIGRlIHBlc3NvYXMgb2N1cGFkYXMgcG9zc3VlbSB1bmlkYWRlcyBkaWZlcmVudGVzLCBhcyBzw6lyaWVzIGZvcmFtIHRyYW5zZm9ybWFkYXMgZW0gw61uZGljZXMgY29tIGJhc2UgZW0gMjAxMiBpZ3VhbCBhIDEwMC4gRXNzYSBjb252ZXJzw6NvIHByZXNlcnZhIGEgdmFyaWHDp8OjbyBkZSBjYWRhIHPDqXJpZSBlIHBlcm1pdGUgY29tcGFyYXIgc3VhcyB0cmFqZXTDs3JpYXMgc2VtIHJlY29ycmVyIGEgdW0gc2VndW5kbyBlaXhvOg0KDQokJA0KSV97dix0fSA9DQpcZnJhY3tWX3R9DQp7Vl97MjAxMn19DQpcdGltZXMgMTAwDQokJA0KDQplbSBxdWUgJFZfdCQgcmVwcmVzZW50YSBvIHZhbG9yIGRhIHZhcmnDoXZlbCBubyBhbm8gJHQkLCBwb2RlbmRvIGNvcnJlc3BvbmRlciDDoCB0YXhhIGRlIGPDom1iaW8gZWZldGl2YSByZWFsIG91IGFvIG7Dum1lcm8gZGUgcGVzc29hcyBvY3VwYWRhcyBlbSBjYWRhIHNldG9yLg0KDQoNCioqR3LDoWZpY28gMi4yIOKAlCBDw6JtYmlvIHJlYWwgZSBlbXByZWdvIG5vcyBzZXRvcmVzIHRyYW5zYWNpb27DoXZlaXMqKg0KDQpgYGB7ciBwMi1jYW1iaW8tZW1wcmVnbywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyAxLiBJbXBvcnRhw6fDo28gZG9zIGRhZG9zIGRlIGVtcHJlZ28NCg0KZW1wcmVnb19icnV0byA8LSByZWFkeGw6OnJlYWRfZXhjZWwoDQogIHBhdGggPSAiRGFkb3Muc2lkcmEueGxzeCIsDQogIHNoZWV0ID0gIlRhYmVsYSIsDQogIGNvbF9uYW1lcyA9IEZBTFNFDQopDQoNCiMgMi4gVHJhdGFtZW50byBkYSBwbGFuaWxoYSBTSURSQSA0MzYyDQoNCmFub3NfcGxhbmlsaGEgPC0gYXMuY2hhcmFjdGVyKA0KICB1bmxpc3QoZW1wcmVnb19icnV0b1s0LCBdLCB1c2UubmFtZXMgPSBGQUxTRSkNCikNCg0KY29sdW5hc19hbm9zIDwtIHdoaWNoKA0KICBhbm9zX3BsYW5pbGhhICVpbiUgYXMuY2hhcmFjdGVyKDIwMTI6MjAyNSkNCikNCg0KZW1wcmVnb190YWJlbGEgPC0gZW1wcmVnb19icnV0b1ssIGMoMiwgY29sdW5hc19hbm9zKV0NCg0KbmFtZXMoZW1wcmVnb190YWJlbGEpIDwtIGMoDQogICJzZXRvcl9vcmlnaW5hbCIsDQogIGFub3NfcGxhbmlsaGFbY29sdW5hc19hbm9zXQ0KKQ0KDQplbXByZWdvX2FudWFsIDwtIGVtcHJlZ29fdGFiZWxhIHw+DQogIHRpZHlyOjpwaXZvdF9sb25nZXIoDQogICAgY29scyA9IC1zZXRvcl9vcmlnaW5hbCwNCiAgICBuYW1lc190byA9ICJhbm8iLA0KICAgIHZhbHVlc190byA9ICJvY3VwYWRvc19taWwiDQogICkgfD4NCiAgZHBseXI6OmZpbHRlcigNCiAgICBzZXRvcl9vcmlnaW5hbCAlaW4lIGMoDQogICAgICAiQWdyaWN1bHR1cmEsIHBlY3XDoXJpYSwgcHJvZHXDp8OjbyBmbG9yZXN0YWwsIHBlc2NhIGUgYXF1aWN1bHR1cmEiLA0KICAgICAgIkluZMO6c3RyaWEgZ2VyYWwiDQogICAgKQ0KICApIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgYW5vID0gYXMuaW50ZWdlcihhbm8pLA0KICAgIG9jdXBhZG9zX21pbCA9IGFzLm51bWVyaWMob2N1cGFkb3NfbWlsKSwNCiAgICBpbmRpY2Fkb3JfZW1wcmVnbyA9IGRwbHlyOjpyZWNvZGUoDQogICAgICBzZXRvcl9vcmlnaW5hbCwNCiAgICAgICJBZ3JpY3VsdHVyYSwgcGVjdcOhcmlhLCBwcm9kdcOnw6NvIGZsb3Jlc3RhbCwgcGVzY2EgZSBhcXVpY3VsdHVyYSIgPQ0KICAgICAgICAib2N1cGFkb3NfYWdyb19taWwiLA0KICAgICAgIkluZMO6c3RyaWEgZ2VyYWwiID0NCiAgICAgICAgIm9jdXBhZG9zX2luZHVzdHJpYV9taWwiDQogICAgKQ0KICApIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgYW5vLA0KICAgIGluZGljYWRvcl9lbXByZWdvLA0KICAgIG9jdXBhZG9zX21pbA0KICApIHw+DQogIHRpZHlyOjpwaXZvdF93aWRlcigNCiAgICBuYW1lc19mcm9tID0gaW5kaWNhZG9yX2VtcHJlZ28sDQogICAgdmFsdWVzX2Zyb20gPSBvY3VwYWRvc19taWwNCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShhbm8pDQoNCnN0b3BpZm5vdCgNCiAgIkEgcGxhbmlsaGEgZGUgZW1wcmVnbyBuw6NvIGNvbnTDqW0gdG9kb3Mgb3MgYW5vcyBkZSAyMDEyIGEgMjAyNS4iID0NCiAgICBucm93KGVtcHJlZ29fYW51YWwpID09IDE0ICYmDQogICAgYWxsKGFzLmludGVnZXIoZW1wcmVnb19hbnVhbCRhbm8pID09IDIwMTI6MjAyNSksDQogICJFeGlzdGVtIHZhbG9yZXMgYXVzZW50ZXMgbm9zIGRhZG9zIGRlIGVtcHJlZ28uIiA9DQogICAgIWFueU5BKGVtcHJlZ29fYW51YWwpDQopDQoNCiMgMy4gQ29sZXRhIGRhIHRheGEgZGUgY8OibWJpbyBlZmV0aXZhIHJlYWwNCg0KY2FtYmlvX21lbnNhbCA8LSBHZXRCQ0JEYXRhOjpnYmNiZF9nZXRfc2VyaWVzKA0KICBpZCA9IDExNzUyLA0KICBmaXJzdC5kYXRlID0gYXMuRGF0ZSgiMjAxMi0wMS0wMSIpLA0KICBsYXN0LmRhdGUgPSBhcy5EYXRlKCIyMDI1LTEyLTMxIiksDQogIGZvcm1hdC5kYXRhID0gImxvbmciLA0KICBiZS5xdWlldCA9IFRSVUUNCikgfD4NCiAgZHBseXI6OnRyYW5zbXV0ZSgNCiAgICBkYXRhID0gYXMuRGF0ZShyZWYuZGF0ZSksDQogICAgYW5vID0gYXMuaW50ZWdlcihsdWJyaWRhdGU6OnllYXIocmVmLmRhdGUpKSwNCiAgICBjYW1iaW9fcmVhbCA9IGFzLm51bWVyaWModmFsdWUpDQogICkgfD4NCiAgZHBseXI6OmZpbHRlcigNCiAgICBhbm8gPj0gMjAxMiwNCiAgICBhbm8gPD0gMjAyNQ0KICApIHw+DQogIGRwbHlyOjpkaXN0aW5jdCgNCiAgICBkYXRhLA0KICAgIC5rZWVwX2FsbCA9IFRSVUUNCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShkYXRhKQ0KDQptZXNlc19wb3JfYW5vIDwtIGNhbWJpb19tZW5zYWwgfD4NCiAgZHBseXI6OmNvdW50KGFubywgbmFtZSA9ICJudW1lcm9fbWVzZXMiKQ0KDQpzdG9waWZub3QoDQogICJFeGlzdGVtIHZhbG9yZXMgYXVzZW50ZXMgbmEgc8OpcmllIFNHUyAxMTc1Mi4iID0NCiAgICAhYW55TkEoY2FtYmlvX21lbnNhbCksDQogICJBIHPDqXJpZSBTR1MgMTE3NTIgbsOjbyBjb250w6ltIHRvZG9zIG9zIGFub3MgZGUgMjAxMiBhIDIwMjUuIiA9DQogICAgbnJvdyhtZXNlc19wb3JfYW5vKSA9PSAxNCAmJg0KICAgIGFsbChhcy5pbnRlZ2VyKG1lc2VzX3Bvcl9hbm8kYW5vKSA9PSAyMDEyOjIwMjUpLA0KICAiQSBzw6lyaWUgU0dTIDExNzUyIG7Do28gY29udMOpbSBkb3plIG9ic2VydmHDp8O1ZXMgbWVuc2FpcyBlbSB0b2RvcyBvcyBhbm9zLiIgPQ0KICAgIGFsbChtZXNlc19wb3JfYW5vJG51bWVyb19tZXNlcyA9PSAxMikNCikNCg0KIyA0LiBDw6FsY3VsbyBkYXMgbcOpZGlhcyBhbnVhaXMNCg0KY2FtYmlvX2FudWFsIDwtIGNhbWJpb19tZW5zYWwgfD4NCiAgZHBseXI6Omdyb3VwX2J5KGFubykgfD4NCiAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICBjYW1iaW9fcmVhbF9tZWRpbyA9IG1lYW4oY2FtYmlvX3JlYWwpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShhbm8pDQoNCiMgNS4gSW5kZXhhw6fDo28gZGFzIHRyw6pzIHPDqXJpZXMNCg0KYmFzZV9jYW1iaW9fMjAxMiA8LSBjYW1iaW9fYW51YWwgfD4NCiAgZHBseXI6OmZpbHRlcihhbm8gPT0gMjAxMikgfD4NCiAgZHBseXI6OnB1bGwoY2FtYmlvX3JlYWxfbWVkaW8pDQoNCmJhc2VfYWdyb18yMDEyIDwtIGVtcHJlZ29fYW51YWwgfD4NCiAgZHBseXI6OmZpbHRlcihhbm8gPT0gMjAxMikgfD4NCiAgZHBseXI6OnB1bGwob2N1cGFkb3NfYWdyb19taWwpDQoNCmJhc2VfaW5kdXN0cmlhXzIwMTIgPC0gZW1wcmVnb19hbnVhbCB8Pg0KICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKSB8Pg0KICBkcGx5cjo6cHVsbChvY3VwYWRvc19pbmR1c3RyaWFfbWlsKQ0KDQpjYW1iaW9fYW51YWwgPC0gY2FtYmlvX2FudWFsIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgaW5kaWNlX2NhbWJpbyA9DQogICAgICBjYW1iaW9fcmVhbF9tZWRpbyAvIGJhc2VfY2FtYmlvXzIwMTIgKiAxMDANCiAgKQ0KDQplbXByZWdvX2FudWFsIDwtIGVtcHJlZ29fYW51YWwgfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBpbmRpY2VfZW1wcmVnb19hZ3JvID0NCiAgICAgIG9jdXBhZG9zX2Fncm9fbWlsIC8gYmFzZV9hZ3JvXzIwMTIgKiAxMDAsDQogICAgaW5kaWNlX2VtcHJlZ29faW5kdXN0cmlhID0NCiAgICAgIG9jdXBhZG9zX2luZHVzdHJpYV9taWwgLyBiYXNlX2luZHVzdHJpYV8yMDEyICogMTAwDQogICkNCg0KIyA2LiBKdW7Dp8OjbyBlIHZhbGlkYcOnw6NvDQoNCmRhZG9zX2dyYWZpY28yIDwtIGRwbHlyOjpmdWxsX2pvaW4oDQogIGNhbWJpb19hbnVhbCwNCiAgZW1wcmVnb19hbnVhbCwNCiAgYnkgPSAiYW5vIg0KKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGFubywNCiAgICBjYW1iaW9fcmVhbF9tZWRpbywNCiAgICBvY3VwYWRvc19hZ3JvX21pbCwNCiAgICBvY3VwYWRvc19pbmR1c3RyaWFfbWlsLA0KICAgIGluZGljZV9jYW1iaW8sDQogICAgaW5kaWNlX2VtcHJlZ29fYWdybywNCiAgICBpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWENCiAgKSB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIGFubyA9IGFzLmludGVnZXIoYW5vKQ0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKGFubykNCg0KaW5kaWNlc18yMDEyIDwtIGRhZG9zX2dyYWZpY28yIHw+DQogIGRwbHlyOjpmaWx0ZXIoYW5vID09IDIwMTIpIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgaW5kaWNlX2NhbWJpbywNCiAgICBpbmRpY2VfZW1wcmVnb19hZ3JvLA0KICAgIGluZGljZV9lbXByZWdvX2luZHVzdHJpYQ0KICApIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZmluYWwgbsOjbyBwb3NzdWkgZXhhdGFtZW50ZSAxNCBhbm9zLiIgPQ0KICAgIG5yb3coZGFkb3NfZ3JhZmljbzIpID09IDE0LA0KICAiTyBvYmpldG8gZmluYWwgbsOjbyBjb250w6ltIHRvZG9zIG9zIGFub3MgZGUgMjAxMiBhIDIwMjUuIiA9DQogICAgYWxsKGFzLmludGVnZXIoZGFkb3NfZ3JhZmljbzIkYW5vKSA9PSAyMDEyOjIwMjUpLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIGRlcG9pcyBkYSBqdW7Dp8OjbyBkYXMgYmFzZXMuIiA9DQogICAgIWFueU5BKGRhZG9zX2dyYWZpY28yKSwNCiAgIlVtYSBvdSBtYWlzIHPDqXJpZXMgbsOjbyBwb3NzdWVtIMOtbmRpY2UgaWd1YWwgYSAxMDAgZW0gMjAxMi4iID0NCiAgICBsZW5ndGgoaW5kaWNlc18yMDEyKSA9PSAzICYmDQogICAgYWxsKGFicyhpbmRpY2VzXzIwMTIgLSAxMDApIDwgMWUtOCkNCikNCg0KdmFsb3Jlc19pbmRpY2VzIDwtIGRhZG9zX2dyYWZpY28yIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgaW5kaWNlX2NhbWJpbywNCiAgICBpbmRpY2VfZW1wcmVnb19hZ3JvLA0KICAgIGluZGljZV9lbXByZWdvX2luZHVzdHJpYQ0KICApIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0KbGltaXRlX2luZmVyaW9yIDwtIGZsb29yKA0KICAobWluKHZhbG9yZXNfaW5kaWNlcykgLSA1KSAvIDUNCikgKiA1DQoNCmxpbWl0ZV9zdXBlcmlvciA8LSBjZWlsaW5nKA0KICAobWF4KHZhbG9yZXNfaW5kaWNlcykgKyA1KSAvIDUNCikgKiA1DQoNCmNyaWFyX3BvbnRvcyA8LSBmdW5jdGlvbih2YXJpYXZlbF9pbmRpY2UpIHsNCiAgbGFwcGx5KHNlcV9sZW4obnJvdyhkYWRvc19ncmFmaWNvMikpLCBmdW5jdGlvbihpKSB7DQogICAgbGlzdCgNCiAgICAgIHkgPSBkYWRvc19ncmFmaWNvMltbdmFyaWF2ZWxfaW5kaWNlXV1baV0sDQogICAgICBjdXN0b20gPSBsaXN0KA0KICAgICAgICBhbm8gPSBkYWRvc19ncmFmaWNvMiRhbm9baV0sDQogICAgICAgIGluZGljZV9jYW1iaW8gPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY28yJGluZGljZV9jYW1iaW9baV0sDQogICAgICAgIGNhbWJpb19yZWFsX21lZGlvID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvMiRjYW1iaW9fcmVhbF9tZWRpb1tpXSwNCiAgICAgICAgaW5kaWNlX2VtcHJlZ29fYWdybyA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzIkaW5kaWNlX2VtcHJlZ29fYWdyb1tpXSwNCiAgICAgICAgb2N1cGFkb3NfYWdyb19taWwgPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY28yJG9jdXBhZG9zX2Fncm9fbWlsW2ldLA0KICAgICAgICBpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWEgPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY28yJGluZGljZV9lbXByZWdvX2luZHVzdHJpYVtpXSwNCiAgICAgICAgb2N1cGFkb3NfaW5kdXN0cmlhX21pbCA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzIkb2N1cGFkb3NfaW5kdXN0cmlhX21pbFtpXQ0KICAgICAgKQ0KICAgICkNCiAgfSkNCn0NCg0KcG9udG9zX2NhbWJpbyA8LSBjcmlhcl9wb250b3MoImluZGljZV9jYW1iaW8iKQ0KcG9udG9zX2Fncm8gPC0gY3JpYXJfcG9udG9zKCJpbmRpY2VfZW1wcmVnb19hZ3JvIikNCnBvbnRvc19pbmR1c3RyaWEgPC0gY3JpYXJfcG9udG9zKCJpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWEiKQ0KDQojIDcuIENvbnN0cnXDp8OjbyBkbyBncsOhZmljbw0KDQpncmFmaWNvIDwtIGhpZ2hjaGFydGVyOjpoaWdoY2hhcnQoKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2hhcnQoDQogICAgdHlwZSA9ICJsaW5lIiwNCiAgICBoZWlnaHQgPSA1MDAsDQogICAgYmFja2dyb3VuZENvbG9yID0gIiNGRkZGRkYiLA0KICAgIHNwYWNpbmdCb3R0b20gPSA0NQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiVGF4YSBkZSBjw6JtYmlvIGVmZXRpdmEgcmVhbCIsDQogICAgZGF0YSA9IHBvbnRvc19jYW1iaW8sDQogICAgY29sb3IgPSB1bm5hbWUoDQogICAgICBjb3Jlc19pYm1hY3JvWyJhenVsX2VzY3VybyJdDQogICAgKSwNCiAgICBsaW5lV2lkdGggPSAyLjUsDQogICAgbWFya2VyID0gbGlzdCgNCiAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgcmFkaXVzID0gMi41LA0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiRW1wcmVnbyBuYSBBZ3JvcGVjdcOhcmlhIiwNCiAgICBkYXRhID0gcG9udG9zX2Fncm8sDQogICAgY29sb3IgPSB1bm5hbWUoDQogICAgICBjb3Jlc19pYm1hY3JvWyJhbWFyZWxvIl0NCiAgICApLA0KICAgIGxpbmVXaWR0aCA9IDIuNSwNCiAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICByYWRpdXMgPSAyLjUsDQogICAgICBzeW1ib2wgPSAiY2lyY2xlIiwNCiAgICAgIHN0YXRlcyA9IGxpc3QoDQogICAgICAgIGhvdmVyID0gbGlzdCgNCiAgICAgICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgICAgICByYWRpdXMgPSA1DQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJFbXByZWdvIG5hIEluZMO6c3RyaWEgZ2VyYWwiLA0KICAgIGRhdGEgPSBwb250b3NfaW5kdXN0cmlhLA0KICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgY29yZXNfaWJtYWNyb1siYXp1bF9jbGFybyJdDQogICAgKSwNCiAgICBsaW5lV2lkdGggPSAyLjUsDQogICAgbWFya2VyID0gbGlzdCgNCiAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgcmFkaXVzID0gMi41LA0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApDQoNCiMgOC4gRm9ybWF0YcOnw6NvDQoNCmdyYWZpY28gPC0gZ3JhZmljbyB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3RoZW1lKA0KICAgIHRlbWFfaWJtYWNybw0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190aXRsZSgNCiAgICB0ZXh0ID0gIkPDom1iaW8gcmVhbCBlIGVtcHJlZ28gbm9zIHNldG9yZXMgdHJhbnNhY2lvbsOhdmVpcyINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfc3VidGl0bGUoDQogICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICJUYXhhIGRlIGPDom1iaW8gZWZldGl2YSByZWFsIGUgcGVzc29hcyBvY3VwYWRhcyBwb3Igc2V0b3Ig4oCUICIsDQogICAgICAiw61uZGljZXMgMjAxMiA9IDEwMCwgQnJhc2lsLCAyMDEy4oCTMjAyNSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3hBeGlzKA0KICAgIGNhdGVnb3JpZXMgPSBhcy5jaGFyYWN0ZXIoZGFkb3NfZ3JhZmljbzIkYW5vKSwNCiAgICB0aXRsZSA9IGxpc3QoDQogICAgICB0ZXh0ID0gIkFubyINCiAgICApLA0KICAgIHRpY2tJbnRlcnZhbCA9IDEsDQogICAgdGlja21hcmtQbGFjZW1lbnQgPSAib24iLA0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICByb3RhdGlvbiA9IDAsDQogICAgICBzdGVwID0gMQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfeUF4aXMoDQogICAgdGl0bGUgPSBsaXN0KA0KICAgICAgdGV4dCA9ICLDjW5kaWNlICgyMDEyID0gMTAwKSINCiAgICApLA0KICAgIG1pbiA9IGxpbWl0ZV9pbmZlcmlvciwNCiAgICBtYXggPSBsaW1pdGVfc3VwZXJpb3IsDQogICAgc3RhcnRPblRpY2sgPSBGQUxTRSwNCiAgICBlbmRPblRpY2sgPSBGQUxTRSwNCiAgICBwbG90TGluZXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgdmFsdWUgPSAxMDAsDQogICAgICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgICAgIGNvcmVzX2libWFjcm9bImNpbnphIl0NCiAgICAgICAgKSwNCiAgICAgICAgZGFzaFN0eWxlID0gIlNob3J0RG90IiwNCiAgICAgICAgd2lkdGggPSAxLA0KICAgICAgICB6SW5kZXggPSAxLA0KICAgICAgICBsYWJlbCA9IGxpc3QoDQogICAgICAgICAgdGV4dCA9ICJCYXNlIDIwMTIiLA0KICAgICAgICAgIGFsaWduID0gInJpZ2h0IiwNCiAgICAgICAgICB4ID0gLTgsDQogICAgICAgICAgeSA9IC03LA0KICAgICAgICAgIHN0eWxlID0gbGlzdCgNCiAgICAgICAgICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgICAgICAgICBjb3Jlc19pYm1hY3JvWyJjaW56YSJdDQogICAgICAgICAgICApLA0KICAgICAgICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICAgICAgICApDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Bsb3RPcHRpb25zKA0KICAgIHNlcmllcyA9IGxpc3QoDQogICAgICBhbmltYXRpb24gPSBUUlVFLA0KICAgICAgc2hhZG93ID0gRkFMU0UsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBpbmFjdGl2ZSA9IGxpc3QoDQogICAgICAgICAgb3BhY2l0eSA9IDAuMzUNCiAgICAgICAgKSwNCiAgICAgICAgaG92ZXIgPSBsaXN0KA0KICAgICAgICAgIGxpbmVXaWR0aFBsdXMgPSAxDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gVFJVRSwNCiAgICB1c2VIVE1MID0gVFJVRSwNCiAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICBjb25zdCBkID0gdGhpcy5wb2ludHNbMF0ucG9pbnQuY3VzdG9tOw0KDQogICAgICAgIGNvbnN0IG5mID0gZnVuY3Rpb24odmFsb3IpIHsNCiAgICAgICAgICByZXR1cm4gSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICB2YWxvciwNCiAgICAgICAgICAgIDIsDQogICAgICAgICAgICAnLCcsDQogICAgICAgICAgICAnLicNCiAgICAgICAgICApOw0KICAgICAgICB9Ow0KDQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgJzxkaXYgc3R5bGU9XCJtaW4td2lkdGg6MzAwcHg7cGFkZGluZzo0cHggMnB4O1wiPicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OmJvbGQ7JyArDQogICAgICAgICAgICAgICdtYXJnaW4tYm90dG9tOjhweDtjb2xvcjojMTExODI3O1wiPicgKw0KICAgICAgICAgICAgICBkLmFubyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCI+JyArDQogICAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7XCI+JyArDQogICAgICAgICAgICAgICAgJ1RheGEgZGUgY8OibWJpbyBlZmV0aXZhIHJlYWwnICsNCiAgICAgICAgICAgICAgJzwvc3Bhbj48YnI+JyArDQogICAgICAgICAgICAgICfDjW5kaWNlOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLmluZGljZV9jYW1iaW8pICsNCiAgICAgICAgICAgICAgJzwvYj48YnI+JyArDQogICAgICAgICAgICAgICdWYWxvciBvcmlnaW5hbDogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5jYW1iaW9fcmVhbF9tZWRpbykgKw0KICAgICAgICAgICAgICAnPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPicgKw0KICAgICAgICAgICAgICAgICdFbXByZWdvIG5hIEFncm9wZWN1w6FyaWEnICsNCiAgICAgICAgICAgICAgJzwvc3Bhbj48YnI+JyArDQogICAgICAgICAgICAgICfDjW5kaWNlOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLmluZGljZV9lbXByZWdvX2Fncm8pICsNCiAgICAgICAgICAgICAgJzwvYj48YnI+JyArDQogICAgICAgICAgICAgICdPY3VwYWRvczogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5vY3VwYWRvc19hZ3JvX21pbCkgKw0KICAgICAgICAgICAgICAgICcgbWlsIHBlc3NvYXM8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2PicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPicgKw0KICAgICAgICAgICAgICAgICdFbXByZWdvIG5hIEluZMO6c3RyaWEgZ2VyYWwnICsNCiAgICAgICAgICAgICAgJzwvc3Bhbj48YnI+JyArDQogICAgICAgICAgICAgICfDjW5kaWNlOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLmluZGljZV9lbXByZWdvX2luZHVzdHJpYSkgKw0KICAgICAgICAgICAgICAnPC9iPjxicj4nICsNCiAgICAgICAgICAgICAgJ09jdXBhZG9zOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLm9jdXBhZG9zX2luZHVzdHJpYV9taWwpICsNCiAgICAgICAgICAgICAgICAnIG1pbCBwZXNzb2FzPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgJzwvZGl2PicNCiAgICAgICAgKTsNCiAgICAgIH0iDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19sZWdlbmQoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiLA0KICAgIGFsaWduID0gImNlbnRlciIsDQogICAgdmVydGljYWxBbGlnbiA9ICJ0b3AiLA0KICAgIHkgPSA1NSwNCiAgICBmbG9hdGluZyA9IEZBTFNFLA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSBOVUxMDQogICAgKSwNCiAgICBzeW1ib2xXaWR0aCA9IDI0LA0KICAgIGl0ZW1EaXN0YW5jZSA9IDIwDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2NhcHRpb24oDQogICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICJOb3RhOiBhcyBzw6lyaWVzIGZvcmFtIHRyYW5zZm9ybWFkYXMgZW0gw61uZGljZXMgY29tIGJhc2UgZW0gMjAxMiA9IDEwMC4gIiwNCiAgICAgICJWYWxvcmVzIG1haW9yZXMgZGEgdGF4YSBkZSBjw6JtYmlvIGVmZXRpdmEgcmVhbCBpbmRpY2FtIGRlcHJlY2lhw6fDo28gcmVhbCBkbyByZWFsLiINCiAgICApLA0KICAgIGFsaWduID0gImxlZnQiLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2V4cG9ydGluZygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBmaWxlbmFtZSA9ICJjYW1iaW8tcmVhbC1lLWVtcHJlZ28tc2V0b3JpYWwtMjAxMi0yMDI1Ig0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jcmVkaXRzKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiRm9udGU6IEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIOKAkyBTR1MgMTE3NTIgZSAiLA0KICAgICAgIklCR0UvUE5BRCBDb250w61udWEg4oCTIFNJRFJBIDQzNjIuICIsDQogICAgICAiRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICAgICksDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzZCNzI4MCIsDQogICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICkNCiAgKQ0KDQojIDkuIEV4aWJpw6fDo28NCg0KZ3JhZmljbw0KDQpgYGANCg0KQSB0cmFqZXTDs3JpYSBtb3N0cmEgcXVlIGEgZGVwcmVjaWHDp8OjbyByZWFsIGRvIGPDom1iaW8gbsOjbyBzZSBjb252ZXJ0ZXUgYXV0b21hdGljYW1lbnRlIGVtIG1haXMgZW1wcmVnb3MuIEVudHJlIDIwMTQgZSAyMDE2LCBvIMOtbmRpY2UgY2FtYmlhbCBwYXNzb3UgZGUgYXByb3hpbWFkYW1lbnRlIDEwOSBwYXJhIDEyNiwgZGVwb2lzIGRlIGFsY2Fuw6dhciAxMzMgZW0gMjAxNSwgZW5xdWFudG8gbyBlbXByZWdvIGFncm9wZWN1w6FyaW8gcmVjdW91IHBhcmEgODcsOCBlIG8gaW5kdXN0cmlhbCBjYWl1IHBhcmEgODgsOC4gQSByZWNlc3PDo28gYnJhc2lsZWlyYSBkYXF1ZWxlIHBlcsOtb2RvIHJlZHV6aXUgYSBkZW1hbmRhIGUgYSBwcm9kdcOnw6NvLCBsaW1pdGFuZG8gb3MgcG9zc8OtdmVpcyBnYW5ob3MgY2FtYmlhaXMuIEVtIDIwMjAgZSAyMDIxLCBvIGPDom1iaW8gY2hlZ291IGFvcyBtYWlvcmVzIG7DrXZlaXMgZGEgc8OpcmllLCBwcsOzeGltb3MgZGUgMTY3IGUgMTcyLCBtYXMgYSBwYW5kZW1pYSBwcm92b2NvdSB1bWEgcXVlZGEgaW50ZW5zYSBkbyBlbXByZWdvLCBzb2JyZXR1ZG8gbmEgSW5kw7pzdHJpYSBnZXJhbC4NCg0KQSBwYXJ0aXIgZGUgMjAyMiwgbyBjw6JtYmlvIHJlYWwgcGVyZGV1IHBhcnRlIGRhIGFsdGEgYW50ZXJpb3IsIHBvcsOpbSBvIGVtcHJlZ28gaW5kdXN0cmlhbCBzZSByZWN1cGVyb3UgZSBhbGNhbsOnb3UgMTAyLDcgZW0gMjAyNSwgbGlnZWlyYW1lbnRlIGFjaW1hIGRhIGJhc2UgZGUgMjAxMi4gTmEgQWdyb3BlY3XDoXJpYSBvY29ycmV1IG8gY29udHLDoXJpby4gTyBuw7ptZXJvIGRlIG9jdXBhZG9zIHRlcm1pbm91IG8gcGVyw61vZG8gZW0gNzcsNywgZW1ib3JhIG8gc2V0b3IgZm9zc2UgZXhwb3J0YWRvciBlIHBvdWNvIG9yaWVudGFkbyDDoHMgaW1wb3J0YcOnw7Vlcy4gQSByZWR1w6fDo28gc3VnZXJlIHF1ZSBwcm9kdXRpdmlkYWRlLCBtZWNhbml6YcOnw6NvIGUgcmVvcmdhbml6YcOnw6NvIGRhIHByb2R1w6fDo28gcG9kZW0gcGVybWl0aXIgYXVtZW50byBvdSBtYW51dGVuw6fDo28gZGEgcHJvZHXDp8OjbyBzZW0gZXhwYW5zw6NvIGVxdWl2YWxlbnRlIGRvIG7Dum1lcm8gZGUgdHJhYmFsaGFkb3Jlcy4NCg0KW0tsZWluLCBTY2h1aCBlIFRyaWVzdCAoMjAwMyldKGh0dHBzOi8vd3d3LmJvc3RvbmZlZC5vcmcvcHVibGljYXRpb25zL3Jlc2VhcmNoLWRlcGFydG1lbnQtd29ya2luZy1wYXBlci8xOTk5L2pvYi1jcmVhdGlvbi1qb2ItZGVzdHJ1Y3Rpb24tYW5kLXRoZS1yZWFsLWV4Y2hhbmdlLXJhdGUuYXNweCkgY2hlZ2FyYW0gYSB1bWEgY29uY2x1c8OjbyBjb21wYXTDrXZlbCBhbyBlc3R1ZGFyIGEgaW5kw7pzdHJpYSBub3J0ZS1hbWVyaWNhbmEuIE9zIGF1dG9yZXMgc2VwYXJhcmFtIGNyaWHDp8OjbyBlIGRlc3RydWnDp8OjbyBkZSBwb3N0b3MgZGUgdHJhYmFsaG8gZSBvYnNlcnZhcmFtIHF1ZSBvcyBlZmVpdG9zIGNhbWJpYWlzIHZhcmlhdmFtIGNvbmZvcm1lIGEgYWJlcnR1cmEgY29tZXJjaWFsIGRhcyBhdGl2aWRhZGVzLCBhbMOpbSBkZSBuw6NvIHNlcmVtIHNpbcOpdHJpY29zLiBVbWEgYXByZWNpYcOnw6NvIHBvZGlhIGFjZWxlcmFyIGEgZGVzdHJ1acOnw6NvIGRlIGVtcHJlZ29zIHNlbSBxdWUgdW1hIGRlcHJlY2lhw6fDo28gcG9zdGVyaW9yIGdlcmFzc2UgdW1hIHJlY3VwZXJhw6fDo28gZGUgaWd1YWwgdGFtYW5oby4gSXNzbyBhanVkYSBhIGNvbXByZWVuZGVyIHBvciBxdWUgb3MgcGljb3MgY2FtYmlhaXMgZG8gR3LDoWZpY28gMi4yIG7Do28gc8OjbyBhY29tcGFuaGFkb3MgcG9yIG1vdmltZW50b3MgcHJvcG9yY2lvbmFpcyBkbyBlbXByZWdvIGJyYXNpbGVpcm8uDQoNCiMjIDIuMyBDw6JtYmlvIG5vbWluYWwgZSByZW5kaW1lbnRvIG3DqWRpbyByZWFsDQoNCkEgdGF4YSBkZSBjw6JtYmlvIHRhbWLDqW0gcG9kZSBhbGNhbsOnYXIgbyBtZXJjYWRvIGRlIHRyYWJhbGhvIHBvciBtZWlvIGRvcyByZW5kaW1lbnRvcy4gVW1hIGFsdGEgZG8gZMOzbGFyIGF1bWVudGEgYSByZWNlaXRhIGVtIHJlYWlzIGRlIGV4cG9ydGFkb3JlcywgbWFzIHRhbWLDqW0gZW5jYXJlY2UgcHJvZHV0b3MgZSBpbnN1bW9zIGltcG9ydGFkb3MsIGNvbnRyaWJ1aW5kbyBwYXJhIGEgZWxldmHDp8OjbyBkb3MgcHJlw6dvcyBkb23DqXN0aWNvcy4gUG9yIGlzc28sIHVtIGF1bWVudG8gbm9taW5hbCBkb3Mgc2Fsw6FyaW9zIG7Do28gYmFzdGEgcGFyYSBjb25jbHVpciBxdWUgbyB0cmFiYWxoYWRvciBnYW5ob3UgcG9kZXIgZGUgY29tcHJhLiBOZXN0YSBjb21wYXJhw6fDo28gZm9yYW0gdXRpbGl6YWRvcyBvcyByZW5kaW1lbnRvcyByZWFpcyBwdWJsaWNhZG9zIHBlbGEgUE5BRCBDb250w61udWEsIHF1ZSBqw6EgZGVzY29udGFtIGEgaW5mbGHDp8Ojby4NCg0KTyBkw7NsYXIgY29tZXJjaWFsIGZvaSB0cmFuc2Zvcm1hZG8gZGUgdW1hIHPDqXJpZSBkacOhcmlhIHBhcmEgdW1hIG3DqWRpYSB0cmltZXN0cmFsLiBPcyByZW5kaW1lbnRvcyBmb3JhbSBtYW50aWRvcyBuYSBtZXNtYSBmcmVxdcOqbmNpYSBlIGFzIHRyw6pzIHPDqXJpZXMgZm9yYW0gY29udmVydGlkYXMgZW0gw61uZGljZXMgY3VqYSByZWZlcsOqbmNpYSDDqSBhIG3DqWRpYSBkb3MgcXVhdHJvIHRyaW1lc3RyZXMgZGUgMjAxMjoNCg0KJCQNClxvdmVybGluZXtWfV97MjAxMn0gPQ0KXGZyYWN7MX17NH0NClxzdW1fe3E9MX1eezR9IFZfezIwMTIscX0NCiQkDQoNCiQkDQpJX3tWLHR9ID0NClxmcmFje1ZfdH0NCntcb3ZlcmxpbmV7Vn1fezIwMTJ9fQ0KXHRpbWVzIDEwMA0KJCQNCg0KRXNzYSBjb25zdHJ1w6fDo28gcGVybWl0ZSBvYnNlcnZhciBxdWFudG8gY2FkYSB2YXJpw6F2ZWwgc2UgYWZhc3RvdSBkZSBzdWEgbcOpZGlhIGRlIDIwMTIsIHNlbSBtaXN0dXJhciBkaXJldGFtZW50ZSB2YWxvcmVzIGVtIFIkL1VTJCBjb20gcmVuZGltZW50b3MgZXhwcmVzc29zIGVtIHJlYWlzLg0KDQoqKkdyw6FmaWNvIDIuMyDigJQgQ8OibWJpbyBub21pbmFsIGUgcmVuZGltZW50byByZWFsIG5vcyBzZXRvcmVzIHRyYW5zYWNpb27DoXZlaXMqKg0KDQpgYGB7ciBwMi1jYW1iaW8tcmVuZGltZW50bywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyAxLiBJbXBvcnRhw6fDo28gZG9zIGRhZG9zIGRlIHJlbmRpbWVudG8NCg0KcmVuZGltZW50b19icnV0byA8LSByZWFkeGw6OnJlYWRfZXhjZWwoDQogIHBhdGggPSAiU2lkcmEudHJpbS50cmFiLnhsc3giLA0KICBzaGVldCA9ICJUYWJlbGEiLA0KICBjb2xfbmFtZXMgPSBGQUxTRQ0KKQ0KDQojIDIuIFRyYXRhbWVudG8gZGEgcGxhbmlsaGEgU0lEUkEgNTQ0Mg0KDQpjb2x1bmFzX2RhZG9zIDwtIDI6bmNvbChyZW5kaW1lbnRvX2JydXRvKQ0KDQpyZW5kaW1lbnRvX2xvbmdvIDwtIHRpYmJsZTo6dGliYmxlKA0KICBwZXJpb2RvX29yaWdpbmFsID0gYXMuY2hhcmFjdGVyKA0KICAgIHVubGlzdCgNCiAgICAgIHJlbmRpbWVudG9fYnJ1dG9bNCwgY29sdW5hc19kYWRvc10sDQogICAgICB1c2UubmFtZXMgPSBGQUxTRQ0KICAgICkNCiAgKSwNCiAgc2V0b3Jfb3JpZ2luYWwgPSBhcy5jaGFyYWN0ZXIoDQogICAgdW5saXN0KA0KICAgICAgcmVuZGltZW50b19icnV0b1s1LCBjb2x1bmFzX2RhZG9zXSwNCiAgICAgIHVzZS5uYW1lcyA9IEZBTFNFDQogICAgKQ0KICApLA0KICByZW5kaW1lbnRvX3JlYWwgPSBhcy5udW1lcmljKA0KICAgIHVubGlzdCgNCiAgICAgIHJlbmRpbWVudG9fYnJ1dG9bNiwgY29sdW5hc19kYWRvc10sDQogICAgICB1c2UubmFtZXMgPSBGQUxTRQ0KICAgICkNCiAgKQ0KKSB8Pg0KICB0aWR5cjo6ZmlsbCgNCiAgICBwZXJpb2RvX29yaWdpbmFsLA0KICAgIC5kaXJlY3Rpb24gPSAiZG93biINCiAgKSB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIHNldG9yX29yaWdpbmFsICVpbiUgYygNCiAgICAgICJBZ3JpY3VsdHVyYSwgcGVjdcOhcmlhLCBwcm9kdcOnw6NvIGZsb3Jlc3RhbCwgcGVzY2EgZSBhcXVpY3VsdHVyYSIsDQogICAgICAiSW5kw7pzdHJpYSBnZXJhbCINCiAgICApDQogICkgfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBhbm8gPSBhcy5pbnRlZ2VyKA0KICAgICAgc3RyaW5ncjo6c3RyX2V4dHJhY3QoDQogICAgICAgIHBlcmlvZG9fb3JpZ2luYWwsDQogICAgICAgICJcXGR7NH0iDQogICAgICApDQogICAgKSwNCiAgICB0cmltZXN0cmUgPSBhcy5pbnRlZ2VyKA0KICAgICAgc3RyaW5ncjo6c3RyX2V4dHJhY3QoDQogICAgICAgIHBlcmlvZG9fb3JpZ2luYWwsDQogICAgICAgICJeWzEtNF0iDQogICAgICApDQogICAgKSwNCiAgICBkYXRhX3RyaW1lc3RyZSA9IGFzLkRhdGUoDQogICAgICBzcHJpbnRmKA0KICAgICAgICAiJWQtJTAyZC0wMSIsDQogICAgICAgIGFubywNCiAgICAgICAgKHRyaW1lc3RyZSAtIDEpICogMyArIDENCiAgICAgICkNCiAgICApLA0KICAgIHBlcmlvZG8gPSBwYXN0ZTAoDQogICAgICB0cmltZXN0cmUsDQogICAgICAiwrogdHJpLiAiLA0KICAgICAgYW5vDQogICAgKSwNCiAgICBzZXRvciA9IGRwbHlyOjpyZWNvZGUoDQogICAgICBzZXRvcl9vcmlnaW5hbCwNCiAgICAgICJBZ3JpY3VsdHVyYSwgcGVjdcOhcmlhLCBwcm9kdcOnw6NvIGZsb3Jlc3RhbCwgcGVzY2EgZSBhcXVpY3VsdHVyYSIgPQ0KICAgICAgICAicmVuZGltZW50b19hZ3JvX3JlYWwiLA0KICAgICAgIkluZMO6c3RyaWEgZ2VyYWwiID0NCiAgICAgICAgInJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwiDQogICAgKQ0KICApIHw+DQogIGRwbHlyOjpmaWx0ZXIoDQogICAgYW5vID49IDIwMTIsDQogICAgYW5vIDw9IDIwMjUNCiAgKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGRhdGFfdHJpbWVzdHJlLA0KICAgIGFubywNCiAgICB0cmltZXN0cmUsDQogICAgcGVyaW9kbywNCiAgICBzZXRvciwNCiAgICByZW5kaW1lbnRvX3JlYWwNCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZSgNCiAgICBkYXRhX3RyaW1lc3RyZSwNCiAgICBzZXRvcg0KICApDQoNCnJlbmRpbWVudG9fdHJpbWVzdHJhbCA8LSByZW5kaW1lbnRvX2xvbmdvIHw+DQogIHRpZHlyOjpwaXZvdF93aWRlcigNCiAgICBuYW1lc19mcm9tID0gc2V0b3IsDQogICAgdmFsdWVzX2Zyb20gPSByZW5kaW1lbnRvX3JlYWwNCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShkYXRhX3RyaW1lc3RyZSkNCg0Kc3RvcGlmbm90KA0KICAiQSBwbGFuaWxoYSBTSURSQSA1NDQyIG7Do28gY29udMOpbSBleGF0YW1lbnRlIDU2IHRyaW1lc3RyZXMuIiA9DQogICAgbnJvdyhyZW5kaW1lbnRvX3RyaW1lc3RyYWwpID09IDU2LA0KICAiQSBwbGFuaWxoYSBTSURSQSA1NDQyIHBvc3N1aSB0cmltZXN0cmVzIGR1cGxpY2Fkb3MuIiA9DQogICAgZHBseXI6Om5fZGlzdGluY3QocmVuZGltZW50b190cmltZXN0cmFsJGRhdGFfdHJpbWVzdHJlKSA9PSA1NiwNCiAgIk8gcHJpbWVpcm8gcGVyw61vZG8gZGEgcGxhbmlsaGEgbsOjbyBjb3JyZXNwb25kZSBhbyAxwrogdHJpbWVzdHJlIGRlIDIwMTIuIiA9DQogICAgbWluKHJlbmRpbWVudG9fdHJpbWVzdHJhbCRkYXRhX3RyaW1lc3RyZSkgPT0NCiAgICAgIGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgIk8gw7psdGltbyBwZXLDrW9kbyBkYSBwbGFuaWxoYSBuw6NvIGNvcnJlc3BvbmRlIGFvIDTCuiB0cmltZXN0cmUgZGUgMjAyNS4iID0NCiAgICBtYXgocmVuZGltZW50b190cmltZXN0cmFsJGRhdGFfdHJpbWVzdHJlKSA9PQ0KICAgICAgYXMuRGF0ZSgiMjAyNS0xMC0wMSIpLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIG5vcyBkYWRvcyBkZSByZW5kaW1lbnRvLiIgPQ0KICAgICFhbnlOQShyZW5kaW1lbnRvX3RyaW1lc3RyYWwpDQopDQoNCiMgMy4gQ29sZXRhIGRvIGTDs2xhciBjb21lcmNpYWwNCg0KZG9sYXJfZGlhcmlvIDwtIEdldEJDQkRhdGE6OmdiY2JkX2dldF9zZXJpZXMoDQogIGlkID0gMSwNCiAgZmlyc3QuZGF0ZSA9IGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgbGFzdC5kYXRlID0gYXMuRGF0ZSgiMjAyNS0xMi0zMSIpLA0KICBmb3JtYXQuZGF0YSA9ICJsb25nIiwNCiAgYmUucXVpZXQgPSBUUlVFDQopIHw+DQogIGRwbHlyOjp0cmFuc211dGUoDQogICAgZGF0YSA9IGFzLkRhdGUocmVmLmRhdGUpLA0KICAgIGNvdGFjYW9fZG9sYXIgPSBhcy5udW1lcmljKHZhbHVlKQ0KICApIHw+DQogIGRwbHlyOjpmaWx0ZXIoDQogICAgZGF0YSA+PSBhcy5EYXRlKCIyMDEyLTAxLTAxIiksDQogICAgZGF0YSA8PSBhcy5EYXRlKCIyMDI1LTEyLTMxIikNCiAgKSB8Pg0KICBkcGx5cjo6ZGlzdGluY3QoDQogICAgZGF0YSwNCiAgICAua2VlcF9hbGwgPSBUUlVFDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoZGF0YSkNCg0Kc3RvcGlmbm90KA0KICAiQSBzw6lyaWUgU0dTIDEgbsOjbyByZXRvcm5vdSBvYnNlcnZhw6fDtWVzLiIgPQ0KICAgIG5yb3coZG9sYXJfZGlhcmlvKSA+IDAsDQogICJFeGlzdGVtIHZhbG9yZXMgYXVzZW50ZXMgbmEgc8OpcmllIFNHUyAxLiIgPQ0KICAgICFhbnlOQShkb2xhcl9kaWFyaW8pDQopDQoNCiMgNC4gQ8OhbGN1bG8gZGFzIG3DqWRpYXMgdHJpbWVzdHJhaXMNCg0KZG9sYXJfdHJpbWVzdHJhbCA8LSBkb2xhcl9kaWFyaW8gfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBkYXRhX3RyaW1lc3RyZSA9IGx1YnJpZGF0ZTo6Zmxvb3JfZGF0ZSgNCiAgICAgIGRhdGEsDQogICAgICB1bml0ID0gInF1YXJ0ZXIiDQogICAgKQ0KICApIHw+DQogIGRwbHlyOjpncm91cF9ieShkYXRhX3RyaW1lc3RyZSkgfD4NCiAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICBkb2xhcl9tZWRpb190cmltZXN0cmUgPSBtZWFuKGNvdGFjYW9fZG9sYXIpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIGRhdGFfdHJpbWVzdHJlID49IGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgICBkYXRhX3RyaW1lc3RyZSA8PSBhcy5EYXRlKCIyMDI1LTEwLTAxIikNCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShkYXRhX3RyaW1lc3RyZSkNCg0Kc3RvcGlmbm90KA0KICAiQSBzw6lyaWUgU0dTIDEgbsOjbyBjb250w6ltIGV4YXRhbWVudGUgNTYgdHJpbWVzdHJlcy4iID0NCiAgICBucm93KGRvbGFyX3RyaW1lc3RyYWwpID09IDU2LA0KICAiQSBzw6lyaWUgdHJpbWVzdHJhbCBkbyBkw7NsYXIgcG9zc3VpIHBlcsOtb2RvcyBkdXBsaWNhZG9zLiIgPQ0KICAgIGRwbHlyOjpuX2Rpc3RpbmN0KGRvbGFyX3RyaW1lc3RyYWwkZGF0YV90cmltZXN0cmUpID09IDU2LA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIG5hcyBtw6lkaWFzIHRyaW1lc3RyYWlzIGRvIGTDs2xhci4iID0NCiAgICAhYW55TkEoZG9sYXJfdHJpbWVzdHJhbCkNCikNCg0KIyA1LiBJbmRleGHDp8OjbyBkYXMgdHLDqnMgc8Opcmllcw0KDQpiYXNlX2RvbGFyXzIwMTIgPC0gZG9sYXJfdHJpbWVzdHJhbCB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIGx1YnJpZGF0ZTo6eWVhcihkYXRhX3RyaW1lc3RyZSkgPT0gMjAxMg0KICApIHw+DQogIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgYmFzZSA9IG1lYW4oZG9sYXJfbWVkaW9fdHJpbWVzdHJlKQ0KICApIHw+DQogIGRwbHlyOjpwdWxsKGJhc2UpDQoNCmJhc2VfcmVuZGltZW50b19hZ3JvXzIwMTIgPC0gcmVuZGltZW50b190cmltZXN0cmFsIHw+DQogIGRwbHlyOjpmaWx0ZXIoYW5vID09IDIwMTIpIHw+DQogIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgYmFzZSA9IG1lYW4ocmVuZGltZW50b19hZ3JvX3JlYWwpDQogICkgfD4NCiAgZHBseXI6OnB1bGwoYmFzZSkNCg0KYmFzZV9yZW5kaW1lbnRvX2luZHVzdHJpYV8yMDEyIDwtIHJlbmRpbWVudG9fdHJpbWVzdHJhbCB8Pg0KICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKA0KICAgIGJhc2UgPSBtZWFuKHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwpDQogICkgfD4NCiAgZHBseXI6OnB1bGwoYmFzZSkNCg0KZG9sYXJfdHJpbWVzdHJhbCA8LSBkb2xhcl90cmltZXN0cmFsIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgaW5kaWNlX2RvbGFyID0NCiAgICAgIGRvbGFyX21lZGlvX3RyaW1lc3RyZSAvIGJhc2VfZG9sYXJfMjAxMiAqIDEwMA0KICApDQoNCnJlbmRpbWVudG9fdHJpbWVzdHJhbCA8LSByZW5kaW1lbnRvX3RyaW1lc3RyYWwgfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBpbmRpY2VfcmVuZGltZW50b19hZ3JvID0NCiAgICAgIHJlbmRpbWVudG9fYWdyb19yZWFsIC8NCiAgICAgIGJhc2VfcmVuZGltZW50b19hZ3JvXzIwMTIgKiAxMDAsDQogICAgaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhID0NCiAgICAgIHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwgLw0KICAgICAgYmFzZV9yZW5kaW1lbnRvX2luZHVzdHJpYV8yMDEyICogMTAwDQogICkNCg0KIyA2LiBKdW7Dp8OjbyBlIHZhbGlkYcOnw6NvDQoNCmRhZG9zX2dyYWZpY28zIDwtIGRwbHlyOjpmdWxsX2pvaW4oDQogIHJlbmRpbWVudG9fdHJpbWVzdHJhbCwNCiAgZG9sYXJfdHJpbWVzdHJhbCwNCiAgYnkgPSAiZGF0YV90cmltZXN0cmUiDQopIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgZGF0YV90cmltZXN0cmUsDQogICAgYW5vLA0KICAgIHRyaW1lc3RyZSwNCiAgICBwZXJpb2RvLA0KICAgIGRvbGFyX21lZGlvX3RyaW1lc3RyZSwNCiAgICByZW5kaW1lbnRvX2Fncm9fcmVhbCwNCiAgICByZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsLA0KICAgIGluZGljZV9kb2xhciwNCiAgICBpbmRpY2VfcmVuZGltZW50b19hZ3JvLA0KICAgIGluZGljZV9yZW5kaW1lbnRvX2luZHVzdHJpYQ0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKGRhdGFfdHJpbWVzdHJlKQ0KDQptZWRpYXNfaW5kaWNlc18yMDEyIDwtIGRhZG9zX2dyYWZpY28zIHw+DQogIGRwbHlyOjpmaWx0ZXIoYW5vID09IDIwMTIpIHw+DQogIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgaW5kaWNlX2RvbGFyID0NCiAgICAgIG1lYW4oaW5kaWNlX2RvbGFyKSwNCiAgICBpbmRpY2VfcmVuZGltZW50b19hZ3JvID0NCiAgICAgIG1lYW4oaW5kaWNlX3JlbmRpbWVudG9fYWdybyksDQogICAgaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhID0NCiAgICAgIG1lYW4oaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhKQ0KICApIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZmluYWwgbsOjbyBwb3NzdWkgZXhhdGFtZW50ZSA1NiB0cmltZXN0cmVzLiIgPQ0KICAgIG5yb3coZGFkb3NfZ3JhZmljbzMpID09IDU2LA0KICAiTyBvYmpldG8gZmluYWwgcG9zc3VpIHRyaW1lc3RyZXMgZHVwbGljYWRvcy4iID0NCiAgICBkcGx5cjo6bl9kaXN0aW5jdChkYWRvc19ncmFmaWNvMyRkYXRhX3RyaW1lc3RyZSkgPT0gNTYsDQogICJPIG9iamV0byBmaW5hbCBuw6NvIGNvbWXDp2Egbm8gMcK6IHRyaW1lc3RyZSBkZSAyMDEyLiIgPQ0KICAgIG1pbihkYWRvc19ncmFmaWNvMyRkYXRhX3RyaW1lc3RyZSkgPT0NCiAgICAgIGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgIk8gb2JqZXRvIGZpbmFsIG7Do28gdGVybWluYSBubyA0wrogdHJpbWVzdHJlIGRlIDIwMjUuIiA9DQogICAgbWF4KGRhZG9zX2dyYWZpY28zJGRhdGFfdHJpbWVzdHJlKSA9PQ0KICAgICAgYXMuRGF0ZSgiMjAyNS0xMC0wMSIpLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIGRlcG9pcyBkYSBqdW7Dp8OjbyBkYXMgYmFzZXMuIiA9DQogICAgIWFueU5BKGRhZG9zX2dyYWZpY28zKSwNCiAgIkEgbcOpZGlhIGRvcyDDrW5kaWNlcyBkZSAyMDEyIG7Do28gw6kgaWd1YWwgYSAxMDAuIiA9DQogICAgYWxsKGFicyhtZWRpYXNfaW5kaWNlc18yMDEyIC0gMTAwKSA8IDFlLTgpDQopDQoNCnZhbG9yZXNfaW5kaWNlcyA8LSBkYWRvc19ncmFmaWNvMyB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGluZGljZV9kb2xhciwNCiAgICBpbmRpY2VfcmVuZGltZW50b19hZ3JvLA0KICAgIGluZGljZV9yZW5kaW1lbnRvX2luZHVzdHJpYQ0KICApIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0KYW1wbGl0dWRlX2luZGljZXMgPC0gZGlmZihyYW5nZSh2YWxvcmVzX2luZGljZXMpKQ0KDQptYXJnZW1fZWl4byA8LSBtYXgoDQogIGFtcGxpdHVkZV9pbmRpY2VzICogMC4wNiwNCiAgMw0KKQ0KDQpsaW1pdGVfaW5mZXJpb3IgPC0gZmxvb3IoDQogIChtaW4odmFsb3Jlc19pbmRpY2VzKSAtIG1hcmdlbV9laXhvKSAvIDUNCikgKiA1DQoNCmxpbWl0ZV9zdXBlcmlvciA8LSBjZWlsaW5nKA0KICAobWF4KHZhbG9yZXNfaW5kaWNlcykgKyBtYXJnZW1fZWl4bykgLyA1DQopICogNQ0KDQpjcmlhcl9wb250b3NfZ3JhZmljbzMgPC0gZnVuY3Rpb24odmFyaWF2ZWxfaW5kaWNlKSB7DQogIGxhcHBseShzZXFfbGVuKG5yb3coZGFkb3NfZ3JhZmljbzMpKSwgZnVuY3Rpb24oaSkgew0KICAgIGxpc3QoDQogICAgICB4ID0gaGlnaGNoYXJ0ZXI6OmRhdGV0aW1lX3RvX3RpbWVzdGFtcCgNCiAgICAgICAgYXMuUE9TSVhjdCgNCiAgICAgICAgICBkYWRvc19ncmFmaWNvMyRkYXRhX3RyaW1lc3RyZVtpXSwNCiAgICAgICAgICB0eiA9ICJVVEMiDQogICAgICAgICkNCiAgICAgICksDQogICAgICB5ID0gZGFkb3NfZ3JhZmljbzNbW3ZhcmlhdmVsX2luZGljZV1dW2ldLA0KICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgcGVyaW9kbyA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzMkcGVyaW9kb1tpXSwNCiAgICAgICAgaW5kaWNlX2RvbGFyID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvMyRpbmRpY2VfZG9sYXJbaV0sDQogICAgICAgIGRvbGFyX21lZGlvX3RyaW1lc3RyZSA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzMkZG9sYXJfbWVkaW9fdHJpbWVzdHJlW2ldLA0KICAgICAgICBpbmRpY2VfcmVuZGltZW50b19hZ3JvID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvMyRpbmRpY2VfcmVuZGltZW50b19hZ3JvW2ldLA0KICAgICAgICByZW5kaW1lbnRvX2Fncm9fcmVhbCA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzMkcmVuZGltZW50b19hZ3JvX3JlYWxbaV0sDQogICAgICAgIGluZGljZV9yZW5kaW1lbnRvX2luZHVzdHJpYSA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzMkaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhW2ldLA0KICAgICAgICByZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvMyRyZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsW2ldDQogICAgICApDQogICAgKQ0KICB9KQ0KfQ0KDQpwb250b3NfZG9sYXIgPC0gY3JpYXJfcG9udG9zX2dyYWZpY28zKA0KICAiaW5kaWNlX2RvbGFyIg0KKQ0KDQpwb250b3NfcmVuZGltZW50b19hZ3JvIDwtIGNyaWFyX3BvbnRvc19ncmFmaWNvMygNCiAgImluZGljZV9yZW5kaW1lbnRvX2Fncm8iDQopDQoNCnBvbnRvc19yZW5kaW1lbnRvX2luZHVzdHJpYSA8LSBjcmlhcl9wb250b3NfZ3JhZmljbzMoDQogICJpbmRpY2VfcmVuZGltZW50b19pbmR1c3RyaWEiDQopDQoNCiMgNy4gQ29uc3RydcOnw6NvIGRvIGdyw6FmaWNvDQoNCmdyYWZpY28gPC0gaGlnaGNoYXJ0ZXI6OmhpZ2hjaGFydCgpIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jaGFydCgNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIGhlaWdodCA9IDUwMCwNCiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgc3BhY2luZ0JvdHRvbSA9IDUwDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJEw7NsYXIgY29tZXJjaWFsIiwNCiAgICBkYXRhID0gcG9udG9zX2RvbGFyLA0KICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgY29yZXNfaWJtYWNyb1siYXp1bF9lc2N1cm8iXQ0KICAgICksDQogICAgbGluZVdpZHRoID0gMi41LA0KICAgIG1hcmtlciA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIHJhZGl1cyA9IDIsDQogICAgICBzeW1ib2wgPSAiY2lyY2xlIiwNCiAgICAgIHN0YXRlcyA9IGxpc3QoDQogICAgICAgIGhvdmVyID0gbGlzdCgNCiAgICAgICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgICAgICByYWRpdXMgPSA1DQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJSZW5kaW1lbnRvIHJlYWwgbmEgQWdyb3BlY3XDoXJpYSIsDQogICAgZGF0YSA9IHBvbnRvc19yZW5kaW1lbnRvX2Fncm8sDQogICAgY29sb3IgPSB1bm5hbWUoDQogICAgICBjb3Jlc19pYm1hY3JvWyJhbWFyZWxvIl0NCiAgICApLA0KICAgIGxpbmVXaWR0aCA9IDIuNSwNCiAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICByYWRpdXMgPSAyLA0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiUmVuZGltZW50byByZWFsIG5hIEluZMO6c3RyaWEgZ2VyYWwiLA0KICAgIGRhdGEgPSBwb250b3NfcmVuZGltZW50b19pbmR1c3RyaWEsDQogICAgY29sb3IgPSB1bm5hbWUoDQogICAgICBjb3Jlc19pYm1hY3JvWyJhenVsX2NsYXJvIl0NCiAgICApLA0KICAgIGxpbmVXaWR0aCA9IDIuNSwNCiAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICByYWRpdXMgPSAyLA0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApDQoNCiMgOC4gRm9ybWF0YcOnw6NvDQoNCmdyYWZpY28gPC0gZ3JhZmljbyB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3RoZW1lKA0KICAgIHRlbWFfaWJtYWNybw0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190aXRsZSgNCiAgICB0ZXh0ID0gIkPDom1iaW8gbm9taW5hbCBlIHJlbmRpbWVudG8gcmVhbCBub3Mgc2V0b3JlcyB0cmFuc2FjaW9uw6F2ZWlzIg0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19zdWJ0aXRsZSgNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkTDs2xhciBjb21lcmNpYWwgZSByZW5kaW1lbnRvIG3DqWRpbyByZWFsIHBvciBzZXRvciDigJQgIiwNCiAgICAgICLDrW5kaWNlcyBtw6lkaWEgZGUgMjAxMiA9IDEwMCwgQnJhc2lsLCAyMDEy4oCTMjAyNSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3hBeGlzKA0KICAgIHR5cGUgPSAiZGF0ZXRpbWUiLA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiVHJpbWVzdHJlIg0KICAgICksDQogICAgbWluID0gaGlnaGNoYXJ0ZXI6OmRhdGV0aW1lX3RvX3RpbWVzdGFtcCgNCiAgICAgIGFzLlBPU0lYY3QoDQogICAgICAgIGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgICAgICAgdHogPSAiVVRDIg0KICAgICAgKQ0KICAgICksDQogICAgbWF4ID0gaGlnaGNoYXJ0ZXI6OmRhdGV0aW1lX3RvX3RpbWVzdGFtcCgNCiAgICAgIGFzLlBPU0lYY3QoDQogICAgICAgIGFzLkRhdGUoIjIwMjUtMTAtMDEiKSwNCiAgICAgICAgdHogPSAiVVRDIg0KICAgICAgKQ0KICAgICksDQogICAgdGlja0ludGVydmFsID0gMzY1LjI1ICogMjQgKiA2MCAqIDYwICogMTAwMCwNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgZm9ybWF0ID0gInt2YWx1ZTolWX0iLA0KICAgICAgcm90YXRpb24gPSAwDQogICAgKSwNCiAgICBzdGFydE9uVGljayA9IEZBTFNFLA0KICAgIGVuZE9uVGljayA9IEZBTFNFDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiw41uZGljZSAobcOpZGlhIGRlIDIwMTIgPSAxMDApIg0KICAgICksDQogICAgbWluID0gbGltaXRlX2luZmVyaW9yLA0KICAgIG1heCA9IGxpbWl0ZV9zdXBlcmlvciwNCiAgICBzdGFydE9uVGljayA9IEZBTFNFLA0KICAgIGVuZE9uVGljayA9IEZBTFNFLA0KICAgIHBsb3RMaW5lcyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB2YWx1ZSA9IDEwMCwNCiAgICAgICAgY29sb3IgPSB1bm5hbWUoDQogICAgICAgICAgY29yZXNfaWJtYWNyb1siY2luemEiXQ0KICAgICAgICApLA0KICAgICAgICBkYXNoU3R5bGUgPSAiU2hvcnREb3QiLA0KICAgICAgICB3aWR0aCA9IDEsDQogICAgICAgIHpJbmRleCA9IDEsDQogICAgICAgIGxhYmVsID0gbGlzdCgNCiAgICAgICAgICB0ZXh0ID0gIk3DqWRpYSBkZSAyMDEyIiwNCiAgICAgICAgICBhbGlnbiA9ICJyaWdodCIsDQogICAgICAgICAgeCA9IC04LA0KICAgICAgICAgIHkgPSAtNywNCiAgICAgICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgICAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgICAgICAgICAgY29yZXNfaWJtYWNyb1siY2luemEiXQ0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgICAgICAgKQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19wbG90T3B0aW9ucygNCiAgICBzZXJpZXMgPSBsaXN0KA0KICAgICAgYW5pbWF0aW9uID0gVFJVRSwNCiAgICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgICAgZmlsbE9wYWNpdHkgPSAwLA0KICAgICAgc3RhdGVzID0gbGlzdCgNCiAgICAgICAgaW5hY3RpdmUgPSBsaXN0KA0KICAgICAgICAgIG9wYWNpdHkgPSAwLjM1DQogICAgICAgICksDQogICAgICAgIGhvdmVyID0gbGlzdCgNCiAgICAgICAgICBsaW5lV2lkdGhQbHVzID0gMQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190b29sdGlwKA0KICAgIHNoYXJlZCA9IFRSVUUsDQogICAgdXNlSFRNTCA9IFRSVUUsDQogICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgImZ1bmN0aW9uICgpIHsNCiAgICAgICAgY29uc3QgZCA9IHRoaXMucG9pbnRzWzBdLnBvaW50LmN1c3RvbTsNCg0KICAgICAgICBjb25zdCBuZiA9IGZ1bmN0aW9uKHZhbG9yKSB7DQogICAgICAgICAgcmV0dXJuIEhpZ2hjaGFydHMubnVtYmVyRm9ybWF0KA0KICAgICAgICAgICAgdmFsb3IsDQogICAgICAgICAgICAyLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKTsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gKA0KICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWluLXdpZHRoOjMxMHB4O3BhZGRpbmc6NHB4IDJweDtcIj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6MTNweDtmb250LXdlaWdodDpib2xkOycgKw0KICAgICAgICAgICAgICAnbWFyZ2luLWJvdHRvbTo4cHg7Y29sb3I6IzExMTgyNztcIj4nICsNCiAgICAgICAgICAgICAgZC5wZXJpb2RvICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjlweDtcIj4nICsNCiAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6Ym9sZDtcIj4nICsNCiAgICAgICAgICAgICAgICAnRMOzbGFyIGNvbWVyY2lhbCcgKw0KICAgICAgICAgICAgICAnPC9zcGFuPjxicj4nICsNCiAgICAgICAgICAgICAgJ8ONbmRpY2U6IDxiPicgKw0KICAgICAgICAgICAgICAgIG5mKGQuaW5kaWNlX2RvbGFyKSArDQogICAgICAgICAgICAgICc8L2I+PGJyPicgKw0KICAgICAgICAgICAgICAnQ290YcOnw6NvIG3DqWRpYTogPGI+UiQgJyArDQogICAgICAgICAgICAgICAgbmYoZC5kb2xhcl9tZWRpb190cmltZXN0cmUpICsNCiAgICAgICAgICAgICAgICAnIHBvciBVUyQ8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo5cHg7XCI+JyArDQogICAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7XCI+JyArDQogICAgICAgICAgICAgICAgJ1JlbmRpbWVudG8gcmVhbCBuYSBBZ3JvcGVjdcOhcmlhJyArDQogICAgICAgICAgICAgICc8L3NwYW4+PGJyPicgKw0KICAgICAgICAgICAgICAnw41uZGljZTogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5pbmRpY2VfcmVuZGltZW50b19hZ3JvKSArDQogICAgICAgICAgICAgICc8L2I+PGJyPicgKw0KICAgICAgICAgICAgICAnUmVuZGltZW50bzogPGI+UiQgJyArDQogICAgICAgICAgICAgICAgbmYoZC5yZW5kaW1lbnRvX2Fncm9fcmVhbCkgKw0KICAgICAgICAgICAgICAgICcgcG9yIG3DqnM8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2PicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPicgKw0KICAgICAgICAgICAgICAgICdSZW5kaW1lbnRvIHJlYWwgbmEgSW5kw7pzdHJpYSBnZXJhbCcgKw0KICAgICAgICAgICAgICAnPC9zcGFuPjxicj4nICsNCiAgICAgICAgICAgICAgJ8ONbmRpY2U6IDxiPicgKw0KICAgICAgICAgICAgICAgIG5mKGQuaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhKSArDQogICAgICAgICAgICAgICc8L2I+PGJyPicgKw0KICAgICAgICAgICAgICAnUmVuZGltZW50bzogPGI+UiQgJyArDQogICAgICAgICAgICAgICAgbmYoZC5yZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsKSArDQogICAgICAgICAgICAgICAgJyBwb3IgbcOqczwvYj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICc8L2Rpdj4nDQogICAgICAgICk7DQogICAgICB9Ig0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfbGVnZW5kKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIGxheW91dCA9ICJob3Jpem9udGFsIiwNCiAgICBhbGlnbiA9ICJjZW50ZXIiLA0KICAgIHZlcnRpY2FsQWxpZ24gPSAidG9wIiwNCiAgICB5ID0gNTUsDQogICAgZmxvYXRpbmcgPSBGQUxTRSwNCiAgICB0aXRsZSA9IGxpc3QoDQogICAgICB0ZXh0ID0gTlVMTA0KICAgICksDQogICAgc3ltYm9sV2lkdGggPSAyNCwNCiAgICBpdGVtRGlzdGFuY2UgPSAyMA0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jYXB0aW9uKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiTm90YTogYXMgc8OpcmllcyBmb3JhbSB0cmFuc2Zvcm1hZGFzIGVtIMOtbmRpY2VzIGNvbSBiYXNlIG5hIG3DqWRpYSAiLA0KICAgICAgImRlIDIwMTIgPSAxMDAuIFZhbG9yZXMgbWFpb3JlcyBkbyBkw7NsYXIgY29tZXJjaWFsIGluZGljYW0gIiwNCiAgICAgICJkZXByZWNpYcOnw6NvIG5vbWluYWwgZG8gcmVhbC4gT3MgcmVuZGltZW50b3MgZGEgUE5BRCBDb250w61udWEgIiwNCiAgICAgICJqw6EgZXN0w6NvIGV4cHJlc3NvcyBlbSB2YWxvcmVzIHJlYWlzLiINCiAgICApLA0KICAgIGFsaWduID0gImxlZnQiLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2V4cG9ydGluZygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBmaWxlbmFtZSA9ICJjYW1iaW8tbm9taW5hbC1lLXJlbmRpbWVudG8tcmVhbC0yMDEyLTIwMjUiDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2NyZWRpdHMoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwg4oCTIFNHUyAxIGUgIiwNCiAgICAgICJJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyBTSURSQSA1NDQyLiAiLA0KICAgICAgIkVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYk1hY3JvIEJILiINCiAgICApLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkNCg0KIyA5LiBFeGliacOnw6NvDQoNCmdyYWZpY28NCg0KYGBgDQoNCk8gZMOzbGFyIGF2YW7Dp291IGRlIGZvcm1hIG11aXRvIG1haXMgaW50ZW5zYSBkbyBxdWUgb3MgcmVuZGltZW50b3MgcmVhaXMuIFNldSDDrW5kaWNlIHNlIGFwcm94aW1vdSBkZSAyMDAgbm8gaW7DrWNpbyBkZSAyMDE2LCBwZXJkZXUgcGFydGUgZGEgYWx0YSBub3MgYW5vcyBzZWd1aW50ZXMgZSB2b2x0b3UgYSBzdWJpciBjb20gZm9yw6dhIGVtIDIwMjAsIGNoZWdhbmRvIHBlcnRvIGRlIDMwMCBlbnRyZSBvIGZpbSBkZSAyMDI0IGUgbyBpbsOtY2lvIGRlIDIwMjUuIE8gcmVuZGltZW50byBkYSBBZ3JvcGVjdcOhcmlhIGF2YW7Dp291IGRlIG1hbmVpcmEgbWFpcyBncmFkdWFsIGUgZW5jZXJyb3UgMjAyNSBjZXJjYSBkZSAzMywyJSBhY2ltYSBkYSBtw6lkaWEgZGUgMjAxMi4gTmEgSW5kw7pzdHJpYSBnZXJhbCwgbyBjcmVzY2ltZW50byBhY3VtdWxhZG8gZm9pIGRlIGFwcm94aW1hZGFtZW50ZSA5LDMlLg0KDQpPIHBpY28gZG8gcmVuZGltZW50byBpbmR1c3RyaWFsIGVtIDIwMjAgcHJlY2lzYSBzZXIgbGlkbyBqdW50byBjb20gYSBmb3J0ZSBxdWVkYSBkbyBlbXByZWdvIG5hcXVlbGUgYW5vLiBRdWFuZG8gb3MgdHJhYmFsaGFkb3JlcyBjb20gbWVub3JlcyBzYWzDoXJpb3MgcGVyZGVtIGEgb2N1cGHDp8OjbyBlbSBtYWlvciBwcm9wb3LDp8OjbywgYSBtw6lkaWEgZG9zIHF1ZSBwZXJtYW5lY2VtIGVtcHJlZ2Fkb3MgcG9kZSBzdWJpciBtZXNtbyBzZW0gdW1hIG1lbGhvcmEgZ2VyYWwgZGFzIHJlbXVuZXJhw6fDtWVzLiBBIHF1ZWRhIGRvIHJlbmRpbWVudG8gaW5kdXN0cmlhbCBlbSAyMDIxIGUgMjAyMiwgYW8gbWVzbW8gdGVtcG8gZW0gcXVlIG8gZW1wcmVnbyBjb21lw6dhdmEgYSBzZSByZWNvbXBvciwgcmVmb3LDp2EgZXNzYSBwb3NzaWJpbGlkYWRlLg0KDQpBbyBhbmFsaXNhciBkdWFzIGTDqWNhZGFzIGRhIGluZMO6c3RyaWEgZG9zIEVzdGFkb3MgVW5pZG9zLCBbQ2FtcGEgZSBHb2xkYmVyZyAoMjAwMSldKGh0dHBzOi8vZGlyZWN0Lm1pdC5lZHUvcmVzdC9hcnRpY2xlLzgzLzMvNDc3LzU3MjczL0VtcGxveW1lbnQtdmVyc3VzLVdhZ2UtQWRqdXN0bWVudC1hbmQtdGhlLVUtUykgZW5jb250cmFyYW0gYWp1c3RlcyBjYW1iaWFpcyBtYWlzIHZpc8OtdmVpcyBub3Mgc2Fsw6FyaW9zIGUgbmFzIGhvcmFzIGV4dHJhcyBkbyBxdWUgbm8gbsO6bWVybyBsw61xdWlkbyBkZSBlbXByZWdhZG9zLiBPIHRyYWJhbGhvIG1vc3RyYSBxdWUgZW1wcmVzYXMgcG9kZW0gcmVzcG9uZGVyIGFvIGPDom1iaW8gbW9kaWZpY2FuZG8gcmVtdW5lcmHDp8O1ZXMsIGpvcm5hZGFzIGUgbWFyZ2VucyBhbnRlcyBkZSBhbHRlcmFyIHN1YSBxdWFudGlkYWRlIGRlIHRyYWJhbGhhZG9yZXMuIEVzc2EgY29uY2x1c8OjbyBuw6NvIGRldmUgc2VyIHRyYW5zcG9ydGFkYSBkaXJldGFtZW50ZSBwYXJhIG8gQnJhc2lsLCBtYXMgb2ZlcmVjZSB1bWEgZXhwbGljYcOnw6NvIMO6dGlsIHBhcmEgYSBkaWZlcmVuw6dhIGVudHJlIGFzIHRyYWpldMOzcmlhcyBkbyBlbXByZWdvIGUgZG8gcmVuZGltZW50byBvYnNlcnZhZGFzIG5vcyBHcsOhZmljb3MgMi4yIGUgMi4zLg0KDQojIyAyLjQgTXVkYW7Dp2EgbmEgY29tcG9zacOnw6NvIHNldG9yaWFsIGRvIGVtcHJlZ28NCg0KQSBxdWFudGlkYWRlIGRlIG9jdXBhZG9zIGVtIHVtYSBhdGl2aWRhZGUgcG9kZSBhdW1lbnRhciBlLCBtZXNtbyBhc3NpbSwgc3VhIGltcG9ydMOibmNpYSBubyBtZXJjYWRvIGRlIHRyYWJhbGhvIGRpbWludWlyLCBjYXNvIG8gZW1wcmVnbyB0b3RhbCBkbyBwYcOtcyBjcmVzw6dhIG1haXMgcmFwaWRhbWVudGUuIFBhcmEgY2FwdGFyIGVzc2EgbXVkYW7Dp2EgcmVsYXRpdmEsIGZvaSBjYWxjdWxhZGEgYSBwYXJ0aWNpcGHDp8OjbyBkZSBjYWRhIHNldG9yIG5vIHRvdGFsIG9maWNpYWwgZGUgcGVzc29hcyBvY3VwYWRhczoNCg0KJCQNCnBfe3MsdH0gPQ0KXGZyYWN7RV97cyx0fX0NCntFX3R9DQpcdGltZXMgMTAwDQokJA0KDQplbSBxdWUgJEVfe3MsdH0kIGNvcnJlc3BvbmRlIGFvIG7Dum1lcm8gZGUgb2N1cGFkb3Mgbm8gc2V0b3IgJHMkLCBlICRFX3QkIHJlcHJlc2VudGEgbyB0b3RhbCBkZSBwZXNzb2FzIG9jdXBhZGFzIG5vIEJyYXNpbC4gQSBtdWRhbsOnYSBlbnRyZSBvcyBkb2lzIGFub3MgZm9pIG1lZGlkYSBlbSBwb250b3MgcGVyY2VudHVhaXM6DQoNCiQkDQpcRGVsdGEgcF9zID0NCnBfe3MsMjAyNX0gLQ0KcF97cywyMDEyfQ0KJCQNCg0KQSBkaWZlcmVuw6dhIGVtIHBvbnRvcyBwZXJjZW50dWFpcyBtb3N0cmEgcXVhbnRvIGNhZGEgc2V0b3IgZ2FuaG91IG91IHBlcmRldSBlc3Bhw6dvIG5hIGNvbXBvc2nDp8OjbyBkbyBlbXByZWdvLCBzZW0gY29uZnVuZGlyIGVzc2EgbXVkYW7Dp2EgY29tIHVtYSB0YXhhIHBlcmNlbnR1YWwgZGUgY3Jlc2NpbWVudG8uDQoNCg0KKipHcsOhZmljbyAyLjQg4oCUIE11ZGFuw6dhIG5hIGNvbXBvc2nDp8OjbyBzZXRvcmlhbCBkbyBlbXByZWdvIGJyYXNpbGVpcm8qKg0KDQpgYGB7ciBwMi1jb21wb3NpY2FvLWVtcHJlZ28sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgMS4gSW1wb3J0YcOnw6NvIGRvcyBkYWRvcyBkZSBlbXByZWdvDQoNCmVtcHJlZ29fYnJ1dG8gPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKA0KICBwYXRoID0gIkRhZG9zLnNpZHJhLnhsc3giLA0KICBzaGVldCA9ICJUYWJlbGEiLA0KICBjb2xfbmFtZXMgPSBGQUxTRQ0KKQ0KDQojIDIuIFRyYXRhbWVudG8gZGEgcGxhbmlsaGEgU0lEUkEgNDM2Mg0KDQphbm9zX3BsYW5pbGhhIDwtIHN1cHByZXNzV2FybmluZ3MoDQogIGFzLmludGVnZXIoDQogICAgdW5saXN0KA0KICAgICAgZW1wcmVnb19icnV0b1s0LCBdLA0KICAgICAgdXNlLm5hbWVzID0gRkFMU0UNCiAgICApDQogICkNCikNCg0KY29sdW5hc19hbm9zIDwtIHdoaWNoKA0KICBhbm9zX3BsYW5pbGhhICVpbiUgYygyMDEyLCAyMDI1KQ0KKQ0KDQplbXByZWdvX3RhYmVsYSA8LSBlbXByZWdvX2JydXRvWw0KICA1Om5yb3coZW1wcmVnb19icnV0byksDQogIGMoMiwgY29sdW5hc19hbm9zKQ0KXQ0KDQpuYW1lcyhlbXByZWdvX3RhYmVsYSkgPC0gYygNCiAgInNldG9yX2NvbXBsZXRvIiwNCiAgYXMuY2hhcmFjdGVyKGFub3NfcGxhbmlsaGFbY29sdW5hc19hbm9zXSkNCikNCg0KZW1wcmVnb19sb25nbyA8LSBlbXByZWdvX3RhYmVsYSB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIHNldG9yX2NvbXBsZXRvID0gYXMuY2hhcmFjdGVyKHNldG9yX2NvbXBsZXRvKQ0KICApIHw+DQogIHRpZHlyOjpwaXZvdF9sb25nZXIoDQogICAgY29scyA9IC1zZXRvcl9jb21wbGV0bywNCiAgICBuYW1lc190byA9ICJhbm8iLA0KICAgIHZhbHVlc190byA9ICJvY3VwYWRvc19taWwiDQogICkgfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBhbm8gPSBhcy5pbnRlZ2VyKGFubyksDQogICAgb2N1cGFkb3NfbWlsID0gYXMubnVtZXJpYyhvY3VwYWRvc19taWwpDQogICkgfD4NCiAgZHBseXI6OmZpbHRlcigNCiAgICAhaXMubmEoc2V0b3JfY29tcGxldG8pLA0KICAgIGFubyAlaW4lIGMoMjAxMiwgMjAyNSkNCiAgKQ0KDQojIDMuIEV4dHJhw6fDo28gZG9zIHRvdGFpcyBkZSAyMDEyIGUgMjAyNQ0KDQp0b3RhaXNfZW1wcmVnbyA8LSBlbXByZWdvX2xvbmdvIHw+DQogIGRwbHlyOjpmaWx0ZXIoc2V0b3JfY29tcGxldG8gPT0gIlRvdGFsIikgfD4NCiAgZHBseXI6OmFycmFuZ2UoYW5vKQ0KDQpzdG9waWZub3QoDQogICJOw6NvIGV4aXN0ZSBleGF0YW1lbnRlIHVtIHZhbG9yIGRlIFRvdGFsIHBhcmEgY2FkYSBhbm8uIiA9DQogICAgbnJvdyh0b3RhaXNfZW1wcmVnbykgPT0gMiAmJg0KICAgIGRwbHlyOjpuX2Rpc3RpbmN0KHRvdGFpc19lbXByZWdvJGFubykgPT0gMiwNCiAgIk9zIHRvdGFpcyBkZSBlbXByZWdvIGRlIDIwMTIgZSAyMDI1IG7Do28gZm9yYW0gZW5jb250cmFkb3MuIiA9DQogICAgc2V0ZXF1YWwoDQogICAgICBhcy5pbnRlZ2VyKHRvdGFpc19lbXByZWdvJGFubyksDQogICAgICBjKDIwMTJMLCAyMDI1TCkNCiAgICApLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIG5vcyB0b3RhaXMgZGUgZW1wcmVnby4iID0NCiAgICAhYW55TkEodG90YWlzX2VtcHJlZ28kb2N1cGFkb3NfbWlsKSwNCiAgIk9zIHRvdGFpcyBkZSBlbXByZWdvIGRldmVtIHNlciBwb3NpdGl2b3MuIiA9DQogICAgYWxsKHRvdGFpc19lbXByZWdvJG9jdXBhZG9zX21pbCA+IDApDQopDQoNCnRvdGFsX29jdXBhZG9zXzIwMTJfbWlsIDwtIHRvdGFpc19lbXByZWdvIHw+DQogIGRwbHlyOjpmaWx0ZXIoYW5vID09IDIwMTIpIHw+DQogIGRwbHlyOjpwdWxsKG9jdXBhZG9zX21pbCkNCg0KdG90YWxfb2N1cGFkb3NfMjAyNV9taWwgPC0gdG90YWlzX2VtcHJlZ28gfD4NCiAgZHBseXI6OmZpbHRlcihhbm8gPT0gMjAyNSkgfD4NCiAgZHBseXI6OnB1bGwob2N1cGFkb3NfbWlsKQ0KDQpzZXRvcmVzX3NlbGVjaW9uYWRvcyA8LSBjKA0KICAiQWdyaWN1bHR1cmEsIHBlY3XDoXJpYSwgcHJvZHXDp8OjbyBmbG9yZXN0YWwsIHBlc2NhIGUgYXF1aWN1bHR1cmEiLA0KICAiSW5kw7pzdHJpYSBnZXJhbCIsDQogICJDb25zdHJ1w6fDo28iLA0KICAiQ29tw6lyY2lvLCByZXBhcmHDp8OjbyBkZSB2ZcOtY3Vsb3MgYXV0b21vdG9yZXMgZSBtb3RvY2ljbGV0YXMiLA0KICAiVHJhbnNwb3J0ZSwgYXJtYXplbmFnZW0gZSBjb3JyZWlvIiwNCiAgIkFsb2phbWVudG8gZSBhbGltZW50YcOnw6NvIiwNCiAgcGFzdGUwKA0KICAgICJJbmZvcm1hw6fDo28sIGNvbXVuaWNhw6fDo28gZSBhdGl2aWRhZGVzIGZpbmFuY2VpcmFzLCAiLA0KICAgICJpbW9iaWxpw6FyaWFzLCBwcm9maXNzaW9uYWlzIGUgYWRtaW5pc3RyYXRpdmFzIg0KICApLA0KICBwYXN0ZTAoDQogICAgIkFkbWluaXN0cmHDp8OjbyBww7pibGljYSwgZGVmZXNhLCBzZWd1cmlkYWRlIHNvY2lhbCwgZWR1Y2HDp8OjbywgIiwNCiAgICAic2HDumRlIGh1bWFuYSBlIHNlcnZpw6dvcyBzb2NpYWlzIg0KICApLA0KICAiT3V0cm9zIHNlcnZpw6dvcyIsDQogICJTZXJ2acOnb3MgZG9tw6lzdGljb3MiDQopDQoNCmVtcHJlZ29fc2V0b3JpYWwgPC0gZW1wcmVnb19sb25nbyB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIHNldG9yX2NvbXBsZXRvICVpbiUgc2V0b3Jlc19zZWxlY2lvbmFkb3MNCiAgKSB8Pg0KICB0aWR5cjo6cGl2b3Rfd2lkZXIoDQogICAgbmFtZXNfZnJvbSA9IGFubywNCiAgICB2YWx1ZXNfZnJvbSA9IG9jdXBhZG9zX21pbCwNCiAgICBuYW1lc19nbHVlID0gIm9jdXBhZG9zX3thbm99X21pbCINCiAgKQ0KDQojIDQuIEPDoWxjdWxvIGRhcyBwYXJ0aWNpcGHDp8O1ZXMgc2V0b3JpYWlzDQoNCmVtcHJlZ29fc2V0b3JpYWwgPC0gZW1wcmVnb19zZXRvcmlhbCB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIHBhcnRpY2lwYWNhb18yMDEyID0NCiAgICAgIG9jdXBhZG9zXzIwMTJfbWlsIC8NCiAgICAgIHRvdGFsX29jdXBhZG9zXzIwMTJfbWlsICogMTAwLA0KICAgIHBhcnRpY2lwYWNhb18yMDI1ID0NCiAgICAgIG9jdXBhZG9zXzIwMjVfbWlsIC8NCiAgICAgIHRvdGFsX29jdXBhZG9zXzIwMjVfbWlsICogMTAwDQogICkNCg0KIyA1LiBDw6FsY3VsbyBkYSB2YXJpYcOnw6NvIGVtIHBvbnRvcyBwZXJjZW50dWFpcw0KDQpkYWRvc19ncmFmaWNvNCA8LSBlbXByZWdvX3NldG9yaWFsIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgdmFyaWFjYW9fcHAgPQ0KICAgICAgcGFydGljaXBhY2FvXzIwMjUgLSBwYXJ0aWNpcGFjYW9fMjAxMiwNCiAgICBkaXJlY2FvX3ZhcmlhY2FvID0gZHBseXI6OmNhc2Vfd2hlbigNCiAgICAgIHZhcmlhY2FvX3BwID4gMCB+ICJBdW1lbnRvIiwNCiAgICAgIHZhcmlhY2FvX3BwIDwgMCB+ICJSZWR1w6fDo28iLA0KICAgICAgVFJVRSB+ICJFc3RhYmlsaWRhZGUiDQogICAgKSwNCiAgICBzZXRvciA9IGRwbHlyOjpyZWNvZGUoDQogICAgICBzZXRvcl9jb21wbGV0bywNCiAgICAgICJBZ3JpY3VsdHVyYSwgcGVjdcOhcmlhLCBwcm9kdcOnw6NvIGZsb3Jlc3RhbCwgcGVzY2EgZSBhcXVpY3VsdHVyYSIgPQ0KICAgICAgICAiQWdyb3BlY3XDoXJpYSIsDQogICAgICAiSW5kw7pzdHJpYSBnZXJhbCIgPQ0KICAgICAgICAiSW5kw7pzdHJpYSBnZXJhbCIsDQogICAgICAiQ29uc3RydcOnw6NvIiA9DQogICAgICAgICJDb25zdHJ1w6fDo28iLA0KICAgICAgIkNvbcOpcmNpbywgcmVwYXJhw6fDo28gZGUgdmXDrWN1bG9zIGF1dG9tb3RvcmVzIGUgbW90b2NpY2xldGFzIiA9DQogICAgICAgICJDb23DqXJjaW8iLA0KICAgICAgIlRyYW5zcG9ydGUsIGFybWF6ZW5hZ2VtIGUgY29ycmVpbyIgPQ0KICAgICAgICAiVHJhbnNwb3J0ZSBlIGFybWF6ZW5hZ2VtIiwNCiAgICAgICJBbG9qYW1lbnRvIGUgYWxpbWVudGHDp8OjbyIgPQ0KICAgICAgICAiQWxvamFtZW50byBlIGFsaW1lbnRhw6fDo28iLA0KICAgICAgIkluZm9ybWHDp8OjbywgY29tdW5pY2HDp8OjbyBlIGF0aXZpZGFkZXMgZmluYW5jZWlyYXMsIGltb2JpbGnDoXJpYXMsIHByb2Zpc3Npb25haXMgZSBhZG1pbmlzdHJhdGl2YXMiID0NCiAgICAgICAgIkluZm9ybWHDp8OjbywgZmluYW7Dp2FzIGUgc2VydmnDp29zIHByb2Zpc3Npb25haXMiLA0KICAgICAgIkFkbWluaXN0cmHDp8OjbyBww7pibGljYSwgZGVmZXNhLCBzZWd1cmlkYWRlIHNvY2lhbCwgZWR1Y2HDp8Ojbywgc2HDumRlIGh1bWFuYSBlIHNlcnZpw6dvcyBzb2NpYWlzIiA9DQogICAgICAgICJBZG1pbmlzdHJhw6fDo28gcMO6YmxpY2EsIGVkdWNhw6fDo28gZSBzYcO6ZGUiLA0KICAgICAgIk91dHJvcyBzZXJ2acOnb3MiID0NCiAgICAgICAgIk91dHJvcyBzZXJ2acOnb3MiLA0KICAgICAgIlNlcnZpw6dvcyBkb23DqXN0aWNvcyIgPQ0KICAgICAgICAiU2VydmnDp29zIGRvbcOpc3RpY29zIg0KICAgICksDQogICAgY29yX2JhcnJhID0gZHBseXI6OmNhc2Vfd2hlbigNCiAgICAgIGRpcmVjYW9fdmFyaWFjYW8gPT0gIkF1bWVudG8iIH4NCiAgICAgICAgdW5uYW1lKGNvcmVzX2libWFjcm9bImF6dWxfZXNjdXJvIl0pLA0KICAgICAgZGlyZWNhb192YXJpYWNhbyA9PSAiUmVkdcOnw6NvIiB+DQogICAgICAgIHVubmFtZShjb3Jlc19pYm1hY3JvWyJhbWFyZWxvIl0pLA0KICAgICAgVFJVRSB+DQogICAgICAgIHVubmFtZShjb3Jlc19pYm1hY3JvWyJjaW56YSJdKQ0KICAgICkNCiAgKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIHNldG9yLA0KICAgIHNldG9yX2NvbXBsZXRvLA0KICAgIG9jdXBhZG9zXzIwMTJfbWlsLA0KICAgIG9jdXBhZG9zXzIwMjVfbWlsLA0KICAgIHBhcnRpY2lwYWNhb18yMDEyLA0KICAgIHBhcnRpY2lwYWNhb18yMDI1LA0KICAgIHZhcmlhY2FvX3BwLA0KICAgIGRpcmVjYW9fdmFyaWFjYW8sDQogICAgY29yX2JhcnJhDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoDQogICAgZHBseXI6OmRlc2ModmFyaWFjYW9fcHApDQogICkNCg0KIyA2LiBPcmdhbml6YcOnw6NvIGUgdmFsaWRhw6fDo28gZG8gb2JqZXRvIGZpbmFsDQoNCnN0b3BpZm5vdCgNCiAgIk8gb2JqZXRvIGZpbmFsIG7Do28gY29udMOpbSBleGF0YW1lbnRlIGRleiBzZXRvcmVzLiIgPQ0KICAgIG5yb3coZGFkb3NfZ3JhZmljbzQpID09IDEwLA0KICAiRXhpc3RlbSBzZXRvcmVzIGR1cGxpY2Fkb3Mgbm8gb2JqZXRvIGZpbmFsLiIgPQ0KICAgIGRwbHlyOjpuX2Rpc3RpbmN0KGRhZG9zX2dyYWZpY280JHNldG9yX2NvbXBsZXRvKSA9PSAxMCwNCiAgIk5lbSB0b2RvcyBvcyBzZXRvcmVzIHNlbGVjaW9uYWRvcyBmb3JhbSBlbmNvbnRyYWRvcy4iID0NCiAgICBzZXRlcXVhbCgNCiAgICAgIGRhZG9zX2dyYWZpY280JHNldG9yX2NvbXBsZXRvLA0KICAgICAgc2V0b3Jlc19zZWxlY2lvbmFkb3MNCiAgICApLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIGRlcG9pcyBkbyB0cmF0YW1lbnRvLiIgPQ0KICAgICFhbnlOQShkYWRvc19ncmFmaWNvNCksDQogICJFeGlzdGVtIHZhbG9yZXMgZGUgZW1wcmVnbyBuZWdhdGl2b3MuIiA9DQogICAgYWxsKA0KICAgICAgZGFkb3NfZ3JhZmljbzQkb2N1cGFkb3NfMjAxMl9taWwgPj0gMCwNCiAgICAgIGRhZG9zX2dyYWZpY280JG9jdXBhZG9zXzIwMjVfbWlsID49IDANCiAgICApLA0KICAiQXMgcGFydGljaXBhw6fDtWVzIGRlIDIwMTIgZm9yYW0gY2FsY3VsYWRhcyBpbmNvcnJldGFtZW50ZS4iID0NCiAgICBhbGwoDQogICAgICBhYnMoDQogICAgICAgIGRhZG9zX2dyYWZpY280JHBhcnRpY2lwYWNhb18yMDEyIC0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvNCRvY3VwYWRvc18yMDEyX21pbCAvDQogICAgICAgICAgdG90YWxfb2N1cGFkb3NfMjAxMl9taWwgKiAxMDANCiAgICAgICkgPCAxZS0xMA0KICAgICksDQogICJBcyBwYXJ0aWNpcGHDp8O1ZXMgZGUgMjAyNSBmb3JhbSBjYWxjdWxhZGFzIGluY29ycmV0YW1lbnRlLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgZGFkb3NfZ3JhZmljbzQkcGFydGljaXBhY2FvXzIwMjUgLQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY280JG9jdXBhZG9zXzIwMjVfbWlsIC8NCiAgICAgICAgICB0b3RhbF9vY3VwYWRvc18yMDI1X21pbCAqIDEwMA0KICAgICAgKSA8IDFlLTEwDQogICAgKSwNCiAgIkEgdmFyaWHDp8OjbyBlbSBwb250b3MgcGVyY2VudHVhaXMgZm9pIGNhbGN1bGFkYSBpbmNvcnJldGFtZW50ZS4iID0NCiAgICBhbGwoDQogICAgICBhYnMoDQogICAgICAgIGRhZG9zX2dyYWZpY280JHZhcmlhY2FvX3BwIC0NCiAgICAgICAgICAoDQogICAgICAgICAgICBkYWRvc19ncmFmaWNvNCRwYXJ0aWNpcGFjYW9fMjAyNSAtDQogICAgICAgICAgICAgIGRhZG9zX2dyYWZpY280JHBhcnRpY2lwYWNhb18yMDEyDQogICAgICAgICAgKQ0KICAgICAgKSA8IDFlLTEwDQogICAgKQ0KKQ0KDQpjYXRlZ29yaWFzX2dyYWZpY280IDwtIGRhZG9zX2dyYWZpY280JHNldG9yIHw+DQogIHN0cmluZ3I6OnN0cl9yZXBsYWNlKA0KICAgICJJbmZvcm1hw6fDo28sIGZpbmFuw6dhcyBlIHNlcnZpw6dvcyBwcm9maXNzaW9uYWlzIiwNCiAgICAiSW5mb3JtYcOnw6NvLCBmaW5hbsOnYXMgZTxicj5zZXJ2acOnb3MgcHJvZmlzc2lvbmFpcyINCiAgKSB8Pg0KICBzdHJpbmdyOjpzdHJfcmVwbGFjZSgNCiAgICAiQWRtaW5pc3RyYcOnw6NvIHDDumJsaWNhLCBlZHVjYcOnw6NvIGUgc2HDumRlIiwNCiAgICAiQWRtaW5pc3RyYcOnw6NvIHDDumJsaWNhLDxicj5lZHVjYcOnw6NvIGUgc2HDumRlIg0KICApDQoNCnBvbnRvc19ncmFmaWNvNCA8LSBsYXBwbHkoDQogIHNlcV9sZW4obnJvdyhkYWRvc19ncmFmaWNvNCkpLA0KICBmdW5jdGlvbihpKSB7DQogICAgbGlzdCgNCiAgICAgIG5hbWUgPSBkYWRvc19ncmFmaWNvNCRzZXRvcltpXSwNCiAgICAgIHkgPSBkYWRvc19ncmFmaWNvNCR2YXJpYWNhb19wcFtpXSwNCiAgICAgIGNvbG9yID0gZGFkb3NfZ3JhZmljbzQkY29yX2JhcnJhW2ldLA0KICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgc2V0b3JfY29tcGxldG8gPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY280JHNldG9yX2NvbXBsZXRvW2ldLA0KICAgICAgICBvY3VwYWRvc18yMDEyX21pbCA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzQkb2N1cGFkb3NfMjAxMl9taWxbaV0sDQogICAgICAgIG9jdXBhZG9zXzIwMjVfbWlsID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvNCRvY3VwYWRvc18yMDI1X21pbFtpXSwNCiAgICAgICAgcGFydGljaXBhY2FvXzIwMTIgPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY280JHBhcnRpY2lwYWNhb18yMDEyW2ldLA0KICAgICAgICBwYXJ0aWNpcGFjYW9fMjAyNSA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzQkcGFydGljaXBhY2FvXzIwMjVbaV0sDQogICAgICAgIHZhcmlhY2FvX3BwID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvNCR2YXJpYWNhb19wcFtpXSwNCiAgICAgICAgZGlyZWNhb192YXJpYWNhbyA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzQkZGlyZWNhb192YXJpYWNhb1tpXQ0KICAgICAgKQ0KICAgICkNCiAgfQ0KKQ0KDQphbXBsaXR1ZGVfdmFyaWFjYW8gPC0gZGlmZigNCiAgcmFuZ2UoDQogICAgZGFkb3NfZ3JhZmljbzQkdmFyaWFjYW9fcHAsDQogICAgMA0KICApDQopDQoNCm1hcmdlbV9laXhvIDwtIG1heCgNCiAgYW1wbGl0dWRlX3ZhcmlhY2FvICogMC4xMiwNCiAgMC4zNQ0KKQ0KDQpsaW1pdGVfaW5mZXJpb3IgPC0gZmxvb3IoDQogICgNCiAgICBtaW4oZGFkb3NfZ3JhZmljbzQkdmFyaWFjYW9fcHAsIDApIC0NCiAgICAgIG1hcmdlbV9laXhvDQogICkgKiAxMA0KKSAvIDEwDQoNCmxpbWl0ZV9zdXBlcmlvciA8LSBjZWlsaW5nKA0KICAoDQogICAgbWF4KGRhZG9zX2dyYWZpY280JHZhcmlhY2FvX3BwLCAwKSArDQogICAgICBtYXJnZW1fZWl4bw0KICApICogMTANCikgLyAxMA0KDQojIDcuIENvbnN0cnXDp8OjbyBkbyBncsOhZmljbw0KDQpncmFmaWNvIDwtIGhpZ2hjaGFydGVyOjpoaWdoY2hhcnQoKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2hhcnQoDQogICAgdHlwZSA9ICJiYXIiLA0KICAgIGhlaWdodCA9IDYwMCwNCiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgbWFyZ2luTGVmdCA9IDI0NSwNCiAgICBtYXJnaW5SaWdodCA9IDkwLA0KICAgIHNwYWNpbmdCb3R0b20gPSA3NQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiVmFyaWHDp8OjbyBkYSBwYXJ0aWNpcGHDp8OjbyIsDQogICAgZGF0YSA9IHBvbnRvc19ncmFmaWNvNCwNCiAgICBib3JkZXJXaWR0aCA9IDAsDQogICAgcG9pbnRQYWRkaW5nID0gMC4xMiwNCiAgICBncm91cFBhZGRpbmcgPSAwLjA4LA0KICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgIHNob3dJbkxlZ2VuZCA9IEZBTFNFDQogICkNCg0KIyA4LiBGb3JtYXRhw6fDo28NCg0KZ3JhZmljbyA8LSBncmFmaWNvIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfdGhlbWUoDQogICAgdGVtYV9pYm1hY3JvDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3RpdGxlKA0KICAgIHRleHQgPSAiTXVkYW7Dp2EgbmEgY29tcG9zacOnw6NvIHNldG9yaWFsIGRvIGVtcHJlZ28gYnJhc2lsZWlybyINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfc3VidGl0bGUoDQogICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICJWYXJpYcOnw6NvIGRhIHBhcnRpY2lwYcOnw6NvIGRlIGNhZGEgYXRpdmlkYWRlIG5vIGVtcHJlZ28gdG90YWwg4oCUICIsDQogICAgICAicG9udG9zIHBlcmNlbnR1YWlzLCBCcmFzaWwsIDIwMTLigJMyMDI1Ig0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfeEF4aXMoDQogICAgY2F0ZWdvcmllcyA9IGNhdGVnb3JpYXNfZ3JhZmljbzQsDQogICAgcmV2ZXJzZWQgPSBUUlVFLA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSBOVUxMDQogICAgKSwNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgdXNlSFRNTCA9IFRSVUUsDQogICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgIGNvbG9yID0gIiM0QjU1NjMiLA0KICAgICAgICBmb250U2l6ZSA9ICIxMXB4IiwNCiAgICAgICAgd2hpdGVTcGFjZSA9ICJub3dyYXAiDQogICAgICApDQogICAgKSwNCiAgICBsaW5lQ29sb3IgPSAiIzlDQTNBRiIsDQogICAgdGlja0NvbG9yID0gIiM5Q0EzQUYiLA0KICAgIGdyaWRMaW5lV2lkdGggPSAwDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiVmFyaWHDp8OjbyBkYSBwYXJ0aWNpcGHDp8OjbyBubyBlbXByZWdvIHRvdGFsIChwLnAuKSINCiAgICApLA0KICAgIG1pbiA9IGxpbWl0ZV9pbmZlcmlvciwNCiAgICBtYXggPSBsaW1pdGVfc3VwZXJpb3IsDQogICAgc3RhcnRPblRpY2sgPSBGQUxTRSwNCiAgICBlbmRPblRpY2sgPSBGQUxTRSwNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHRoaXMudmFsdWUsDQogICAgICAgICAgICAyLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKSArICcgcC5wLic7DQogICAgICAgIH0iDQogICAgICApDQogICAgKSwNCiAgICBwbG90TGluZXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgdmFsdWUgPSAwLA0KICAgICAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgICAgICBjb3Jlc19pYm1hY3JvWyJjaW56YSJdDQogICAgICAgICksDQogICAgICAgIHdpZHRoID0gMS4yLA0KICAgICAgICBkYXNoU3R5bGUgPSAiU29saWQiLA0KICAgICAgICB6SW5kZXggPSA1DQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19wbG90T3B0aW9ucygNCiAgICBiYXIgPSBsaXN0KA0KICAgICAgc3RhY2tpbmcgPSBOVUxMLA0KICAgICAgYm9yZGVyV2lkdGggPSAwLA0KICAgICAgc2hhZG93ID0gRkFMU0UsDQogICAgICBkYXRhTGFiZWxzID0gbGlzdCgNCiAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgIGluc2lkZSA9IEZBTFNFLA0KICAgICAgICBjcm9wID0gRkFMU0UsDQogICAgICAgIG92ZXJmbG93ID0gImFsbG93IiwNCiAgICAgICAgYWxsb3dPdmVybGFwID0gRkFMU0UsDQogICAgICAgIHN0eWxlID0gbGlzdCgNCiAgICAgICAgICBjb2xvciA9ICIjMTExODI3IiwNCiAgICAgICAgICBmb250U2l6ZSA9ICIxMHB4IiwNCiAgICAgICAgICBmb250V2VpZ2h0ID0gIm5vcm1hbCIsDQogICAgICAgICAgdGV4dE91dGxpbmUgPSAibm9uZSINCiAgICAgICAgKSwNCiAgICAgICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgICJmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBjb25zdCBzaW5hbCA9DQogICAgICAgICAgICAgIHRoaXMueSA+IDAgPyAnKycgOg0KICAgICAgICAgICAgICB0aGlzLnkgPCAwID8gJ+KIkicgOiAnJzsNCg0KICAgICAgICAgICAgcmV0dXJuIHNpbmFsICsNCiAgICAgICAgICAgICAgSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICAgICAgTWF0aC5hYnModGhpcy55KSwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgICcsJywNCiAgICAgICAgICAgICAgICAnLicNCiAgICAgICAgICAgICAgKSArDQogICAgICAgICAgICAgICcgcC5wLic7DQogICAgICAgICAgfSINCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICksDQogICAgc2VyaWVzID0gbGlzdCgNCiAgICAgIGFuaW1hdGlvbiA9IFRSVUUsDQogICAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICAgIHN0YXRlcyA9IGxpc3QoDQogICAgICAgIGluYWN0aXZlID0gbGlzdCgNCiAgICAgICAgICBvcGFjaXR5ID0gMC40DQogICAgICAgICksDQogICAgICAgIGhvdmVyID0gbGlzdCgNCiAgICAgICAgICBicmlnaHRuZXNzID0gMC4wOA0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190b29sdGlwKA0KICAgIHNoYXJlZCA9IEZBTFNFLA0KICAgIHVzZUhUTUwgPSBUUlVFLA0KICAgIGZvcm1hdHRlciA9IGh0bWx3aWRnZXRzOjpKUygNCiAgICAgICJmdW5jdGlvbiAoKSB7DQogICAgICAgIGNvbnN0IGQgPSB0aGlzLnBvaW50LmN1c3RvbTsNCg0KICAgICAgICBjb25zdCBuZiA9IGZ1bmN0aW9uKHZhbG9yKSB7DQogICAgICAgICAgcmV0dXJuIEhpZ2hjaGFydHMubnVtYmVyRm9ybWF0KA0KICAgICAgICAgICAgdmFsb3IsDQogICAgICAgICAgICAyLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBzaW5hbCA9DQogICAgICAgICAgZC52YXJpYWNhb19wcCA+IDAgPyAnKycgOg0KICAgICAgICAgIGQudmFyaWFjYW9fcHAgPCAwID8gJ+KIkicgOiAnJzsNCg0KICAgICAgICBjb25zdCB2YXJpYWNhb0Zvcm1hdGFkYSA9DQogICAgICAgICAgc2luYWwgKw0KICAgICAgICAgIG5mKE1hdGguYWJzKGQudmFyaWFjYW9fcHApKSArDQogICAgICAgICAgJyBwLnAuJzsNCg0KICAgICAgICByZXR1cm4gKA0KICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWluLXdpZHRoOjMyMHB4O21heC13aWR0aDozOTBweDsnICsNCiAgICAgICAgICAgICdwYWRkaW5nOjRweCAycHg7XCI+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6Ym9sZDsnICsNCiAgICAgICAgICAgICAgJ21hcmdpbi1ib3R0b206OXB4O2NvbG9yOiMxMTE4Mjc7XCI+JyArDQogICAgICAgICAgICAgIGQuc2V0b3JfY29tcGxldG8gKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPjIwMTI8L3NwYW4+PGJyPicgKw0KICAgICAgICAgICAgICAnUGVzc29hcyBvY3VwYWRhczogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5vY3VwYWRvc18yMDEyX21pbCkgKw0KICAgICAgICAgICAgICAgICcgbWlsIHBlc3NvYXM8L2I+PGJyPicgKw0KICAgICAgICAgICAgICAnUGFydGljaXBhw6fDo28gbm8gZW1wcmVnbyB0b3RhbDogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5wYXJ0aWNpcGFjYW9fMjAxMikgKw0KICAgICAgICAgICAgICAgICclPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPjIwMjU8L3NwYW4+PGJyPicgKw0KICAgICAgICAgICAgICAnUGVzc29hcyBvY3VwYWRhczogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5vY3VwYWRvc18yMDI1X21pbCkgKw0KICAgICAgICAgICAgICAgICcgbWlsIHBlc3NvYXM8L2I+PGJyPicgKw0KICAgICAgICAgICAgICAnUGFydGljaXBhw6fDo28gbm8gZW1wcmVnbyB0b3RhbDogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5wYXJ0aWNpcGFjYW9fMjAyNSkgKw0KICAgICAgICAgICAgICAgICclPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdj4nICsNCiAgICAgICAgICAgICAgJ1Zhcmlhw6fDo28gZGEgcGFydGljaXBhw6fDo286IDxiPicgKw0KICAgICAgICAgICAgICAgIHZhcmlhY2FvRm9ybWF0YWRhICsNCiAgICAgICAgICAgICAgJzwvYj48YnI+JyArDQogICAgICAgICAgICAgICdEaXJlw6fDo286IDxiPicgKw0KICAgICAgICAgICAgICAgIGQuZGlyZWNhb192YXJpYWNhbyArDQogICAgICAgICAgICAgICc8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAnPC9kaXY+Jw0KICAgICAgICApOw0KICAgICAgfSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2xlZ2VuZCgNCiAgICBlbmFibGVkID0gRkFMU0UNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2FwdGlvbigNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIk5vdGE6IGEgcGFydGljaXBhw6fDo28gZGUgY2FkYSBhdGl2aWRhZGUgZm9pIGNhbGN1bGFkYSBlbSByZWxhw6fDo28gIiwNCiAgICAgICJhbyB0b3RhbCBvZmljaWFsIGRlIHBlc3NvYXMgb2N1cGFkYXMgZGEgUE5BRCBDb250w61udWEuIEJhcnJhcyDDoCAiLA0KICAgICAgImRpcmVpdGEgaW5kaWNhbSBhdW1lbnRvIGRlIHBhcnRpY2lwYcOnw6NvIGUgYmFycmFzIMOgIGVzcXVlcmRhIGluZGljYW0gIiwNCiAgICAgICJyZWR1w6fDo28uIEEgbXVkYW7Dp2EgZGEgY29tcG9zacOnw6NvIHNldG9yaWFsIHJlZmxldGUgZGl2ZXJzb3MgZmF0b3JlcyAiLA0KICAgICAgImVjb27DtG1pY29zIGUgbsOjbyBkZXZlIHNlciBhdHJpYnXDrWRhIGV4Y2x1c2l2YW1lbnRlIGFvIGPDom1iaW8uIg0KICAgICksDQogICAgYWxpZ24gPSAibGVmdCIsDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzZCNzI4MCIsDQogICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfZXhwb3J0aW5nKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIGZpbGVuYW1lID0gIm11ZGFuY2EtY29tcG9zaWNhby1zZXRvcmlhbC1lbXByZWdvLTIwMTItMjAyNSINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY3JlZGl0cygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkZvbnRlOiBJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyBTSURSQSA0MzYyLiAiLA0KICAgICAgIkVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYk1hY3JvIEJILiINCiAgICApLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkNCg0KIyA5LiBFeGliacOnw6NvDQoNCmdyYWZpY28NCg0KYGBgDQpFbnRyZSAyMDEyIGUgMjAyNSwgb3MgbWFpb3JlcyBnYW5ob3MgZGUgcGFydGljaXBhw6fDo28gb2NvcnJlcmFtIGVtIEFkbWluaXN0cmHDp8OjbyBww7pibGljYSwgZWR1Y2HDp8OjbyBlIHNhw7pkZSwgY29tIDIsNjcgcG9udG9zIHBlcmNlbnR1YWlzLCBlIGVtIEluZm9ybWHDp8OjbywgZmluYW7Dp2FzIGUgc2VydmnDp29zIHByb2Zpc3Npb25haXMsIGNvbSAyLDI5IHBvbnRvcy4gT3V0cm9zIHNlcnZpw6dvcywgQWxvamFtZW50byBlIGFsaW1lbnRhw6fDo28gZSBUcmFuc3BvcnRlIGUgYXJtYXplbmFnZW0gdGFtYsOpbSBhbXBsaWFyYW0gc3VhIHByZXNlbsOnYSwgZW5xdWFudG8gYSBBZ3JvcGVjdcOhcmlhIHBlcmRldSAzLDcwIHBvbnRvcyBlIGEgSW5kw7pzdHJpYSBnZXJhbCByZWN1b3UgMSw2MCBwb250by4NCg0KRXNzYSBtdWRhbsOnYSB0b3JuYSBvIGVtcHJlZ28gYnJhc2lsZWlybyBtZW5vcyBjb25jZW50cmFkbyBub3Mgc2V0b3JlcyBkaXJldGFtZW50ZSBsaWdhZG9zIGFvIGNvbcOpcmNpbyBleHRlcmlvci4gQSBJbmTDunN0cmlhIGdlcmFsIHRlcm1pbm91IDIwMjUgY29tIG1haXMgb2N1cGFkb3MgZG8gcXVlIGVtIDIwMTIsIG1hcyBzdWEgcGFydGljaXBhw6fDo28gY2FpdSBwb3JxdWUgb3V0cmFzIGF0aXZpZGFkZXMgY3Jlc2NlcmFtIG1haXMuIE5hIEFncm9wZWN1w6FyaWEsIGEgcGVyZGEgZm9pIHNpbXVsdGFuZWFtZW50ZSBhYnNvbHV0YSBlIHJlbGF0aXZhLiBBc3NpbSwgbWVzbW8gcXVhbmRvIG8gY8OibWJpbyBmYXZvcmVjZSBhIHByb2R1w6fDo28gdHJhbnNhY2lvbsOhdmVsLCBzZXUgYWxjYW5jZSBzb2JyZSBvIGVtcHJlZ28gYWdyZWdhZG8gZGltaW51aSDDoCBtZWRpZGEgcXVlIG9zIHRyYWJhbGhhZG9yZXMgc2UgZGVzbG9jYW0gcGFyYSBzZXJ2acOnb3MgbWVub3MgZXhwb3N0b3MgYW8gY29tw6lyY2lvIGludGVybmFjaW9uYWwuDQoNCiMjIDIuNSBWYXJpYcOnw7VlcyBhbnVhaXMgZG8gY8OibWJpbyByZWFsIGUgZG8gZW1wcmVnbw0KDQpBIGNvbXBhcmHDp8OjbyBwb3Igw61uZGljZXMgYWp1ZGEgYSB2aXN1YWxpemFyIG1vdmltZW50b3MgYWN1bXVsYWRvcywgbWFzIGR1YXMgc8OpcmllcyBjb20gdGVuZMOqbmNpYXMgcHLDs3ByaWFzIHBvZGVtIHBhcmVjZXIgcmVsYWNpb25hZGFzIGFwZW5hcyBwb3JxdWUgY3Jlc2NlbSBvdSBkaW1pbnVlbSBhbyBsb25nbyBkbyB0ZW1wby4gUGFyYSByZWR1emlyIGVzc2UgcHJvYmxlbWEsIG8gR3LDoWZpY28gMi41IHV0aWxpemEgYXMgdmFyaWHDp8O1ZXMgYW51YWlzIGRvIGPDom1iaW8gcmVhbCBlIGRvIGVtcHJlZ286DQoNCiQkDQpcRGVsdGEgVl90ID0NClxsZWZ0KA0KXGZyYWN7Vl90fQ0Ke1Zfe3QtMX19DQotIDENClxyaWdodCkNClx0aW1lcyAxMDANCiQkDQoNCk5vIGVpeG8gaG9yaXpvbnRhbCwgdmFsb3JlcyBwb3NpdGl2b3MgcmVwcmVzZW50YW0gZGVwcmVjaWHDp8OjbyByZWFsIGRvIHJlYWwgZSB2YWxvcmVzIG5lZ2F0aXZvcyBpbmRpY2FtIGFwcmVjaWHDp8Ojby4gTm8gZWl4byB2ZXJ0aWNhbCwgdmFsb3JlcyBwb3NpdGl2b3MgbW9zdHJhbSBhdW1lbnRvIGRvIGVtcHJlZ28sIGVucXVhbnRvIHZhbG9yZXMgbmVnYXRpdm9zIGNvcnJlc3BvbmRlbSDDoCByZWR1w6fDo28gZG8gbsO6bWVybyBkZSBvY3VwYWRvcy4gQ2FkYSBwb250byByZXByZXNlbnRhIGEgY29tYmluYcOnw6NvIG9ic2VydmFkYSBlbSB1bSBhbm8sIHNlcGFyYWRhbWVudGUgcGFyYSBhIEFncm9wZWN1w6FyaWEgZSBhIEluZMO6c3RyaWEgZ2VyYWwuDQoNCioqR3LDoWZpY28gMi41IOKAlCBWYXJpYcOnw6NvIGRvIGPDom1iaW8gcmVhbCBlIGVtcHJlZ28gc2V0b3JpYWwqKg0KDQpgYGB7ciBwMi1jYW1iaW8tZW1wcmVnby1zY2F0dGVyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIDEuIFZhbGlkYcOnw6NvIGRvIG9iamV0byBkYWRvc19ncmFmaWNvMg0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvMiBuw6NvIGV4aXN0ZS4gRXhlY3V0ZSBwcmltZWlybyBvIGNodW5rIGRvIEdyw6FmaWNvIDIuMi4iID0NCiAgICBleGlzdHMoImRhZG9zX2dyYWZpY28yIikNCikNCg0KY29sdW5hc19uZWNlc3Nhcmlhc19ncmFmaWNvNSA8LSBjKA0KICAiYW5vIiwNCiAgImNhbWJpb19yZWFsX21lZGlvIiwNCiAgIm9jdXBhZG9zX2Fncm9fbWlsIiwNCiAgIm9jdXBhZG9zX2luZHVzdHJpYV9taWwiDQopDQoNCnN0b3BpZm5vdCgNCiAgIk8gb2JqZXRvIGRhZG9zX2dyYWZpY28yIG7Do28gY29udMOpbSB0b2RhcyBhcyB2YXJpw6F2ZWlzIG5lY2Vzc8Ohcmlhcy4iID0NCiAgICBhbGwoDQogICAgICBjb2x1bmFzX25lY2Vzc2FyaWFzX2dyYWZpY281ICVpbiUNCiAgICAgICAgbmFtZXMoZGFkb3NfZ3JhZmljbzIpDQogICAgKQ0KKQ0KDQpkYWRvc19iYXNlX2dyYWZpY281IDwtIGRhZG9zX2dyYWZpY28yIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgZHBseXI6OmFsbF9vZihjb2x1bmFzX25lY2Vzc2FyaWFzX2dyYWZpY281KQ0KICApIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgYW5vID0gYXMuaW50ZWdlcihhbm8pDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoYW5vKQ0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvMiBuw6NvIHBvc3N1aSBleGF0YW1lbnRlIDE0IGFub3MuIiA9DQogICAgbnJvdyhkYWRvc19iYXNlX2dyYWZpY281KSA9PSAxNCwNCiAgIk8gb2JqZXRvIGRhZG9zX2dyYWZpY28yIG7Do28gY29udMOpbSB0b2RvcyBvcyBhbm9zIGRlIDIwMTIgYSAyMDI1LiIgPQ0KICAgIGFsbChkYWRvc19iYXNlX2dyYWZpY281JGFubyA9PSAyMDEyOjIwMjUpLA0KICAiRXhpc3RlbSBhbm9zIGR1cGxpY2Fkb3MgZW0gZGFkb3NfZ3JhZmljbzIuIiA9DQogICAgZHBseXI6Om5fZGlzdGluY3QoZGFkb3NfYmFzZV9ncmFmaWNvNSRhbm8pID09IDE0LA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIG5hcyB2YXJpw6F2ZWlzIHV0aWxpemFkYXMuIiA9DQogICAgIWFueU5BKGRhZG9zX2Jhc2VfZ3JhZmljbzUpLA0KICAiQSB0YXhhIGRlIGPDom1iaW8gZWZldGl2YSByZWFsIHBvc3N1aSB2YWxvcmVzIG7Do28gcG9zaXRpdm9zLiIgPQ0KICAgIGFsbChkYWRvc19iYXNlX2dyYWZpY281JGNhbWJpb19yZWFsX21lZGlvID4gMCksDQogICJPIGVtcHJlZ28gbmEgQWdyb3BlY3XDoXJpYSBwb3NzdWkgdmFsb3JlcyBuw6NvIHBvc2l0aXZvcy4iID0NCiAgICBhbGwoZGFkb3NfYmFzZV9ncmFmaWNvNSRvY3VwYWRvc19hZ3JvX21pbCA+IDApLA0KICAiTyBlbXByZWdvIG5hIEluZMO6c3RyaWEgZ2VyYWwgcG9zc3VpIHZhbG9yZXMgbsOjbyBwb3NpdGl2b3MuIiA9DQogICAgYWxsKGRhZG9zX2Jhc2VfZ3JhZmljbzUkb2N1cGFkb3NfaW5kdXN0cmlhX21pbCA+IDApDQopDQoNCiMgMi4gQ8OhbGN1bG8gZGFzIHZhcmlhw6fDtWVzIGFudWFpcw0KDQpkYWRvc192YXJpYWNvZXNfZ3JhZmljbzUgPC0gZGFkb3NfYmFzZV9ncmFmaWNvNSB8Pg0KICBkcGx5cjo6YXJyYW5nZShhbm8pIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgY2FtYmlvX3JlYWxfYXR1YWwgPQ0KICAgICAgY2FtYmlvX3JlYWxfbWVkaW8sDQogICAgY2FtYmlvX3JlYWxfYW50ZXJpb3IgPQ0KICAgICAgZHBseXI6OmxhZyhjYW1iaW9fcmVhbF9tZWRpbyksDQogICAgdmFyaWFjYW9fY2FtYmlvX3BjdCA9DQogICAgICAoDQogICAgICAgIGNhbWJpb19yZWFsX2F0dWFsIC8NCiAgICAgICAgICBjYW1iaW9fcmVhbF9hbnRlcmlvciAtIDENCiAgICAgICkgKiAxMDAsDQogICAgZW1wcmVnb19hZ3JvX2F0dWFsX21pbCA9DQogICAgICBvY3VwYWRvc19hZ3JvX21pbCwNCiAgICBlbXByZWdvX2Fncm9fYW50ZXJpb3JfbWlsID0NCiAgICAgIGRwbHlyOjpsYWcob2N1cGFkb3NfYWdyb19taWwpLA0KICAgIHZhcmlhY2FvX2VtcHJlZ29fYWdyb19wY3QgPQ0KICAgICAgKA0KICAgICAgICBlbXByZWdvX2Fncm9fYXR1YWxfbWlsIC8NCiAgICAgICAgICBlbXByZWdvX2Fncm9fYW50ZXJpb3JfbWlsIC0gMQ0KICAgICAgKSAqIDEwMCwNCiAgICBlbXByZWdvX2luZHVzdHJpYV9hdHVhbF9taWwgPQ0KICAgICAgb2N1cGFkb3NfaW5kdXN0cmlhX21pbCwNCiAgICBlbXByZWdvX2luZHVzdHJpYV9hbnRlcmlvcl9taWwgPQ0KICAgICAgZHBseXI6OmxhZyhvY3VwYWRvc19pbmR1c3RyaWFfbWlsKSwNCiAgICB2YXJpYWNhb19lbXByZWdvX2luZHVzdHJpYV9wY3QgPQ0KICAgICAgKA0KICAgICAgICBlbXByZWdvX2luZHVzdHJpYV9hdHVhbF9taWwgLw0KICAgICAgICAgIGVtcHJlZ29faW5kdXN0cmlhX2FudGVyaW9yX21pbCAtIDENCiAgICAgICkgKiAxMDANCiAgKSB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIGFubyA+PSAyMDEzLA0KICAgIGFubyA8PSAyMDI1DQogICkNCg0KIyAzLiBPcmdhbml6YcOnw6NvIG5vIGZvcm1hdG8gbG9uZ28NCg0KZGFkb3NfYWdyb19ncmFmaWNvNSA8LSBkYWRvc192YXJpYWNvZXNfZ3JhZmljbzUgfD4NCiAgZHBseXI6OnRyYW5zbXV0ZSgNCiAgICBhbm8sDQogICAgc2V0b3IgPSAiQWdyb3BlY3XDoXJpYSIsDQogICAgdmFyaWFjYW9fY2FtYmlvX3BjdCwNCiAgICB2YXJpYWNhb19lbXByZWdvX3BjdCA9DQogICAgICB2YXJpYWNhb19lbXByZWdvX2Fncm9fcGN0LA0KICAgIGNhbWJpb19yZWFsX2F0dWFsLA0KICAgIGNhbWJpb19yZWFsX2FudGVyaW9yLA0KICAgIGVtcHJlZ29fYXR1YWxfbWlsID0NCiAgICAgIGVtcHJlZ29fYWdyb19hdHVhbF9taWwsDQogICAgZW1wcmVnb19hbnRlcmlvcl9taWwgPQ0KICAgICAgZW1wcmVnb19hZ3JvX2FudGVyaW9yX21pbA0KICApDQoNCmRhZG9zX2luZHVzdHJpYV9ncmFmaWNvNSA8LSBkYWRvc192YXJpYWNvZXNfZ3JhZmljbzUgfD4NCiAgZHBseXI6OnRyYW5zbXV0ZSgNCiAgICBhbm8sDQogICAgc2V0b3IgPSAiSW5kw7pzdHJpYSBnZXJhbCIsDQogICAgdmFyaWFjYW9fY2FtYmlvX3BjdCwNCiAgICB2YXJpYWNhb19lbXByZWdvX3BjdCA9DQogICAgICB2YXJpYWNhb19lbXByZWdvX2luZHVzdHJpYV9wY3QsDQogICAgY2FtYmlvX3JlYWxfYXR1YWwsDQogICAgY2FtYmlvX3JlYWxfYW50ZXJpb3IsDQogICAgZW1wcmVnb19hdHVhbF9taWwgPQ0KICAgICAgZW1wcmVnb19pbmR1c3RyaWFfYXR1YWxfbWlsLA0KICAgIGVtcHJlZ29fYW50ZXJpb3JfbWlsID0NCiAgICAgIGVtcHJlZ29faW5kdXN0cmlhX2FudGVyaW9yX21pbA0KICApDQoNCmRhZG9zX2dyYWZpY281IDwtIGRwbHlyOjpiaW5kX3Jvd3MoDQogIGRhZG9zX2Fncm9fZ3JhZmljbzUsDQogIGRhZG9zX2luZHVzdHJpYV9ncmFmaWNvNQ0KKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGFubywNCiAgICBzZXRvciwNCiAgICB2YXJpYWNhb19jYW1iaW9fcGN0LA0KICAgIHZhcmlhY2FvX2VtcHJlZ29fcGN0LA0KICAgIGNhbWJpb19yZWFsX2F0dWFsLA0KICAgIGNhbWJpb19yZWFsX2FudGVyaW9yLA0KICAgIGVtcHJlZ29fYXR1YWxfbWlsLA0KICAgIGVtcHJlZ29fYW50ZXJpb3JfbWlsDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoDQogICAgc2V0b3IsDQogICAgYW5vDQogICkNCg0KIyA0LiBWYWxpZGHDp8OjbyBkbyBvYmpldG8gZGFkb3NfZ3JhZmljbzUNCg0KY29udGFnZW1fc2V0b3Jlc19ncmFmaWNvNSA8LSBkYWRvc19ncmFmaWNvNSB8Pg0KICBkcGx5cjo6Y291bnQoDQogICAgc2V0b3IsDQogICAgbmFtZSA9ICJvYnNlcnZhY29lcyINCiAgKQ0KDQphbm9zX3Bvcl9zZXRvcl9ncmFmaWNvNSA8LSBkYWRvc19ncmFmaWNvNSB8Pg0KICBkcGx5cjo6Z3JvdXBfYnkoc2V0b3IpIHw+DQogIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgcHJpbWVpcm9fYW5vID0gbWluKGFubyksDQogICAgdWx0aW1vX2FubyA9IG1heChhbm8pLA0KICAgIG51bWVyb19hbm9zID0gZHBseXI6Om5fZGlzdGluY3QoYW5vKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KY2FtYmlvX3Bvcl9hbm9fZ3JhZmljbzUgPC0gZGFkb3NfZ3JhZmljbzUgfD4NCiAgZHBseXI6Omdyb3VwX2J5KGFubykgfD4NCiAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICB2YWxvcmVzX2NhbWJpbyA9IGRwbHlyOjpuX2Rpc3RpbmN0KA0KICAgICAgcm91bmQodmFyaWFjYW9fY2FtYmlvX3BjdCwgMTIpDQogICAgKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KdmFsb3Jlc19udW1lcmljb3NfZ3JhZmljbzUgPC0gZGFkb3NfZ3JhZmljbzUgfD4NCiAgZHBseXI6OnNlbGVjdCgNCiAgICB3aGVyZShpcy5udW1lcmljKQ0KICApIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzUgbsOjbyBwb3NzdWkgZXhhdGFtZW50ZSAyNiBvYnNlcnZhw6fDtWVzLiIgPQ0KICAgIG5yb3coZGFkb3NfZ3JhZmljbzUpID09IDI2LA0KICAiT3Mgc2V0b3JlcyBkbyBvYmpldG8gZmluYWwgZXN0w6NvIGluY29ycmV0b3MuIiA9DQogICAgc2V0ZXF1YWwoDQogICAgICBkYWRvc19ncmFmaWNvNSRzZXRvciwNCiAgICAgIGMoDQogICAgICAgICJBZ3JvcGVjdcOhcmlhIiwNCiAgICAgICAgIkluZMO6c3RyaWEgZ2VyYWwiDQogICAgICApDQogICAgKSwNCiAgIkNhZGEgc2V0b3IgZGV2ZSBwb3NzdWlyIGV4YXRhbWVudGUgMTMgb2JzZXJ2YcOnw7Vlcy4iID0NCiAgICBhbGwoDQogICAgICBjb250YWdlbV9zZXRvcmVzX2dyYWZpY281JG9ic2VydmFjb2VzID09IDEzDQogICAgKSwNCiAgIkNhZGEgc2V0b3IgZGV2ZSBjb250ZXIgb3MgYW5vcyBkZSAyMDEzIGEgMjAyNS4iID0NCiAgICBhbGwoDQogICAgICBhbm9zX3Bvcl9zZXRvcl9ncmFmaWNvNSRwcmltZWlyb19hbm8gPT0gMjAxMywNCiAgICAgIGFub3NfcG9yX3NldG9yX2dyYWZpY281JHVsdGltb19hbm8gPT0gMjAyNSwNCiAgICAgIGFub3NfcG9yX3NldG9yX2dyYWZpY281JG51bWVyb19hbm9zID09IDEzDQogICAgKSwNCiAgIkV4aXN0ZW0gY29tYmluYcOnw7VlcyBkdXBsaWNhZGFzIGRlIGFubyBlIHNldG9yLiIgPQ0KICAgIGRwbHlyOjpuX2Rpc3RpbmN0KA0KICAgICAgcGFzdGUoDQogICAgICAgIGRhZG9zX2dyYWZpY281JGFubywNCiAgICAgICAgZGFkb3NfZ3JhZmljbzUkc2V0b3INCiAgICAgICkNCiAgICApID09IDI2LA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIG5vIG9iamV0byBkYWRvc19ncmFmaWNvNS4iID0NCiAgICAhYW55TkEoZGFkb3NfZ3JhZmljbzUpLA0KICAiRXhpc3RlbSB2YWxvcmVzIGluZmluaXRvcyBubyBvYmpldG8gZGFkb3NfZ3JhZmljbzUuIiA9DQogICAgYWxsKGlzLmZpbml0ZSh2YWxvcmVzX251bWVyaWNvc19ncmFmaWNvNSkpLA0KICAiT3Mgc2V0b3JlcyBhcHJlc2VudGFtIHZhbG9yZXMgY2FtYmlhaXMgZGlmZXJlbnRlcyBubyBtZXNtbyBhbm8uIiA9DQogICAgYWxsKGNhbWJpb19wb3JfYW5vX2dyYWZpY281JHZhbG9yZXNfY2FtYmlvID09IDEpLA0KICAiQSB2YXJpYcOnw6NvIGFudWFsIGRvIGPDom1iaW8gZm9pIGNhbGN1bGFkYSBpbmNvcnJldGFtZW50ZS4iID0NCiAgICBhbGwoDQogICAgICBhYnMoDQogICAgICAgIGRhZG9zX2dyYWZpY281JHZhcmlhY2FvX2NhbWJpb19wY3QgLQ0KICAgICAgICAgICgNCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY281JGNhbWJpb19yZWFsX2F0dWFsIC8NCiAgICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzUkY2FtYmlvX3JlYWxfYW50ZXJpb3IgLSAxDQogICAgICAgICAgKSAqIDEwMA0KICAgICAgKSA8IDFlLTEwDQogICAgKSwNCiAgIkEgdmFyaWHDp8OjbyBhbnVhbCBkbyBlbXByZWdvIGZvaSBjYWxjdWxhZGEgaW5jb3JyZXRhbWVudGUuIiA9DQogICAgYWxsKA0KICAgICAgYWJzKA0KICAgICAgICBkYWRvc19ncmFmaWNvNSR2YXJpYWNhb19lbXByZWdvX3BjdCAtDQogICAgICAgICAgKA0KICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzUkZW1wcmVnb19hdHVhbF9taWwgLw0KICAgICAgICAgICAgICBkYWRvc19ncmFmaWNvNSRlbXByZWdvX2FudGVyaW9yX21pbCAtIDENCiAgICAgICAgICApICogMTAwDQogICAgICApIDwgMWUtMTANCiAgICApDQopDQoNCiMgNS4gUHJlcGFyYcOnw6NvIGRvcyBwb250b3MgZSBsaW1pdGVzDQoNCmRhZG9zX2Fncm9fcGxvdCA8LSBkYWRvc19ncmFmaWNvNSB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIHNldG9yID09ICJBZ3JvcGVjdcOhcmlhIg0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKGFubykNCg0KZGFkb3NfaW5kdXN0cmlhX3Bsb3QgPC0gZGFkb3NfZ3JhZmljbzUgfD4NCiAgZHBseXI6OmZpbHRlcigNCiAgICBzZXRvciA9PSAiSW5kw7pzdHJpYSBnZXJhbCINCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShhbm8pDQoNCmNyaWFyX3BvbnRvc19ncmFmaWNvNSA8LSBmdW5jdGlvbihkYWRvc19zZXRvcikgew0KICBsYXBwbHkoDQogICAgc2VxX2xlbihucm93KGRhZG9zX3NldG9yKSksDQogICAgZnVuY3Rpb24oaSkgew0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IGRhZG9zX3NldG9yJHZhcmlhY2FvX2NhbWJpb19wY3RbaV0sDQogICAgICAgIHkgPSBkYWRvc19zZXRvciR2YXJpYWNhb19lbXByZWdvX3BjdFtpXSwNCiAgICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgICBhbm8gPQ0KICAgICAgICAgICAgZGFkb3Nfc2V0b3IkYW5vW2ldLA0KICAgICAgICAgIHNldG9yID0NCiAgICAgICAgICAgIGRhZG9zX3NldG9yJHNldG9yW2ldLA0KICAgICAgICAgIHZhcmlhY2FvX2NhbWJpb19wY3QgPQ0KICAgICAgICAgICAgZGFkb3Nfc2V0b3IkdmFyaWFjYW9fY2FtYmlvX3BjdFtpXSwNCiAgICAgICAgICB2YXJpYWNhb19lbXByZWdvX3BjdCA9DQogICAgICAgICAgICBkYWRvc19zZXRvciR2YXJpYWNhb19lbXByZWdvX3BjdFtpXSwNCiAgICAgICAgICBjYW1iaW9fcmVhbF9hdHVhbCA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRjYW1iaW9fcmVhbF9hdHVhbFtpXSwNCiAgICAgICAgICBjYW1iaW9fcmVhbF9hbnRlcmlvciA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRjYW1iaW9fcmVhbF9hbnRlcmlvcltpXSwNCiAgICAgICAgICBlbXByZWdvX2F0dWFsX21pbCA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRlbXByZWdvX2F0dWFsX21pbFtpXSwNCiAgICAgICAgICBlbXByZWdvX2FudGVyaW9yX21pbCA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRlbXByZWdvX2FudGVyaW9yX21pbFtpXQ0KICAgICAgICApDQogICAgICApDQogICAgfQ0KICApDQp9DQoNCnBvbnRvc19hZ3JvX2dyYWZpY281IDwtIGNyaWFyX3BvbnRvc19ncmFmaWNvNSgNCiAgZGFkb3NfYWdyb19wbG90DQopDQoNCnBvbnRvc19pbmR1c3RyaWFfZ3JhZmljbzUgPC0gY3JpYXJfcG9udG9zX2dyYWZpY281KA0KICBkYWRvc19pbmR1c3RyaWFfcGxvdA0KKQ0KDQphbXBsaXR1ZGVfeCA8LSBkaWZmKA0KICByYW5nZSgNCiAgICBkYWRvc19ncmFmaWNvNSR2YXJpYWNhb19jYW1iaW9fcGN0LA0KICAgIDANCiAgKQ0KKQ0KDQphbXBsaXR1ZGVfeSA8LSBkaWZmKA0KICByYW5nZSgNCiAgICBkYWRvc19ncmFmaWNvNSR2YXJpYWNhb19lbXByZWdvX3BjdCwNCiAgICAwDQogICkNCikNCg0KbWFyZ2VtX3ggPC0gbWF4KA0KICBhbXBsaXR1ZGVfeCAqIDAuMDgsDQogIDENCikNCg0KbWFyZ2VtX3kgPC0gbWF4KA0KICBhbXBsaXR1ZGVfeSAqIDAuMTAsDQogIDAuNQ0KKQ0KDQpsaW1pdGVfeF9taW4gPC0gZmxvb3IoDQogICgNCiAgICBtaW4oDQogICAgICBkYWRvc19ncmFmaWNvNSR2YXJpYWNhb19jYW1iaW9fcGN0LA0KICAgICAgMA0KICAgICkgLSBtYXJnZW1feA0KICApICogMTANCikgLyAxMA0KDQpsaW1pdGVfeF9tYXggPC0gY2VpbGluZygNCiAgKA0KICAgIG1heCgNCiAgICAgIGRhZG9zX2dyYWZpY281JHZhcmlhY2FvX2NhbWJpb19wY3QsDQogICAgICAwDQogICAgKSArIG1hcmdlbV94DQogICkgKiAxMA0KKSAvIDEwDQoNCmxpbWl0ZV95X21pbiA8LSBmbG9vcigNCiAgKA0KICAgIG1pbigNCiAgICAgIGRhZG9zX2dyYWZpY281JHZhcmlhY2FvX2VtcHJlZ29fcGN0LA0KICAgICAgMA0KICAgICkgLSBtYXJnZW1feQ0KICApICogMTANCikgLyAxMA0KDQpsaW1pdGVfeV9tYXggPC0gY2VpbGluZygNCiAgKA0KICAgIG1heCgNCiAgICAgIGRhZG9zX2dyYWZpY281JHZhcmlhY2FvX2VtcHJlZ29fcGN0LA0KICAgICAgMA0KICAgICkgKyBtYXJnZW1feQ0KICApICogMTANCikgLyAxMA0KDQojIDYuIENvbnN0cnXDp8OjbyBkbyBncsOhZmljbw0KDQpncmFmaWNvIDwtIGhpZ2hjaGFydGVyOjpoaWdoY2hhcnQoKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2hhcnQoDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBoZWlnaHQgPSA1MjAsDQogICAgYmFja2dyb3VuZENvbG9yID0gIiNGRkZGRkYiLA0KICAgIHpvb21UeXBlID0gInh5IiwNCiAgICBzcGFjaW5nQm90dG9tID0gNTUNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3NlcmllcygNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG5hbWUgPSAiQWdyb3BlY3XDoXJpYSIsDQogICAgZGF0YSA9IHBvbnRvc19hZ3JvX2dyYWZpY281LA0KICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgY29yZXNfaWJtYWNyb1siYW1hcmVsbyJdDQogICAgKSwNCiAgICBvcGFjaXR5ID0gMC44NSwNCiAgICBsaW5lV2lkdGggPSAwLA0KICAgIG1hcmtlciA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLA0KICAgICAgcmFkaXVzID0gNSwNCiAgICAgIGxpbmVXaWR0aCA9IDEsDQogICAgICBsaW5lQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNywNCiAgICAgICAgICBsaW5lV2lkdGggPSAxLjUsDQogICAgICAgICAgbGluZUNvbG9yID0gIiNGRkZGRkYiDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBuYW1lID0gIkluZMO6c3RyaWEgZ2VyYWwiLA0KICAgIGRhdGEgPSBwb250b3NfaW5kdXN0cmlhX2dyYWZpY281LA0KICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgY29yZXNfaWJtYWNyb1siYXp1bF9jbGFybyJdDQogICAgKSwNCiAgICBvcGFjaXR5ID0gMC44NSwNCiAgICBsaW5lV2lkdGggPSAwLA0KICAgIG1hcmtlciA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLA0KICAgICAgcmFkaXVzID0gNSwNCiAgICAgIGxpbmVXaWR0aCA9IDEsDQogICAgICBsaW5lQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNywNCiAgICAgICAgICBsaW5lV2lkdGggPSAxLjUsDQogICAgICAgICAgbGluZUNvbG9yID0gIiNGRkZGRkYiDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkNCg0KIyA3LiBGb3JtYXRhw6fDo28NCg0KZ3JhZmljbyA8LSBncmFmaWNvIHw+DQogIGhpZ2hjaGFydGVyOjpoY19hZGRfdGhlbWUoDQogICAgdGVtYV9pYm1hY3JvDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3RpdGxlKA0KICAgIHRleHQgPSAiVmFyaWHDp8OjbyBkbyBjw6JtYmlvIHJlYWwgZSBlbXByZWdvIHNldG9yaWFsIg0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19zdWJ0aXRsZSgNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkFzc29jaWHDp8OjbyBlbnRyZSBhcyB2YXJpYcOnw7VlcyBhbnVhaXMgZGEgdGF4YSBkZSBjw6JtYmlvICIsDQogICAgICAiZWZldGl2YSByZWFsIGUgZG8gZW1wcmVnbyDigJQgQnJhc2lsLCAyMDEz4oCTMjAyNSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3hBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiVmFyaWHDp8OjbyBhbnVhbCBkYSB0YXhhIGRlIGPDom1iaW8gZWZldGl2YSByZWFsICglKSINCiAgICApLA0KICAgIG1pbiA9IGxpbWl0ZV94X21pbiwNCiAgICBtYXggPSBsaW1pdGVfeF9tYXgsDQogICAgc3RhcnRPblRpY2sgPSBGQUxTRSwNCiAgICBlbmRPblRpY2sgPSBGQUxTRSwNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHRoaXMudmFsdWUsDQogICAgICAgICAgICAyLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKSArICclJzsNCiAgICAgICAgfSINCiAgICAgICkNCiAgICApLA0KICAgIHBsb3RMaW5lcyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB2YWx1ZSA9IDAsDQogICAgICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgICAgIGNvcmVzX2libWFjcm9bImNpbnphIl0NCiAgICAgICAgKSwNCiAgICAgICAgZGFzaFN0eWxlID0gIlNob3J0RG90IiwNCiAgICAgICAgd2lkdGggPSAxLjIsDQogICAgICAgIHpJbmRleCA9IDQsDQogICAgICAgIGxhYmVsID0gbGlzdCgNCiAgICAgICAgICB0ZXh0ID0gIkPDom1iaW8gZXN0w6F2ZWwiLA0KICAgICAgICAgIGFsaWduID0gInJpZ2h0IiwNCiAgICAgICAgICByb3RhdGlvbiA9IDAsDQogICAgICAgICAgeCA9IC02LA0KICAgICAgICAgIHkgPSAxNCwNCiAgICAgICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgICAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgICAgICAgICAgY29yZXNfaWJtYWNyb1siY2luemEiXQ0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgICAgICAgKQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY195QXhpcygNCiAgICB0aXRsZSA9IGxpc3QoDQogICAgICB0ZXh0ID0gIlZhcmlhw6fDo28gYW51YWwgZG8gZW1wcmVnbyAoJSkiDQogICAgKSwNCiAgICBtaW4gPSBsaW1pdGVfeV9taW4sDQogICAgbWF4ID0gbGltaXRlX3lfbWF4LA0KICAgIHN0YXJ0T25UaWNrID0gRkFMU0UsDQogICAgZW5kT25UaWNrID0gRkFMU0UsDQogICAgbGFiZWxzID0gbGlzdCgNCiAgICAgIGZvcm1hdHRlciA9IGh0bWx3aWRnZXRzOjpKUygNCiAgICAgICAgImZ1bmN0aW9uICgpIHsNCiAgICAgICAgICByZXR1cm4gSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICB0aGlzLnZhbHVlLA0KICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICcsJywNCiAgICAgICAgICAgICcuJw0KICAgICAgICAgICkgKyAnJSc7DQogICAgICAgIH0iDQogICAgICApDQogICAgKSwNCiAgICBwbG90TGluZXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgdmFsdWUgPSAwLA0KICAgICAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgICAgICBjb3Jlc19pYm1hY3JvWyJjaW56YSJdDQogICAgICAgICksDQogICAgICAgIGRhc2hTdHlsZSA9ICJTaG9ydERvdCIsDQogICAgICAgIHdpZHRoID0gMS4yLA0KICAgICAgICB6SW5kZXggPSA0LA0KICAgICAgICBsYWJlbCA9IGxpc3QoDQogICAgICAgICAgdGV4dCA9ICJFbXByZWdvIGVzdMOhdmVsIiwNCiAgICAgICAgICBhbGlnbiA9ICJyaWdodCIsDQogICAgICAgICAgeCA9IC03LA0KICAgICAgICAgIHkgPSAtNywNCiAgICAgICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgICAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgICAgICAgICAgY29yZXNfaWJtYWNyb1siY2luemEiXQ0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgICAgICAgKQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19wbG90T3B0aW9ucygNCiAgICBzY2F0dGVyID0gbGlzdCgNCiAgICAgIGxpbmVXaWR0aCA9IDAsDQogICAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICAgIGRhdGFMYWJlbHMgPSBsaXN0KA0KICAgICAgICBlbmFibGVkID0gRkFMU0UNCiAgICAgICksDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBpbmFjdGl2ZSA9IGxpc3QoDQogICAgICAgICAgb3BhY2l0eSA9IDAuMzUNCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICksDQogICAgc2VyaWVzID0gbGlzdCgNCiAgICAgIGFuaW1hdGlvbiA9IFRSVUUsDQogICAgICBzaGFkb3cgPSBGQUxTRQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfdG9vbHRpcCgNCiAgICBzaGFyZWQgPSBGQUxTRSwNCiAgICB1c2VIVE1MID0gVFJVRSwNCiAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICBjb25zdCBkID0gdGhpcy5wb2ludC5jdXN0b207DQoNCiAgICAgICAgY29uc3QgbmYgPSBmdW5jdGlvbih2YWxvcikgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHZhbG9yLA0KICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICcsJywNCiAgICAgICAgICAgICcuJw0KICAgICAgICAgICk7DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3QgZm9ybWF0YXJWYXJpYWNhbyA9IGZ1bmN0aW9uKHZhbG9yKSB7DQogICAgICAgICAgY29uc3Qgc2luYWwgPQ0KICAgICAgICAgICAgdmFsb3IgPiAwID8gJysnIDoNCiAgICAgICAgICAgIHZhbG9yIDwgMCA/ICfiiJInIDogJyc7DQoNCiAgICAgICAgICByZXR1cm4gc2luYWwgKw0KICAgICAgICAgICAgbmYoTWF0aC5hYnModmFsb3IpKSArDQogICAgICAgICAgICAnJSc7DQogICAgICAgIH07DQoNCiAgICAgICAgcmV0dXJuICgNCiAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1pbi13aWR0aDozMjBweDtwYWRkaW5nOjRweCAycHg7XCI+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6Ym9sZDsnICsNCiAgICAgICAgICAgICAgJ21hcmdpbi1ib3R0b206OHB4O2NvbG9yOiMxMTE4Mjc7XCI+JyArDQogICAgICAgICAgICAgIGQuc2V0b3IgKw0KICAgICAgICAgICAgICAnIOKAlCAnICsNCiAgICAgICAgICAgICAgZC5hbm8gKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OXB4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPicgKw0KICAgICAgICAgICAgICAgICdUYXhhIGRlIGPDom1iaW8gZWZldGl2YSByZWFsJyArDQogICAgICAgICAgICAgICc8L3NwYW4+PGJyPicgKw0KICAgICAgICAgICAgICAnVmFyaWHDp8OjbyBhbnVhbDogPGI+JyArDQogICAgICAgICAgICAgICAgZm9ybWF0YXJWYXJpYWNhbygNCiAgICAgICAgICAgICAgICAgIGQudmFyaWFjYW9fY2FtYmlvX3BjdA0KICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgICAnPC9iPjxicj4nICsNCiAgICAgICAgICAgICAgJ1ZhbG9yIG5vIGFubyBhbnRlcmlvcjogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5jYW1iaW9fcmVhbF9hbnRlcmlvcikgKw0KICAgICAgICAgICAgICAnPC9iPjxicj4nICsNCiAgICAgICAgICAgICAgJ1ZhbG9yIG5vIGFubyBjb3JyZW50ZTogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5jYW1iaW9fcmVhbF9hdHVhbCkgKw0KICAgICAgICAgICAgICAnPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdj4nICsNCiAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6Ym9sZDtcIj4nICsNCiAgICAgICAgICAgICAgICAnRW1wcmVnbyBubyBzZXRvcicgKw0KICAgICAgICAgICAgICAnPC9zcGFuPjxicj4nICsNCiAgICAgICAgICAgICAgJ1Zhcmlhw6fDo28gYW51YWw6IDxiPicgKw0KICAgICAgICAgICAgICAgIGZvcm1hdGFyVmFyaWFjYW8oDQogICAgICAgICAgICAgICAgICBkLnZhcmlhY2FvX2VtcHJlZ29fcGN0DQogICAgICAgICAgICAgICAgKSArDQogICAgICAgICAgICAgICc8L2I+PGJyPicgKw0KICAgICAgICAgICAgICAnT2N1cGFkb3Mgbm8gYW5vIGFudGVyaW9yOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLmVtcHJlZ29fYW50ZXJpb3JfbWlsKSArDQogICAgICAgICAgICAgICAgJyBtaWwgcGVzc29hczwvYj48YnI+JyArDQogICAgICAgICAgICAgICdPY3VwYWRvcyBubyBhbm8gY29ycmVudGU6IDxiPicgKw0KICAgICAgICAgICAgICAgIG5mKGQuZW1wcmVnb19hdHVhbF9taWwpICsNCiAgICAgICAgICAgICAgICAnIG1pbCBwZXNzb2FzPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgJzwvZGl2PicNCiAgICAgICAgKTsNCiAgICAgIH0iDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19sZWdlbmQoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiLA0KICAgIGFsaWduID0gImNlbnRlciIsDQogICAgdmVydGljYWxBbGlnbiA9ICJ0b3AiLA0KICAgIHkgPSA1NSwNCiAgICBmbG9hdGluZyA9IEZBTFNFLA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSBOVUxMDQogICAgKSwNCiAgICBzeW1ib2xXaWR0aCA9IDEyLA0KICAgIHN5bWJvbEhlaWdodCA9IDEyLA0KICAgIHN5bWJvbFJhZGl1cyA9IDYsDQogICAgaXRlbURpc3RhbmNlID0gMjUNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2FwdGlvbigNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIk5vdGE6IHZhbG9yZXMgcG9zaXRpdm9zIG5vIGVpeG8gaG9yaXpvbnRhbCBpbmRpY2FtIGRlcHJlY2lhw6fDo28gIiwNCiAgICAgICJyZWFsIGRvIHJlYWwuIENhZGEgcG9udG8gcmVwcmVzZW50YSBhIHZhcmlhw6fDo28gZGUgdW0gYW5vIGVtIHJlbGHDp8OjbyAiLA0KICAgICAgImFvIGFudGVyaW9yLiBPIGdyw6FmaWNvIG1vc3RyYSBhc3NvY2lhw6fDo28gY29udGVtcG9yw6JuZWEsIG7Do28gdW1hICIsDQogICAgICAicmVsYcOnw6NvIGNhdXNhbCBlbnRyZSBjw6JtYmlvIGUgZW1wcmVnby4iDQogICAgKSwNCiAgICBhbGlnbiA9ICJsZWZ0IiwNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjb2xvciA9ICIjNkI3MjgwIiwNCiAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19leHBvcnRpbmcoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgZmlsZW5hbWUgPSAidmFyaWFjYW8tY2FtYmlvLXJlYWwtZS1lbXByZWdvLXNldG9yaWFsLTIwMTMtMjAyNSINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY3JlZGl0cygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkZvbnRlOiBCYW5jbyBDZW50cmFsIGRvIEJyYXNpbCDigJMgU0dTIDExNzUyIGUgIiwNCiAgICAgICJJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyBTSURSQSA0MzYyLiAiLA0KICAgICAgIkVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYk1hY3JvIEJILiINCiAgICApLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkNCg0KIyA4LiBFeGliacOnw6NvDQoNCmdyYWZpY28NCg0KYGBgDQpPcyBwb250b3MgYXBhcmVjZW0gbm9zIHF1YXRybyBxdWFkcmFudGVzLCBzZW0gZm9ybWFyIHVtYSBkaXJlw6fDo28gZXN0w6F2ZWwuIEVtIDIwMjAsIHVtYSBkZXByZWNpYcOnw6NvIHJlYWwgcHLDs3hpbWEgZGUgMzAlIGNvaW5jaWRpdSBjb20gcXVlZGEgZG8gZW1wcmVnbyBub3MgZG9pcyBzZXRvcmVzLCByZXN1bHRhZG8gZG9taW5hZG8gcGVsYSBwYW5kZW1pYS4gTm8gYW5vIHNlZ3VpbnRlLCB1bWEgbm92YSBkZXByZWNpYcOnw6NvLCBiZW0gbWVub3IsIG9jb3JyZXUganVudG8gZGUgdW1hIHJlY3VwZXJhw6fDo28gcHLDs3hpbWEgZGUgMTAlIG5vIGVtcHJlZ28gYWdyb3BlY3XDoXJpbywgZW5xdWFudG8gb3V0cm9zIGFub3MgcmVnaXN0cmFyYW0gYXVtZW50byBkYSBvY3VwYcOnw6NvIGluZHVzdHJpYWwgbWVzbW8gY29tIGFwcmVjaWHDp8OjbyBjYW1iaWFsLiANCg0KQSBkaXNwZXJzw6NvIG7Do28gc2lnbmlmaWNhIHF1ZSBvIGPDom1iaW8gc2VqYSBpcnJlbGV2YW50ZSwgbWFzIG1vc3RyYSBxdWUgc2V1IGVmZWl0byBjb250ZW1wb3LDom5lbyDDqSBhdHJhdmVzc2FkbyBwb3Igb3V0cmFzIGNvbmRpw6fDtWVzLiBEZW1hbmRhIGRvbcOpc3RpY2EsIHByZcOnb3MgZGFzIGNvbW1vZGl0aWVzLCBjdXN0b3MgaW1wb3J0YWRvcywganVyb3MsIHByb2R1dGl2aWRhZGUgZSBjaG9xdWVzIGV4Y2VwY2lvbmFpcyBwb2RlbSByZWZvcsOnYXIgb3UgYW51bGFyIG8gaW1wdWxzbyBjYW1iaWFsLiBBbMOpbSBkaXNzbywgZGVjaXPDtWVzIGRlIGludmVzdGltZW50byBlIGNvbnRyYXRhw6fDo28gbGV2YW0gdGVtcG8sIGRlIG1vZG8gcXVlIHBhcnRlIGRhIHJlc3Bvc3RhIHBvZGUgc3VyZ2lyIGRlcG9pcyBkbyBhbm8gZW0gcXVlIG8gY8OibWJpbyBtdWRvdS4NCg0KIyMgMi42IERpZmVyZW7Dp2EgZGUgcmVuZGltZW50byBlbnRyZSBhIEluZMO6c3RyaWEgZ2VyYWwgZSBhIEFncm9wZWN1w6FyaWENCg0KQSBtdWRhbsOnYSBuYSBjb21wb3Npw6fDo28gZG8gZW1wcmVnbyB0YW1iw6ltIGFmZXRhIGEgcmVuZGEgcG9ycXVlIG9zIHNldG9yZXMgYXByZXNlbnRhbSBuw612ZWlzIG3DqWRpb3MgZGUgcmVtdW5lcmHDp8OjbyBkaXN0aW50b3MuIFBhcmEgYWNvbXBhbmhhciBlc3NhIGRpZmVyZW7Dp2EsIGZvcmFtIGNhbGN1bGFkb3MgdGFudG8gbyB2YWxvciBhYnNvbHV0byBxdWUgc2VwYXJhIG9zIHJlbmRpbWVudG9zIHF1YW50byBvIHBlcmNlbnR1YWwgcGVsbyBxdWFsIGEgcmVuZGEgaW5kdXN0cmlhbCBzdXBlcmEgYSBhZ3JvcGVjdcOhcmlhOg0KDQokJA0KRF90ID0NClJfe1xtYXRocm17aW5kfSx0fQ0KLQ0KUl97XG1hdGhybXthZ3JvfSx0fQ0KJCQNCg0KJCQNClBfdCA9DQpcbGVmdCgNClxmcmFje1Jfe1xtYXRocm17aW5kfSx0fX0NCntSX3tcbWF0aHJte2Fncm99LHR9fQ0KLSAxDQpccmlnaHQpDQpcdGltZXMgMTAwDQokJA0KDQpBIEFncm9wZWN1w6FyaWEgZm9pIHV0aWxpemFkYSBjb21vIGJhc2UgZGEgY29tcGFyYcOnw6NvLiBQb3J0YW50bywgdW0gcmVzdWx0YWRvIGRlIDUwJSBzaWduaWZpY2EgcXVlIG8gcmVuZGltZW50byBtw6lkaW8gcmVhbCBkYSBJbmTDunN0cmlhIGdlcmFsIGVyYSA1MCUgbWFpb3IgbmFxdWVsZSB0cmltZXN0cmUuDQoNCioqR3LDoWZpY28gMi42IOKAlCBEaWZlcmVuw6dhIGRlIHJlbmRpbWVudG8gZW50cmUgYSBpbmTDunN0cmlhIGUgYSBhZ3JvcGVjdcOhcmlhKioNCg0KYGBge3IgcDItZGlmZXJlbmNhLXJlbmRpbWVudG8tc2V0b3JpYWwsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgMS4gVmFsaWRhw6fDo28gZG8gb2JqZXRvIGRhZG9zX2dyYWZpY28zDQoNCnN0b3BpZm5vdCgNCiAgIk8gb2JqZXRvIGRhZG9zX2dyYWZpY28zIG7Do28gZXhpc3RlLiBFeGVjdXRlIHByaW1laXJvIG8gY2h1bmsgZG8gR3LDoWZpY28gMi4zLiIgPQ0KICAgIGV4aXN0cygiZGFkb3NfZ3JhZmljbzMiKQ0KKQ0KDQpjb2x1bmFzX25lY2Vzc2FyaWFzX2dyYWZpY282IDwtIGMoDQogICJkYXRhX3RyaW1lc3RyZSIsDQogICJhbm8iLA0KICAidHJpbWVzdHJlIiwNCiAgInBlcmlvZG8iLA0KICAicmVuZGltZW50b19hZ3JvX3JlYWwiLA0KICAicmVuZGltZW50b19pbmR1c3RyaWFfcmVhbCINCikNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzMgbsOjbyBjb250w6ltIHRvZGFzIGFzIHZhcmnDoXZlaXMgbmVjZXNzw6FyaWFzLiIgPQ0KICAgIGFsbCgNCiAgICAgIGNvbHVuYXNfbmVjZXNzYXJpYXNfZ3JhZmljbzYgJWluJQ0KICAgICAgICBuYW1lcyhkYWRvc19ncmFmaWNvMykNCiAgICApDQopDQoNCmRhZG9zX29yaWdlbV9ncmFmaWNvNiA8LSBkYWRvc19ncmFmaWNvMyB8Pg0KICBkcGx5cjo6dHJhbnNtdXRlKA0KICAgIGRhdGFfdHJpbWVzdHJlID0gYXMuRGF0ZShkYXRhX3RyaW1lc3RyZSksDQogICAgYW5vID0gYXMuaW50ZWdlcihhbm8pLA0KICAgIHRyaW1lc3RyZSA9IGFzLmludGVnZXIodHJpbWVzdHJlKSwNCiAgICBwZXJpb2RvID0gYXMuY2hhcmFjdGVyKHBlcmlvZG8pLA0KICAgIHJlbmRpbWVudG9fYWdyb19yZWFsID0NCiAgICAgIGFzLm51bWVyaWMocmVuZGltZW50b19hZ3JvX3JlYWwpLA0KICAgIHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwgPQ0KICAgICAgYXMubnVtZXJpYyhyZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsKQ0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKGRhdGFfdHJpbWVzdHJlKQ0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvMyBuw6NvIHBvc3N1aSBleGF0YW1lbnRlIDU2IG9ic2VydmHDp8O1ZXMuIiA9DQogICAgbnJvdyhkYWRvc19vcmlnZW1fZ3JhZmljbzYpID09IDU2LA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzMgbsOjbyBjb21lw6dhIG5vIDHCuiB0cmltZXN0cmUgZGUgMjAxMi4iID0NCiAgICBtaW4oZGFkb3Nfb3JpZ2VtX2dyYWZpY282JGRhdGFfdHJpbWVzdHJlKSA9PQ0KICAgICAgYXMuRGF0ZSgiMjAxMi0wMS0wMSIpLA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzMgbsOjbyB0ZXJtaW5hIG5vIDTCuiB0cmltZXN0cmUgZGUgMjAyNS4iID0NCiAgICBtYXgoZGFkb3Nfb3JpZ2VtX2dyYWZpY282JGRhdGFfdHJpbWVzdHJlKSA9PQ0KICAgICAgYXMuRGF0ZSgiMjAyNS0xMC0wMSIpLA0KICAiRXhpc3RlbSB0cmltZXN0cmVzIGR1cGxpY2Fkb3Mgbm8gb2JqZXRvIGRhZG9zX2dyYWZpY28zLiIgPQ0KICAgIGRwbHlyOjpuX2Rpc3RpbmN0KA0KICAgICAgZGFkb3Nfb3JpZ2VtX2dyYWZpY282JGRhdGFfdHJpbWVzdHJlDQogICAgKSA9PSA1NiwNCiAgIk9zIGRhZG9zIGRlIG9yaWdlbSBuw6NvIGVzdMOjbyBlbSBvcmRlbSBjcm9ub2zDs2dpY2EuIiA9DQogICAgYWxsKA0KICAgICAgZGlmZihkYWRvc19vcmlnZW1fZ3JhZmljbzYkZGF0YV90cmltZXN0cmUpID4gMA0KICAgICksDQogICJFeGlzdGVtIHZhbG9yZXMgYXVzZW50ZXMgbmFzIHZhcmnDoXZlaXMgdXRpbGl6YWRhcy4iID0NCiAgICAhYW55TkEoZGFkb3Nfb3JpZ2VtX2dyYWZpY282KSwNCiAgIk8gcmVuZGltZW50byBkYSBBZ3JvcGVjdcOhcmlhIHBvc3N1aSB2YWxvcmVzIG7Do28gcG9zaXRpdm9zLiIgPQ0KICAgIGFsbCgNCiAgICAgIGRhZG9zX29yaWdlbV9ncmFmaWNvNiRyZW5kaW1lbnRvX2Fncm9fcmVhbCA+IDANCiAgICApLA0KICAiTyByZW5kaW1lbnRvIGRhIEluZMO6c3RyaWEgZ2VyYWwgcG9zc3VpIHZhbG9yZXMgbsOjbyBwb3NpdGl2b3MuIiA9DQogICAgYWxsKA0KICAgICAgZGFkb3Nfb3JpZ2VtX2dyYWZpY282JHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwgPiAwDQogICAgKQ0KKQ0KDQojIDIuIEPDoWxjdWxvIGRhIGRpZmVyZW7Dp2EgYWJzb2x1dGEgZGUgcmVuZGltZW50bw0KDQpkYWRvc19ncmFmaWNvNiA8LSBkYWRvc19vcmlnZW1fZ3JhZmljbzYgfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBkaWZlcmVuY2FfcmVuZGFfcmVhaXMgPQ0KICAgICAgcmVuZGltZW50b19pbmR1c3RyaWFfcmVhbCAtDQogICAgICByZW5kaW1lbnRvX2Fncm9fcmVhbA0KICApDQoNCiMgMy4gQ8OhbGN1bG8gZG8gcHLDqm1pbyByZWxhdGl2byBkYSBpbmTDunN0cmlhDQoNCmRhZG9zX2dyYWZpY282IDwtIGRhZG9zX2dyYWZpY282IHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgcHJlbWlvX2luZHVzdHJpYV9wY3QgPQ0KICAgICAgKA0KICAgICAgICByZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsIC8NCiAgICAgICAgICByZW5kaW1lbnRvX2Fncm9fcmVhbCAtIDENCiAgICAgICkgKiAxMDANCiAgKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGRhdGFfdHJpbWVzdHJlLA0KICAgIGFubywNCiAgICB0cmltZXN0cmUsDQogICAgcGVyaW9kbywNCiAgICByZW5kaW1lbnRvX2Fncm9fcmVhbCwNCiAgICByZW5kaW1lbnRvX2luZHVzdHJpYV9yZWFsLA0KICAgIGRpZmVyZW5jYV9yZW5kYV9yZWFpcywNCiAgICBwcmVtaW9faW5kdXN0cmlhX3BjdA0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKGRhdGFfdHJpbWVzdHJlKQ0KDQojIDQuIE9yZ2FuaXphw6fDo28gZSB2YWxpZGHDp8OjbyBkbyBvYmpldG8gZGFkb3NfZ3JhZmljbzYNCg0KdHJpbWVzdHJlc19wb3JfYW5vX2dyYWZpY282IDwtIGRhZG9zX2dyYWZpY282IHw+DQogIGRwbHlyOjpjb3VudCgNCiAgICBhbm8sDQogICAgbmFtZSA9ICJudW1lcm9fdHJpbWVzdHJlcyINCiAgKQ0KDQp2YWxvcmVzX251bWVyaWNvc19ncmFmaWNvNiA8LSBkYWRvc19ncmFmaWNvNiB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIHdoZXJlKGlzLm51bWVyaWMpDQogICkgfD4NCiAgdW5saXN0KHVzZS5uYW1lcyA9IEZBTFNFKQ0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvNiBuw6NvIHBvc3N1aSBleGF0YW1lbnRlIDU2IG9ic2VydmHDp8O1ZXMuIiA9DQogICAgbnJvdyhkYWRvc19ncmFmaWNvNikgPT0gNTYsDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvNiBuw6NvIGNvbnTDqW0gdG9kb3Mgb3MgYW5vcyBkZSAyMDEyIGEgMjAyNS4iID0NCiAgICBucm93KHRyaW1lc3RyZXNfcG9yX2Fub19ncmFmaWNvNikgPT0gMTQgJiYNCiAgICBhbGwoDQogICAgICBhcy5pbnRlZ2VyKHRyaW1lc3RyZXNfcG9yX2Fub19ncmFmaWNvNiRhbm8pID09DQogICAgICAgIDIwMTI6MjAyNQ0KICAgICksDQogICJOZW0gdG9kb3Mgb3MgYW5vcyBwb3NzdWVtIHF1YXRybyB0cmltZXN0cmVzLiIgPQ0KICAgIGFsbCgNCiAgICAgIHRyaW1lc3RyZXNfcG9yX2Fub19ncmFmaWNvNiRudW1lcm9fdHJpbWVzdHJlcyA9PSA0DQogICAgKSwNCiAgIkV4aXN0ZW0gdHJpbWVzdHJlcyBkdXBsaWNhZG9zIG5vIG9iamV0byBkYWRvc19ncmFmaWNvNi4iID0NCiAgICBkcGx5cjo6bl9kaXN0aW5jdCgNCiAgICAgIGRhZG9zX2dyYWZpY282JGRhdGFfdHJpbWVzdHJlDQogICAgKSA9PSA1NiwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBhdXNlbnRlcyBubyBvYmpldG8gZGFkb3NfZ3JhZmljbzYuIiA9DQogICAgIWFueU5BKGRhZG9zX2dyYWZpY282KSwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBpbmZpbml0b3Mgbm8gb2JqZXRvIGRhZG9zX2dyYWZpY282LiIgPQ0KICAgIGFsbChpcy5maW5pdGUodmFsb3Jlc19udW1lcmljb3NfZ3JhZmljbzYpKSwNCiAgIkEgZGlmZXJlbsOnYSBhYnNvbHV0YSBkZSByZW5kaW1lbnRvIGZvaSBjYWxjdWxhZGEgaW5jb3JyZXRhbWVudGUuIiA9DQogICAgYWxsKA0KICAgICAgYWJzKA0KICAgICAgICBkYWRvc19ncmFmaWNvNiRkaWZlcmVuY2FfcmVuZGFfcmVhaXMgLQ0KICAgICAgICAgICgNCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY282JHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwgLQ0KICAgICAgICAgICAgICBkYWRvc19ncmFmaWNvNiRyZW5kaW1lbnRvX2Fncm9fcmVhbA0KICAgICAgICAgICkNCiAgICAgICkgPCAxZS0xMA0KICAgICksDQogICJPIHByw6ptaW8gcmVsYXRpdm8gZGEgaW5kw7pzdHJpYSBmb2kgY2FsY3VsYWRvIGluY29ycmV0YW1lbnRlLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgZGFkb3NfZ3JhZmljbzYkcHJlbWlvX2luZHVzdHJpYV9wY3QgLQ0KICAgICAgICAgICgNCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY282JHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwgLw0KICAgICAgICAgICAgICBkYWRvc19ncmFmaWNvNiRyZW5kaW1lbnRvX2Fncm9fcmVhbCAtIDENCiAgICAgICAgICApICogMTAwDQogICAgICApIDwgMWUtMTANCiAgICApLA0KICAiTyBwcmltZWlybyBwZXLDrW9kbyBuw6NvIGNvcnJlc3BvbmRlIGFvIDHCuiB0cmltZXN0cmUgZGUgMjAxMi4iID0NCiAgICBkYWRvc19ncmFmaWNvNiRkYXRhX3RyaW1lc3RyZVsxXSA9PQ0KICAgICAgYXMuRGF0ZSgiMjAxMi0wMS0wMSIpLA0KICAiTyDDumx0aW1vIHBlcsOtb2RvIG7Do28gY29ycmVzcG9uZGUgYW8gNMK6IHRyaW1lc3RyZSBkZSAyMDI1LiIgPQ0KICAgIGRhZG9zX2dyYWZpY282JGRhdGFfdHJpbWVzdHJlWw0KICAgICAgbnJvdyhkYWRvc19ncmFmaWNvNikNCiAgICBdID09IGFzLkRhdGUoIjIwMjUtMTAtMDEiKQ0KKQ0KDQojIDUuIFByZXBhcmHDp8OjbyBkb3MgcG9udG9zIGUgbGltaXRlcw0KDQpwb250b3NfZ3JhZmljbzYgPC0gbGFwcGx5KA0KICBzZXFfbGVuKG5yb3coZGFkb3NfZ3JhZmljbzYpKSwNCiAgZnVuY3Rpb24oaSkgew0KICAgIGxpc3QoDQogICAgICB4ID0gaGlnaGNoYXJ0ZXI6OmRhdGV0aW1lX3RvX3RpbWVzdGFtcCgNCiAgICAgICAgYXMuUE9TSVhjdCgNCiAgICAgICAgICBkYWRvc19ncmFmaWNvNiRkYXRhX3RyaW1lc3RyZVtpXSwNCiAgICAgICAgICB0eiA9ICJVVEMiDQogICAgICAgICkNCiAgICAgICksDQogICAgICB5ID0gZGFkb3NfZ3JhZmljbzYkcHJlbWlvX2luZHVzdHJpYV9wY3RbaV0sDQogICAgICBjdXN0b20gPSBsaXN0KA0KICAgICAgICBwZXJpb2RvID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvNiRwZXJpb2RvW2ldLA0KICAgICAgICByZW5kaW1lbnRvX2Fncm9fcmVhbCA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzYkcmVuZGltZW50b19hZ3JvX3JlYWxbaV0sDQogICAgICAgIHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwgPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY282JHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWxbaV0sDQogICAgICAgIGRpZmVyZW5jYV9yZW5kYV9yZWFpcyA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzYkZGlmZXJlbmNhX3JlbmRhX3JlYWlzW2ldLA0KICAgICAgICBwcmVtaW9faW5kdXN0cmlhX3BjdCA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzYkcHJlbWlvX2luZHVzdHJpYV9wY3RbaV0NCiAgICAgICkNCiAgICApDQogIH0NCikNCg0KYW1wbGl0dWRlX3ByZW1pbyA8LSBkaWZmKA0KICByYW5nZSgNCiAgICBkYWRvc19ncmFmaWNvNiRwcmVtaW9faW5kdXN0cmlhX3BjdCwNCiAgICAwDQogICkNCikNCg0KbWFyZ2VtX2VpeG8gPC0gbWF4KA0KICBhbXBsaXR1ZGVfcHJlbWlvICogMC4wOCwNCiAgMw0KKQ0KDQpsaW1pdGVfaW5mZXJpb3IgPC0gbWluKA0KICAwLA0KICBmbG9vcigNCiAgICAoDQogICAgICBtaW4oZGFkb3NfZ3JhZmljbzYkcHJlbWlvX2luZHVzdHJpYV9wY3QpIC0NCiAgICAgICAgbWFyZ2VtX2VpeG8NCiAgICApIC8gNQ0KICApICogNQ0KKQ0KDQpsaW1pdGVfc3VwZXJpb3IgPC0gY2VpbGluZygNCiAgKA0KICAgIG1heChkYWRvc19ncmFmaWNvNiRwcmVtaW9faW5kdXN0cmlhX3BjdCkgKw0KICAgICAgbWFyZ2VtX2VpeG8NCiAgKSAvIDUNCikgKiA1DQoNCiMgNi4gQ29uc3RydcOnw6NvIGRvIGdyw6FmaWNvDQoNCmdyYWZpY28gPC0gaGlnaGNoYXJ0ZXI6OmhpZ2hjaGFydCgpIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jaGFydCgNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIGhlaWdodCA9IDUwMCwNCiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgc3BhY2luZ0JvdHRvbSA9IDYwDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgdHlwZSA9ICJsaW5lIiwNCiAgICBuYW1lID0gIkRpZmVyZW7Dp2EgcmVsYXRpdmEgZGUgcmVuZGltZW50byIsDQogICAgZGF0YSA9IHBvbnRvc19ncmFmaWNvNiwNCiAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgIGNvcmVzX2libWFjcm9bImF6dWxfZXNjdXJvIl0NCiAgICApLA0KICAgIGxpbmVXaWR0aCA9IDIuNSwNCiAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICBzeW1ib2wgPSAiY2lyY2xlIiwNCiAgICAgIHJhZGl1cyA9IDIuNSwNCiAgICAgIGxpbmVXaWR0aCA9IDAsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gNQ0KICAgICAgICApDQogICAgICApDQogICAgKQ0KICApDQoNCiMgNy4gRm9ybWF0YcOnw6NvDQoNCmdyYWZpY28gPC0gZ3JhZmljbyB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3RoZW1lKA0KICAgIHRlbWFfaWJtYWNybw0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190aXRsZSgNCiAgICB0ZXh0ID0gIkRpZmVyZW7Dp2EgZGUgcmVuZGltZW50byBlbnRyZSBhIGluZMO6c3RyaWEgZSBhIGFncm9wZWN1w6FyaWEiDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3N1YnRpdGxlKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiUXVhbnRvIG8gcmVuZGltZW50byBtw6lkaW8gcmVhbCBkYSBJbmTDunN0cmlhIGdlcmFsIHN1cGVyYSBvIGRhICIsDQogICAgICAiQWdyb3BlY3XDoXJpYSDigJQgQnJhc2lsLCAyMDEy4oCTMjAyNSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3hBeGlzKA0KICAgIHR5cGUgPSAiZGF0ZXRpbWUiLA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiVHJpbWVzdHJlIg0KICAgICksDQogICAgbWluID0gaGlnaGNoYXJ0ZXI6OmRhdGV0aW1lX3RvX3RpbWVzdGFtcCgNCiAgICAgIGFzLlBPU0lYY3QoDQogICAgICAgIGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgICAgICAgdHogPSAiVVRDIg0KICAgICAgKQ0KICAgICksDQogICAgbWF4ID0gaGlnaGNoYXJ0ZXI6OmRhdGV0aW1lX3RvX3RpbWVzdGFtcCgNCiAgICAgIGFzLlBPU0lYY3QoDQogICAgICAgIGFzLkRhdGUoIjIwMjUtMTAtMDEiKSwNCiAgICAgICAgdHogPSAiVVRDIg0KICAgICAgKQ0KICAgICksDQogICAgdGlja0ludGVydmFsID0gMzY1LjI1ICogMjQgKiA2MCAqIDYwICogMTAwMCwNCiAgICBzdGFydE9uVGljayA9IEZBTFNFLA0KICAgIGVuZE9uVGljayA9IEZBTFNFLA0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICBmb3JtYXQgPSAie3ZhbHVlOiVZfSIsDQogICAgICByb3RhdGlvbiA9IDANCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiUmVuZGltZW50byBkYSBpbmTDunN0cmlhIGFjaW1hIGRhIGFncm9wZWN1w6FyaWEgKCUpIg0KICAgICksDQogICAgbWluID0gbGltaXRlX2luZmVyaW9yLA0KICAgIG1heCA9IGxpbWl0ZV9zdXBlcmlvciwNCiAgICBzdGFydE9uVGljayA9IEZBTFNFLA0KICAgIGVuZE9uVGljayA9IEZBTFNFLA0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICJmdW5jdGlvbiAoKSB7DQogICAgICAgICAgcmV0dXJuIEhpZ2hjaGFydHMubnVtYmVyRm9ybWF0KA0KICAgICAgICAgICAgdGhpcy52YWx1ZSwNCiAgICAgICAgICAgIDIsDQogICAgICAgICAgICAnLCcsDQogICAgICAgICAgICAnLicNCiAgICAgICAgICApICsgJyUnOw0KICAgICAgICB9Ig0KICAgICAgKQ0KICAgICksDQogICAgcGxvdExpbmVzID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHZhbHVlID0gMCwNCiAgICAgICAgY29sb3IgPSB1bm5hbWUoDQogICAgICAgICAgY29yZXNfaWJtYWNyb1siY2luemEiXQ0KICAgICAgICApLA0KICAgICAgICBkYXNoU3R5bGUgPSAiU2hvcnREb3QiLA0KICAgICAgICB3aWR0aCA9IDEuMiwNCiAgICAgICAgekluZGV4ID0gNCwNCiAgICAgICAgbGFiZWwgPSBsaXN0KA0KICAgICAgICAgIHRleHQgPSAiUmVuZGltZW50b3MgaWd1YWlzIiwNCiAgICAgICAgICBhbGlnbiA9ICJsZWZ0IiwNCiAgICAgICAgICB4ID0gOCwNCiAgICAgICAgICB5ID0gLTcsDQogICAgICAgICAgc3R5bGUgPSBsaXN0KA0KICAgICAgICAgICAgY29sb3IgPSB1bm5hbWUoDQogICAgICAgICAgICAgIGNvcmVzX2libWFjcm9bImNpbnphIl0NCiAgICAgICAgICAgICksDQogICAgICAgICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICAgICAgICkNCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfcGxvdE9wdGlvbnMoDQogICAgbGluZSA9IGxpc3QoDQogICAgICBmaWxsT3BhY2l0eSA9IDAsDQogICAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICAgIGRhdGFMYWJlbHMgPSBsaXN0KA0KICAgICAgICBlbmFibGVkID0gRkFMU0UNCiAgICAgICkNCiAgICApLA0KICAgIHNlcmllcyA9IGxpc3QoDQogICAgICBhbmltYXRpb24gPSBUUlVFLA0KICAgICAgc2hhZG93ID0gRkFMU0UsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBpbmFjdGl2ZSA9IGxpc3QoDQogICAgICAgICAgb3BhY2l0eSA9IDAuMzUNCiAgICAgICAgKSwNCiAgICAgICAgaG92ZXIgPSBsaXN0KA0KICAgICAgICAgIGxpbmVXaWR0aFBsdXMgPSAxDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gRkFMU0UsDQogICAgdXNlSFRNTCA9IFRSVUUsDQogICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgImZ1bmN0aW9uICgpIHsNCiAgICAgICAgY29uc3QgZCA9IHRoaXMucG9pbnQuY3VzdG9tOw0KDQogICAgICAgIGNvbnN0IG5mID0gZnVuY3Rpb24odmFsb3IpIHsNCiAgICAgICAgICByZXR1cm4gSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICB2YWxvciwNCiAgICAgICAgICAgIDIsDQogICAgICAgICAgICAnLCcsDQogICAgICAgICAgICAnLicNCiAgICAgICAgICApOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHNpbmFsQWJzb2x1dG8gPQ0KICAgICAgICAgIGQuZGlmZXJlbmNhX3JlbmRhX3JlYWlzID4gMCA/ICcrJyA6DQogICAgICAgICAgZC5kaWZlcmVuY2FfcmVuZGFfcmVhaXMgPCAwID8gJ+KIkicgOiAnJzsNCg0KICAgICAgICBjb25zdCBzaW5hbFJlbGF0aXZvID0NCiAgICAgICAgICBkLnByZW1pb19pbmR1c3RyaWFfcGN0ID4gMCA/ICcrJyA6DQogICAgICAgICAgZC5wcmVtaW9faW5kdXN0cmlhX3BjdCA8IDAgPyAn4oiSJyA6ICcnOw0KDQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgJzxkaXYgc3R5bGU9XCJtaW4td2lkdGg6MzMwcHg7cGFkZGluZzo0cHggMnB4O1wiPicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OmJvbGQ7JyArDQogICAgICAgICAgICAgICdtYXJnaW4tYm90dG9tOjlweDtjb2xvcjojMTExODI3O1wiPicgKw0KICAgICAgICAgICAgICBkLnBlcmlvZG8gKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDpib2xkO1wiPkFncm9wZWN1w6FyaWE8L3NwYW4+PGJyPicgKw0KICAgICAgICAgICAgICAnUmVuZGltZW50byBtw6lkaW8gcmVhbDogPGI+UiQgJyArDQogICAgICAgICAgICAgICAgbmYoZC5yZW5kaW1lbnRvX2Fncm9fcmVhbCkgKw0KICAgICAgICAgICAgICAgICcgcG9yIG3DqnM8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCI+JyArDQogICAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7XCI+SW5kw7pzdHJpYSBnZXJhbDwvc3Bhbj48YnI+JyArDQogICAgICAgICAgICAgICdSZW5kaW1lbnRvIG3DqWRpbyByZWFsOiA8Yj5SJCAnICsNCiAgICAgICAgICAgICAgICBuZihkLnJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwpICsNCiAgICAgICAgICAgICAgICAnIHBvciBtw6pzPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdj4nICsNCiAgICAgICAgICAgICAgJ0RpZmVyZW7Dp2EgYWJzb2x1dGE6IDxiPicgKw0KICAgICAgICAgICAgICAgIHNpbmFsQWJzb2x1dG8gKw0KICAgICAgICAgICAgICAgICdSJCAnICsNCiAgICAgICAgICAgICAgICBuZigNCiAgICAgICAgICAgICAgICAgIE1hdGguYWJzKA0KICAgICAgICAgICAgICAgICAgICBkLmRpZmVyZW5jYV9yZW5kYV9yZWFpcw0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgICAnPC9iPjxicj4nICsNCiAgICAgICAgICAgICAgJ0RpZmVyZW7Dp2EgcmVsYXRpdmE6IDxiPicgKw0KICAgICAgICAgICAgICAgIHNpbmFsUmVsYXRpdm8gKw0KICAgICAgICAgICAgICAgIG5mKA0KICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoDQogICAgICAgICAgICAgICAgICAgIGQucHJlbWlvX2luZHVzdHJpYV9wY3QNCiAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICApICsNCiAgICAgICAgICAgICAgICAnJTwvYj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICc8L2Rpdj4nDQogICAgICAgICk7DQogICAgICB9Ig0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfbGVnZW5kKA0KICAgIGVuYWJsZWQgPSBGQUxTRQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jYXB0aW9uKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiTm90YTogbyBpbmRpY2Fkb3IgbW9zdHJhIHF1YW50byBvIHJlbmRpbWVudG8gbcOpZGlvIHJlYWwgZGEgIiwNCiAgICAgICJJbmTDunN0cmlhIGdlcmFsIHN1cGVyYSBvIGRhIEFncm9wZWN1w6FyaWEsIHV0aWxpemFuZG8gYSBBZ3JvcGVjdcOhcmlhICIsDQogICAgICAiY29tbyBiYXNlIGRlIGNvbXBhcmHDp8Ojby4gT3MgdmFsb3JlcyBuw6NvIGNvbnRyb2xhbSBkaWZlcmVuw6dhcyBkZSAiLA0KICAgICAgImVzY29sYXJpZGFkZSwgb2N1cGHDp8Ojbywgam9ybmFkYSwgZm9ybWFsaXphw6fDo28sIHJlZ2nDo28gb3UgIiwNCiAgICAgICJjYXJhY3RlcsOtc3RpY2FzIGRvcyB0cmFiYWxoYWRvcmVzLiINCiAgICApLA0KICAgIGFsaWduID0gImxlZnQiLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2V4cG9ydGluZygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBmaWxlbmFtZSA9ICJkaWZlcmVuY2EtcmVuZGltZW50by1pbmR1c3RyaWEtYWdyb3BlY3VhcmlhLTIwMTItMjAyNSINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY3JlZGl0cygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkZvbnRlOiBJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyBTSURSQSA1NDQyLiAiLA0KICAgICAgIkVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYk1hY3JvIEJILiINCiAgICApLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkNCg0KIyA4LiBFeGliacOnw6NvDQoNCmdyYWZpY28NCg0KYGBgDQoNCk8gZGlmZXJlbmNpYWwgY29tZcOnb3UgZW0gODksNiUgbm8gcHJpbWVpcm8gdHJpbWVzdHJlIGRlIDIwMTIgZSBwZXJtYW5lY2V1IGVsZXZhZG8gYXTDqSAyMDE2LCBxdWFuZG8gYXRpbmdpdSB2YWxvciBzZW1lbGhhbnRlLiBEZXBvaXMgZGlzc28sIGEgZGlzdMOibmNpYSBkaW1pbnVpdSwgY2hlZ2FuZG8gYW8gbWVub3IgbsOtdmVsIGRhIHPDqXJpZSBubyB0ZXJjZWlybyB0cmltZXN0cmUgZGUgMjAyMiwgY29tIDQxLDElLiBIb3V2ZSBhbGd1bWEgcmVjb21wb3Npw6fDo28gZW0gMjAyMyBlIDIwMjQsIG1hcyBvIHByw6ptaW8gdGVybWlub3UgbyBxdWFydG8gdHJpbWVzdHJlIGRlIDIwMjUgZW0gNDgsNSUsIGFpbmRhIG11aXRvIGFiYWl4byBkbyBpbsOtY2lvIGRvIHBlcsOtb2RvLg0KDQpBIGFwcm94aW1hw6fDo28gb2NvcnJldSBwcmluY2lwYWxtZW50ZSBwb3JxdWUgbyByZW5kaW1lbnRvIHJlYWwgYWdyb3BlY3XDoXJpbyBjcmVzY2V1IG1haXMsIGVucXVhbnRvIG8gcmVuZGltZW50byBpbmR1c3RyaWFsIHBlcmRldSBmb3LDp2EgZW50cmUgMjAyMSBlIDIwMjIuIElzc28gbsOjbyByZXByZXNlbnRhIHVtYSBpZ3VhbGRhZGUgZW50cmUgb3Mgc2V0b3JlcyBlIHRhbXBvdWNvIHVtYSBtZWxob3JhIGNvbXBsZXRhIHBhcmEgb3MgdHJhYmFsaGFkb3JlcyBydXJhaXMsIGrDoSBxdWUgbyBhdmFuw6dvIGRhIHJlbmRhIG3DqWRpYSBvY29ycmV1IGp1bnRvIGNvbSB1bWEgcmVkdcOnw6NvIGV4cHJlc3NpdmEgZGEgb2N1cGHDp8OjbyBhZ3JvcGVjdcOhcmlhLiBVbWEgbcOpZGlhIG1haW9yIGVudHJlIG9zIHRyYWJhbGhhZG9yZXMgcXVlIHBlcm1hbmVjZXJhbSBlbXByZWdhZG9zIHBvZGUgY29leGlzdGlyIGNvbSBtZW5vcyBwZXNzb2FzIHJlY2ViZW5kbyByZW5kYSBuYXF1ZWxlIHNldG9yLg0KDQojIyAyLjcgSW5kaWNhZG9yIGNvbWJpbmFkbyBkZSBlbXByZWdvIGUgcmVuZGltZW50byByZWFsDQoNCkVtcHJlZ28gZSByZW5kaW1lbnRvIGNvbnRhbSBwYXJ0ZXMgZGlmZXJlbnRlcyBkYSBtZXNtYSBoaXN0w7NyaWEuIFVtIHNldG9yIHBvZGUgcGFnYXIgbWVsaG9yIGUgZW1wcmVnYXIgbWVub3MgcGVzc29hcywgb3UgYW1wbGlhciBzdWEgb2N1cGHDp8OjbyBlbnF1YW50byBvIHJlbmRpbWVudG8gbcOpZGlvIHBlcmRlIHZhbG9yLiBQYXJhIG9ic2VydmFyIG9zIGRvaXMgbW92aW1lbnRvcyBlbSBjb25qdW50bywgb3MgcmVuZGltZW50b3MgdHJpbWVzdHJhaXMgZm9yYW0gY29udmVydGlkb3MgZW0gbcOpZGlhcyBhbnVhaXM6DQoNCiQkDQpcb3ZlcmxpbmV7Un1fe3MsYX0gPQ0KXGZyYWN7MX17NH0NClxzdW1fe3E9MX1eezR9DQpSX3tzLGEscX0NCiQkDQoNCkRlcG9pcywgb3Mgw61uZGljZXMgZGUgZW1wcmVnbyBlIHJlbmRpbWVudG8gZm9yYW0gbXVsdGlwbGljYWRvczoNCg0KJCQNCkNfe3MsYX0gPQ0KXGZyYWN7DQpJXntFfV97cyxhfQ0KXHRpbWVzDQpJXntSfV97cyxhfQ0KfXsxMDB9DQokJA0KDQplbSBxdWUgJElee0V9X3tzLGF9JCByZXByZXNlbnRhIG8gw61uZGljZSBkZSBlbXByZWdvIGUgJElee1J9X3tzLGF9JCBvIMOtbmRpY2UgZGUgcmVuZGltZW50byByZWFsLiBPIHJlc3VsdGFkbyDDqSB1bSBpbmRpY2Fkb3Igc2ludMOpdGljbywgY29tIDIwMTIgaWd1YWwgYSAxMDAuIEVsZSBuw6NvIGNvcnJlc3BvbmRlIMOgIG1hc3NhIG9maWNpYWwgZGUgcmVuZGltZW50byBkbyB0cmFiYWxobywgbWFzIHBlcm1pdGUgb2JzZXJ2YXIgc2UgYSBjb21iaW5hw6fDo28gZW50cmUgcXVhbnRpZGFkZSBkZSBvY3VwYWRvcyBlIHJlbmRpbWVudG8gbcOpZGlvIGZpY291IGFjaW1hIG91IGFiYWl4byBkYSBiYXNlLg0KDQoqKkdyw6FmaWNvIDIuNyDigJQgRW1wcmVnbyBlIHJlbmRpbWVudG8gY29tYmluYWRvcyBub3Mgc2V0b3JlcyB0cmFuc2FjaW9uw6F2ZWlzKioNCg0KYGBge3IgcDItZW1wcmVnby1yZW5kaW1lbnRvLWNvbWJpbmFkb3MsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgMS4gVmFsaWRhw6fDo28gZG9zIG9iamV0b3MgZGFkb3NfZ3JhZmljbzIgZSBkYWRvc19ncmFmaWNvMw0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvMiBuw6NvIGV4aXN0ZS4gRXhlY3V0ZSBwcmltZWlybyBvIGNodW5rIGRvIEdyw6FmaWNvIDIuMi4iID0NCiAgICBleGlzdHMoImRhZG9zX2dyYWZpY28yIiksDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvMyBuw6NvIGV4aXN0ZS4gRXhlY3V0ZSBwcmltZWlybyBvIGNodW5rIGRvIEdyw6FmaWNvIDIuMy4iID0NCiAgICBleGlzdHMoImRhZG9zX2dyYWZpY28zIikNCikNCg0KY29sdW5hc19uZWNlc3Nhcmlhc19ncmFmaWNvMiA8LSBjKA0KICAiYW5vIiwNCiAgIm9jdXBhZG9zX2Fncm9fbWlsIiwNCiAgIm9jdXBhZG9zX2luZHVzdHJpYV9taWwiLA0KICAiaW5kaWNlX2VtcHJlZ29fYWdybyIsDQogICJpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWEiDQopDQoNCmNvbHVuYXNfbmVjZXNzYXJpYXNfZ3JhZmljbzMgPC0gYygNCiAgImRhdGFfdHJpbWVzdHJlIiwNCiAgImFubyIsDQogICJ0cmltZXN0cmUiLA0KICAicmVuZGltZW50b19hZ3JvX3JlYWwiLA0KICAicmVuZGltZW50b19pbmR1c3RyaWFfcmVhbCINCikNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzIgbsOjbyBjb250w6ltIHRvZGFzIGFzIHZhcmnDoXZlaXMgbmVjZXNzw6FyaWFzLiIgPQ0KICAgIGFsbCgNCiAgICAgIGNvbHVuYXNfbmVjZXNzYXJpYXNfZ3JhZmljbzIgJWluJQ0KICAgICAgICBuYW1lcyhkYWRvc19ncmFmaWNvMikNCiAgICApLA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzMgbsOjbyBjb250w6ltIHRvZGFzIGFzIHZhcmnDoXZlaXMgbmVjZXNzw6FyaWFzLiIgPQ0KICAgIGFsbCgNCiAgICAgIGNvbHVuYXNfbmVjZXNzYXJpYXNfZ3JhZmljbzMgJWluJQ0KICAgICAgICBuYW1lcyhkYWRvc19ncmFmaWNvMykNCiAgICApDQopDQoNCmVtcHJlZ29fYW51YWxfZ3JhZmljbzcgPC0gZGFkb3NfZ3JhZmljbzIgfD4NCiAgZHBseXI6OnRyYW5zbXV0ZSgNCiAgICBhbm8gPSBhcy5pbnRlZ2VyKGFubyksDQogICAgb2N1cGFkb3NfYWdyb19taWwgPQ0KICAgICAgYXMubnVtZXJpYyhvY3VwYWRvc19hZ3JvX21pbCksDQogICAgb2N1cGFkb3NfaW5kdXN0cmlhX21pbCA9DQogICAgICBhcy5udW1lcmljKG9jdXBhZG9zX2luZHVzdHJpYV9taWwpLA0KICAgIGluZGljZV9lbXByZWdvX2Fncm8gPQ0KICAgICAgYXMubnVtZXJpYyhpbmRpY2VfZW1wcmVnb19hZ3JvKSwNCiAgICBpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWEgPQ0KICAgICAgYXMubnVtZXJpYyhpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWEpDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoYW5vKQ0KDQpyZW5kaW1lbnRvX3RyaW1lc3RyYWxfZ3JhZmljbzcgPC0gZGFkb3NfZ3JhZmljbzMgfD4NCiAgZHBseXI6OnRyYW5zbXV0ZSgNCiAgICBkYXRhX3RyaW1lc3RyZSA9IGFzLkRhdGUoZGF0YV90cmltZXN0cmUpLA0KICAgIGFubyA9IGFzLmludGVnZXIoYW5vKSwNCiAgICB0cmltZXN0cmUgPSBhcy5pbnRlZ2VyKHRyaW1lc3RyZSksDQogICAgcmVuZGltZW50b19hZ3JvX3JlYWwgPQ0KICAgICAgYXMubnVtZXJpYyhyZW5kaW1lbnRvX2Fncm9fcmVhbCksDQogICAgcmVuZGltZW50b19pbmR1c3RyaWFfcmVhbCA9DQogICAgICBhcy5udW1lcmljKHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwpDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoDQogICAgYW5vLA0KICAgIHRyaW1lc3RyZQ0KICApDQoNCnRyaW1lc3RyZXNfcG9yX2Fub19ncmFmaWNvNyA8LSByZW5kaW1lbnRvX3RyaW1lc3RyYWxfZ3JhZmljbzcgfD4NCiAgZHBseXI6OmNvdW50KA0KICAgIGFubywNCiAgICBuYW1lID0gIm51bWVyb190cmltZXN0cmVzIg0KICApDQoNCnN0b3BpZm5vdCgNCiAgIk9zIGRhZG9zIGRlIGVtcHJlZ28gbsOjbyBwb3NzdWVtIGV4YXRhbWVudGUgMTQgYW5vcy4iID0NCiAgICBucm93KGVtcHJlZ29fYW51YWxfZ3JhZmljbzcpID09IDE0LA0KICAiT3MgZGFkb3MgZGUgZW1wcmVnbyBuw6NvIGNvbnTDqm0gdG9kb3Mgb3MgYW5vcyBkZSAyMDEyIGEgMjAyNS4iID0NCiAgICBhbGwoDQogICAgICBlbXByZWdvX2FudWFsX2dyYWZpY283JGFubyA9PSAyMDEyOjIwMjUNCiAgICApLA0KICAiRXhpc3RlbSBhbm9zIGR1cGxpY2Fkb3Mgbm9zIGRhZG9zIGRlIGVtcHJlZ28uIiA9DQogICAgZHBseXI6Om5fZGlzdGluY3QoDQogICAgICBlbXByZWdvX2FudWFsX2dyYWZpY283JGFubw0KICAgICkgPT0gMTQsDQogICJFeGlzdGVtIHZhbG9yZXMgYXVzZW50ZXMgbm9zIGRhZG9zIGRlIGVtcHJlZ28uIiA9DQogICAgIWFueU5BKGVtcHJlZ29fYW51YWxfZ3JhZmljbzcpLA0KICAiT3MgdmFsb3JlcyBkZSBlbXByZWdvIGRldmVtIHNlciBwb3NpdGl2b3MuIiA9DQogICAgYWxsKA0KICAgICAgZW1wcmVnb19hbnVhbF9ncmFmaWNvNyRvY3VwYWRvc19hZ3JvX21pbCA+IDAsDQogICAgICBlbXByZWdvX2FudWFsX2dyYWZpY283JG9jdXBhZG9zX2luZHVzdHJpYV9taWwgPiAwDQogICAgKSwNCiAgIk9zIMOtbmRpY2VzIGRlIGVtcHJlZ28gbsOjbyBwb3NzdWVtIGJhc2UgMjAxMiBpZ3VhbCBhIDEwMC4iID0NCiAgICBhbGwoDQogICAgICBhYnMoDQogICAgICAgIGVtcHJlZ29fYW51YWxfZ3JhZmljbzcgfD4NCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKSB8Pg0KICAgICAgICAgIGRwbHlyOjpzZWxlY3QoDQogICAgICAgICAgICBpbmRpY2VfZW1wcmVnb19hZ3JvLA0KICAgICAgICAgICAgaW5kaWNlX2VtcHJlZ29faW5kdXN0cmlhDQogICAgICAgICAgKSB8Pg0KICAgICAgICAgIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkgLQ0KICAgICAgICAgIDEwMA0KICAgICAgKSA8IDFlLTgNCiAgICApLA0KICAiT3MgZGFkb3MgZGUgcmVuZGltZW50byBuw6NvIHBvc3N1ZW0gZXhhdGFtZW50ZSA1NiB0cmltZXN0cmVzLiIgPQ0KICAgIG5yb3cocmVuZGltZW50b190cmltZXN0cmFsX2dyYWZpY283KSA9PSA1NiwNCiAgIk9zIGRhZG9zIGRlIHJlbmRpbWVudG8gbsOjbyBjb250w6ptIHRvZG9zIG9zIGFub3MgZGUgMjAxMiBhIDIwMjUuIiA9DQogICAgbnJvdyh0cmltZXN0cmVzX3Bvcl9hbm9fZ3JhZmljbzcpID09IDE0ICYmDQogICAgYWxsKA0KICAgICAgdHJpbWVzdHJlc19wb3JfYW5vX2dyYWZpY283JGFubyA9PSAyMDEyOjIwMjUNCiAgICApLA0KICAiTmVtIHRvZG9zIG9zIGFub3MgcG9zc3VlbSBxdWF0cm8gdHJpbWVzdHJlcyBkZSByZW5kaW1lbnRvLiIgPQ0KICAgIGFsbCgNCiAgICAgIHRyaW1lc3RyZXNfcG9yX2Fub19ncmFmaWNvNyRudW1lcm9fdHJpbWVzdHJlcyA9PSA0DQogICAgKSwNCiAgIkV4aXN0ZW0gdHJpbWVzdHJlcyBkdXBsaWNhZG9zIG5vcyBkYWRvcyBkZSByZW5kaW1lbnRvLiIgPQ0KICAgIGRwbHlyOjpuX2Rpc3RpbmN0KA0KICAgICAgcmVuZGltZW50b190cmltZXN0cmFsX2dyYWZpY283JGRhdGFfdHJpbWVzdHJlDQogICAgKSA9PSA1NiwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBhdXNlbnRlcyBub3MgZGFkb3MgZGUgcmVuZGltZW50by4iID0NCiAgICAhYW55TkEocmVuZGltZW50b190cmltZXN0cmFsX2dyYWZpY283KSwNCiAgIk9zIHZhbG9yZXMgZGUgcmVuZGltZW50byBkZXZlbSBzZXIgcG9zaXRpdm9zLiIgPQ0KICAgIGFsbCgNCiAgICAgIHJlbmRpbWVudG9fdHJpbWVzdHJhbF9ncmFmaWNvNyRyZW5kaW1lbnRvX2Fncm9fcmVhbCA+IDAsDQogICAgICByZW5kaW1lbnRvX3RyaW1lc3RyYWxfZ3JhZmljbzckcmVuZGltZW50b19pbmR1c3RyaWFfcmVhbCA+IDANCiAgICApDQopDQoNCiMgMi4gQ8OhbGN1bG8gZG9zIHJlbmRpbWVudG9zIG3DqWRpb3MgYW51YWlzDQoNCnJlbmRpbWVudG9fYW51YWxfZ3JhZmljbzcgPC0gcmVuZGltZW50b190cmltZXN0cmFsX2dyYWZpY283IHw+DQogIGRwbHlyOjpncm91cF9ieShhbm8pIHw+DQogIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgbnVtZXJvX3RyaW1lc3RyZXMgPSBkcGx5cjo6bigpLA0KICAgIHJlbmRpbWVudG9fYWdyb19hbnVhbCA9DQogICAgICBtZWFuKHJlbmRpbWVudG9fYWdyb19yZWFsKSwNCiAgICByZW5kaW1lbnRvX2luZHVzdHJpYV9hbnVhbCA9DQogICAgICBtZWFuKHJlbmRpbWVudG9faW5kdXN0cmlhX3JlYWwpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShhbm8pDQoNCnN0b3BpZm5vdCgNCiAgIk8gb2JqZXRvIGFudWFsIGRlIHJlbmRpbWVudG8gbsOjbyBwb3NzdWkgZXhhdGFtZW50ZSAxNCBhbm9zLiIgPQ0KICAgIG5yb3cocmVuZGltZW50b19hbnVhbF9ncmFmaWNvNykgPT0gMTQsDQogICJPIG9iamV0byBhbnVhbCBkZSByZW5kaW1lbnRvIG7Do28gY29udMOpbSB0b2RvcyBvcyBhbm9zIGRlIDIwMTIgYSAyMDI1LiIgPQ0KICAgIGFsbCgNCiAgICAgIHJlbmRpbWVudG9fYW51YWxfZ3JhZmljbzckYW5vID09IDIwMTI6MjAyNQ0KICAgICksDQogICJBbGd1bSByZW5kaW1lbnRvIGFudWFsIG7Do28gZm9pIGNhbGN1bGFkbyBjb20gcXVhdHJvIHRyaW1lc3RyZXMuIiA9DQogICAgYWxsKA0KICAgICAgcmVuZGltZW50b19hbnVhbF9ncmFmaWNvNyRudW1lcm9fdHJpbWVzdHJlcyA9PSA0DQogICAgKQ0KKQ0KDQpyZW5kaW1lbnRvX2FudWFsX2dyYWZpY283IDwtIHJlbmRpbWVudG9fYW51YWxfZ3JhZmljbzcgfD4NCiAgZHBseXI6OnNlbGVjdCgNCiAgICAtbnVtZXJvX3RyaW1lc3RyZXMNCiAgKQ0KDQojIDMuIEluZGV4YcOnw6NvIGRvcyByZW5kaW1lbnRvcw0KDQpiYXNlX3JlbmRpbWVudG9fYWdyb18yMDEyX2dyYWZpY283IDwtDQogIHJlbmRpbWVudG9fYW51YWxfZ3JhZmljbzcgfD4NCiAgZHBseXI6OmZpbHRlcihhbm8gPT0gMjAxMikgfD4NCiAgZHBseXI6OnB1bGwocmVuZGltZW50b19hZ3JvX2FudWFsKQ0KDQpiYXNlX3JlbmRpbWVudG9faW5kdXN0cmlhXzIwMTJfZ3JhZmljbzcgPC0NCiAgcmVuZGltZW50b19hbnVhbF9ncmFmaWNvNyB8Pg0KICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKSB8Pg0KICBkcGx5cjo6cHVsbChyZW5kaW1lbnRvX2luZHVzdHJpYV9hbnVhbCkNCg0KcmVuZGltZW50b19hbnVhbF9ncmFmaWNvNyA8LSByZW5kaW1lbnRvX2FudWFsX2dyYWZpY283IHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgaW5kaWNlX3JlbmRpbWVudG9fYWdyb19hbnVhbCA9DQogICAgICByZW5kaW1lbnRvX2Fncm9fYW51YWwgLw0KICAgICAgYmFzZV9yZW5kaW1lbnRvX2Fncm9fMjAxMl9ncmFmaWNvNyAqIDEwMCwNCiAgICBpbmRpY2VfcmVuZGltZW50b19pbmR1c3RyaWFfYW51YWwgPQ0KICAgICAgcmVuZGltZW50b19pbmR1c3RyaWFfYW51YWwgLw0KICAgICAgYmFzZV9yZW5kaW1lbnRvX2luZHVzdHJpYV8yMDEyX2dyYWZpY283ICogMTAwDQogICkNCg0KaW5kaWNlc19yZW5kaW1lbnRvXzIwMTJfZ3JhZmljbzcgPC0NCiAgcmVuZGltZW50b19hbnVhbF9ncmFmaWNvNyB8Pg0KICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGluZGljZV9yZW5kaW1lbnRvX2Fncm9fYW51YWwsDQogICAgaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhX2FudWFsDQogICkgfD4NCiAgdW5saXN0KHVzZS5uYW1lcyA9IEZBTFNFKQ0KDQpzdG9waWZub3QoDQogICJPcyDDrW5kaWNlcyBhbnVhaXMgZGUgcmVuZGltZW50byBuw6NvIHBvc3N1ZW0gYmFzZSAyMDEyIGlndWFsIGEgMTAwLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgaW5kaWNlc19yZW5kaW1lbnRvXzIwMTJfZ3JhZmljbzcgLSAxMDANCiAgICAgICkgPCAxZS04DQogICAgKQ0KKQ0KDQojIDQuIEp1bsOnw6NvIGNvbSBvcyBkYWRvcyBhbnVhaXMgZGUgZW1wcmVnbw0KDQpkYWRvc19hbnVhaXNfZ3JhZmljbzcgPC0gZHBseXI6OmZ1bGxfam9pbigNCiAgZW1wcmVnb19hbnVhbF9ncmFmaWNvNywNCiAgcmVuZGltZW50b19hbnVhbF9ncmFmaWNvNywNCiAgYnkgPSAiYW5vIg0KKSB8Pg0KICBkcGx5cjo6YXJyYW5nZShhbm8pDQoNCnN0b3BpZm5vdCgNCiAgIkEganVuw6fDo28gZGFzIGJhc2VzIG7Do28gcHJvZHV6aXUgZXhhdGFtZW50ZSAxNCBhbm9zLiIgPQ0KICAgIG5yb3coZGFkb3NfYW51YWlzX2dyYWZpY283KSA9PSAxNCwNCiAgIkEganVuw6fDo28gbsOjbyBjb250w6ltIHRvZG9zIG9zIGFub3MgZGUgMjAxMiBhIDIwMjUuIiA9DQogICAgYWxsKA0KICAgICAgZGFkb3NfYW51YWlzX2dyYWZpY283JGFubyA9PSAyMDEyOjIwMjUNCiAgICApLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIGRlcG9pcyBkYSBqdW7Dp8OjbyBkYXMgYmFzZXMuIiA9DQogICAgIWFueU5BKGRhZG9zX2FudWFpc19ncmFmaWNvNykNCikNCg0KIyA1LiBDw6FsY3VsbyBkb3MgaW5kaWNhZG9yZXMgY29tYmluYWRvcw0KDQpkYWRvc19hbnVhaXNfZ3JhZmljbzcgPC0gZGFkb3NfYW51YWlzX2dyYWZpY283IHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgaW5kaWNlX2NvbWJpbmFkb19hZ3JvID0NCiAgICAgIGluZGljZV9lbXByZWdvX2Fncm8gKg0KICAgICAgaW5kaWNlX3JlbmRpbWVudG9fYWdyb19hbnVhbCAvIDEwMCwNCiAgICBpbmRpY2VfY29tYmluYWRvX2luZHVzdHJpYSA9DQogICAgICBpbmRpY2VfZW1wcmVnb19pbmR1c3RyaWEgKg0KICAgICAgaW5kaWNlX3JlbmRpbWVudG9faW5kdXN0cmlhX2FudWFsIC8gMTAwDQogICkNCg0KIyA2LiBPcmdhbml6YcOnw6NvIGUgdmFsaWRhw6fDo28gZGUgZGFkb3NfZ3JhZmljbzcNCg0KZGFkb3NfYWdyb19ncmFmaWNvNyA8LSBkYWRvc19hbnVhaXNfZ3JhZmljbzcgfD4NCiAgZHBseXI6OnRyYW5zbXV0ZSgNCiAgICBhbm8sDQogICAgc2V0b3IgPSAiQWdyb3BlY3XDoXJpYSIsDQogICAgb2N1cGFkb3NfbWlsID0NCiAgICAgIG9jdXBhZG9zX2Fncm9fbWlsLA0KICAgIHJlbmRpbWVudG9fcmVhbF9hbnVhbCA9DQogICAgICByZW5kaW1lbnRvX2Fncm9fYW51YWwsDQogICAgaW5kaWNlX2VtcHJlZ28gPQ0KICAgICAgaW5kaWNlX2VtcHJlZ29fYWdybywNCiAgICBpbmRpY2VfcmVuZGltZW50byA9DQogICAgICBpbmRpY2VfcmVuZGltZW50b19hZ3JvX2FudWFsLA0KICAgIGluZGljZV9jb21iaW5hZG8gPQ0KICAgICAgaW5kaWNlX2NvbWJpbmFkb19hZ3JvDQogICkNCg0KZGFkb3NfaW5kdXN0cmlhX2dyYWZpY283IDwtIGRhZG9zX2FudWFpc19ncmFmaWNvNyB8Pg0KICBkcGx5cjo6dHJhbnNtdXRlKA0KICAgIGFubywNCiAgICBzZXRvciA9ICJJbmTDunN0cmlhIGdlcmFsIiwNCiAgICBvY3VwYWRvc19taWwgPQ0KICAgICAgb2N1cGFkb3NfaW5kdXN0cmlhX21pbCwNCiAgICByZW5kaW1lbnRvX3JlYWxfYW51YWwgPQ0KICAgICAgcmVuZGltZW50b19pbmR1c3RyaWFfYW51YWwsDQogICAgaW5kaWNlX2VtcHJlZ28gPQ0KICAgICAgaW5kaWNlX2VtcHJlZ29faW5kdXN0cmlhLA0KICAgIGluZGljZV9yZW5kaW1lbnRvID0NCiAgICAgIGluZGljZV9yZW5kaW1lbnRvX2luZHVzdHJpYV9hbnVhbCwNCiAgICBpbmRpY2VfY29tYmluYWRvID0NCiAgICAgIGluZGljZV9jb21iaW5hZG9faW5kdXN0cmlhDQogICkNCg0KZGFkb3NfZ3JhZmljbzcgPC0gZHBseXI6OmJpbmRfcm93cygNCiAgZGFkb3NfYWdyb19ncmFmaWNvNywNCiAgZGFkb3NfaW5kdXN0cmlhX2dyYWZpY283DQopIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgYW5vLA0KICAgIHNldG9yLA0KICAgIG9jdXBhZG9zX21pbCwNCiAgICByZW5kaW1lbnRvX3JlYWxfYW51YWwsDQogICAgaW5kaWNlX2VtcHJlZ28sDQogICAgaW5kaWNlX3JlbmRpbWVudG8sDQogICAgaW5kaWNlX2NvbWJpbmFkbw0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKA0KICAgIHNldG9yLA0KICAgIGFubw0KICApDQoNCmNvbnRhZ2VtX3NldG9yZXNfZ3JhZmljbzcgPC0gZGFkb3NfZ3JhZmljbzcgfD4NCiAgZHBseXI6OmNvdW50KA0KICAgIHNldG9yLA0KICAgIG5hbWUgPSAib2JzZXJ2YWNvZXMiDQogICkNCg0KYW5vc19wb3Jfc2V0b3JfZ3JhZmljbzcgPC0gZGFkb3NfZ3JhZmljbzcgfD4NCiAgZHBseXI6Omdyb3VwX2J5KHNldG9yKSB8Pg0KICBkcGx5cjo6c3VtbWFyaXNlKA0KICAgIHByaW1laXJvX2FubyA9IG1pbihhbm8pLA0KICAgIHVsdGltb19hbm8gPSBtYXgoYW5vKSwNCiAgICBudW1lcm9fYW5vcyA9IGRwbHlyOjpuX2Rpc3RpbmN0KGFubyksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCmluZGljZXNfMjAxMl9ncmFmaWNvNyA8LSBkYWRvc19ncmFmaWNvNyB8Pg0KICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGluZGljZV9lbXByZWdvLA0KICAgIGluZGljZV9yZW5kaW1lbnRvLA0KICAgIGluZGljZV9jb21iaW5hZG8NCiAgKSB8Pg0KICB1bmxpc3QodXNlLm5hbWVzID0gRkFMU0UpDQoNCnZhbG9yZXNfbnVtZXJpY29zX2dyYWZpY283IDwtIGRhZG9zX2dyYWZpY283IHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgd2hlcmUoaXMubnVtZXJpYykNCiAgKSB8Pg0KICB1bmxpc3QodXNlLm5hbWVzID0gRkFMU0UpDQoNCnN0b3BpZm5vdCgNCiAgIk8gb2JqZXRvIGRhZG9zX2dyYWZpY283IG7Do28gcG9zc3VpIGV4YXRhbWVudGUgMjggb2JzZXJ2YcOnw7Vlcy4iID0NCiAgICBucm93KGRhZG9zX2dyYWZpY283KSA9PSAyOCwNCiAgIk9zIHNldG9yZXMgZG8gb2JqZXRvIGRhZG9zX2dyYWZpY283IGVzdMOjbyBpbmNvcnJldG9zLiIgPQ0KICAgIHNldGVxdWFsKA0KICAgICAgZGFkb3NfZ3JhZmljbzckc2V0b3IsDQogICAgICBjKA0KICAgICAgICAiQWdyb3BlY3XDoXJpYSIsDQogICAgICAgICJJbmTDunN0cmlhIGdlcmFsIg0KICAgICAgKQ0KICAgICksDQogICJDYWRhIHNldG9yIGRldmUgcG9zc3VpciBleGF0YW1lbnRlIDE0IG9ic2VydmHDp8O1ZXMuIiA9DQogICAgYWxsKA0KICAgICAgY29udGFnZW1fc2V0b3Jlc19ncmFmaWNvNyRvYnNlcnZhY29lcyA9PSAxNA0KICAgICksDQogICJDYWRhIHNldG9yIGRldmUgY29udGVyIG9zIGFub3MgZGUgMjAxMiBhIDIwMjUuIiA9DQogICAgYWxsKA0KICAgICAgYW5vc19wb3Jfc2V0b3JfZ3JhZmljbzckcHJpbWVpcm9fYW5vID09IDIwMTIsDQogICAgICBhbm9zX3Bvcl9zZXRvcl9ncmFmaWNvNyR1bHRpbW9fYW5vID09IDIwMjUsDQogICAgICBhbm9zX3Bvcl9zZXRvcl9ncmFmaWNvNyRudW1lcm9fYW5vcyA9PSAxNA0KICAgICksDQogICJFeGlzdGVtIGNvbWJpbmHDp8O1ZXMgZHVwbGljYWRhcyBkZSBhbm8gZSBzZXRvci4iID0NCiAgICBkcGx5cjo6bl9kaXN0aW5jdCgNCiAgICAgIHBhc3RlKA0KICAgICAgICBkYWRvc19ncmFmaWNvNyRhbm8sDQogICAgICAgIGRhZG9zX2dyYWZpY283JHNldG9yDQogICAgICApDQogICAgKSA9PSAyOCwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBhdXNlbnRlcyBubyBvYmpldG8gZGFkb3NfZ3JhZmljbzcuIiA9DQogICAgIWFueU5BKGRhZG9zX2dyYWZpY283KSwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBpbmZpbml0b3Mgbm8gb2JqZXRvIGRhZG9zX2dyYWZpY283LiIgPQ0KICAgIGFsbChpcy5maW5pdGUodmFsb3Jlc19udW1lcmljb3NfZ3JhZmljbzcpKSwNCiAgIk9zIHZhbG9yZXMgZGUgZW1wcmVnbyBlIHJlbmRpbWVudG8gZGV2ZW0gc2VyIHBvc2l0aXZvcy4iID0NCiAgICBhbGwoDQogICAgICBkYWRvc19ncmFmaWNvNyRvY3VwYWRvc19taWwgPiAwLA0KICAgICAgZGFkb3NfZ3JhZmljbzckcmVuZGltZW50b19yZWFsX2FudWFsID4gMA0KICAgICksDQogICJPcyDDrW5kaWNlcyBkZSAyMDEyIG7Do28gc8OjbyBpZ3VhaXMgYSAxMDAuIiA9DQogICAgYWxsKA0KICAgICAgYWJzKA0KICAgICAgICBpbmRpY2VzXzIwMTJfZ3JhZmljbzcgLSAxMDANCiAgICAgICkgPCAxZS04DQogICAgKSwNCiAgIk8gaW5kaWNhZG9yIGNvbWJpbmFkbyBmb2kgY2FsY3VsYWRvIGluY29ycmV0YW1lbnRlLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgZGFkb3NfZ3JhZmljbzckaW5kaWNlX2NvbWJpbmFkbyAtDQogICAgICAgICAgKA0KICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzckaW5kaWNlX2VtcHJlZ28gKg0KICAgICAgICAgICAgICBkYWRvc19ncmFmaWNvNyRpbmRpY2VfcmVuZGltZW50byAvDQogICAgICAgICAgICAgIDEwMA0KICAgICAgICAgICkNCiAgICAgICkgPCAxZS0xMA0KICAgICkNCikNCg0KIyA3LiBQcmVwYXJhw6fDo28gZG9zIHBvbnRvcyBlIGxpbWl0ZXMNCg0KZGFkb3NfYWdyb19wbG90X2dyYWZpY283IDwtIGRhZG9zX2dyYWZpY283IHw+DQogIGRwbHlyOjpmaWx0ZXIoDQogICAgc2V0b3IgPT0gIkFncm9wZWN1w6FyaWEiDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoYW5vKQ0KDQpkYWRvc19pbmR1c3RyaWFfcGxvdF9ncmFmaWNvNyA8LSBkYWRvc19ncmFmaWNvNyB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIHNldG9yID09ICJJbmTDunN0cmlhIGdlcmFsIg0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKGFubykNCg0KY3JpYXJfcG9udG9zX2dyYWZpY283IDwtIGZ1bmN0aW9uKGRhZG9zX3NldG9yKSB7DQogIGxhcHBseSgNCiAgICBzZXFfbGVuKG5yb3coZGFkb3Nfc2V0b3IpKSwNCiAgICBmdW5jdGlvbihpKSB7DQogICAgICBsaXN0KA0KICAgICAgICB5ID0gZGFkb3Nfc2V0b3IkaW5kaWNlX2NvbWJpbmFkb1tpXSwNCiAgICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgICBhbm8gPQ0KICAgICAgICAgICAgZGFkb3Nfc2V0b3IkYW5vW2ldLA0KICAgICAgICAgIHNldG9yID0NCiAgICAgICAgICAgIGRhZG9zX3NldG9yJHNldG9yW2ldLA0KICAgICAgICAgIG9jdXBhZG9zX21pbCA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRvY3VwYWRvc19taWxbaV0sDQogICAgICAgICAgcmVuZGltZW50b19yZWFsX2FudWFsID0NCiAgICAgICAgICAgIGRhZG9zX3NldG9yJHJlbmRpbWVudG9fcmVhbF9hbnVhbFtpXSwNCiAgICAgICAgICBpbmRpY2VfZW1wcmVnbyA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRpbmRpY2VfZW1wcmVnb1tpXSwNCiAgICAgICAgICBpbmRpY2VfcmVuZGltZW50byA9DQogICAgICAgICAgICBkYWRvc19zZXRvciRpbmRpY2VfcmVuZGltZW50b1tpXSwNCiAgICAgICAgICBpbmRpY2VfY29tYmluYWRvID0NCiAgICAgICAgICAgIGRhZG9zX3NldG9yJGluZGljZV9jb21iaW5hZG9baV0NCiAgICAgICAgKQ0KICAgICAgKQ0KICAgIH0NCiAgKQ0KfQ0KDQpwb250b3NfYWdyb19ncmFmaWNvNyA8LSBjcmlhcl9wb250b3NfZ3JhZmljbzcoDQogIGRhZG9zX2Fncm9fcGxvdF9ncmFmaWNvNw0KKQ0KDQpwb250b3NfaW5kdXN0cmlhX2dyYWZpY283IDwtIGNyaWFyX3BvbnRvc19ncmFmaWNvNygNCiAgZGFkb3NfaW5kdXN0cmlhX3Bsb3RfZ3JhZmljbzcNCikNCg0KYW1wbGl0dWRlX2luZGljZXNfZ3JhZmljbzcgPC0gZGlmZigNCiAgcmFuZ2UoDQogICAgZGFkb3NfZ3JhZmljbzckaW5kaWNlX2NvbWJpbmFkbw0KICApDQopDQoNCm1hcmdlbV9laXhvX2dyYWZpY283IDwtIG1heCgNCiAgYW1wbGl0dWRlX2luZGljZXNfZ3JhZmljbzcgKiAwLjA4LA0KICAzDQopDQoNCmxpbWl0ZV9pbmZlcmlvcl9ncmFmaWNvNyA8LSBmbG9vcigNCiAgKA0KICAgIG1pbihkYWRvc19ncmFmaWNvNyRpbmRpY2VfY29tYmluYWRvKSAtDQogICAgICBtYXJnZW1fZWl4b19ncmFmaWNvNw0KICApIC8gNQ0KKSAqIDUNCg0KbGltaXRlX3N1cGVyaW9yX2dyYWZpY283IDwtIGNlaWxpbmcoDQogICgNCiAgICBtYXgoZGFkb3NfZ3JhZmljbzckaW5kaWNlX2NvbWJpbmFkbykgKw0KICAgICAgbWFyZ2VtX2VpeG9fZ3JhZmljbzcNCiAgKSAvIDUNCikgKiA1DQoNCiMgOC4gQ29uc3RydcOnw6NvIGRvIGdyw6FmaWNvDQoNCmdyYWZpY28gPC0gaGlnaGNoYXJ0ZXI6OmhpZ2hjaGFydCgpIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jaGFydCgNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIGhlaWdodCA9IDUwMCwNCiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgc3BhY2luZ0JvdHRvbSA9IDYwDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgdHlwZSA9ICJsaW5lIiwNCiAgICBuYW1lID0gIkFncm9wZWN1w6FyaWEiLA0KICAgIGRhdGEgPSBwb250b3NfYWdyb19ncmFmaWNvNywNCiAgICBjb2xvciA9IHVubmFtZSgNCiAgICAgIGNvcmVzX2libWFjcm9bImFtYXJlbG8iXQ0KICAgICksDQogICAgbGluZVdpZHRoID0gMi41LA0KICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgIG1hcmtlciA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLA0KICAgICAgcmFkaXVzID0gMi41LA0KICAgICAgbGluZVdpZHRoID0gMCwNCiAgICAgIHN0YXRlcyA9IGxpc3QoDQogICAgICAgIGhvdmVyID0gbGlzdCgNCiAgICAgICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgICAgICByYWRpdXMgPSA1DQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgdHlwZSA9ICJsaW5lIiwNCiAgICBuYW1lID0gIkluZMO6c3RyaWEgZ2VyYWwiLA0KICAgIGRhdGEgPSBwb250b3NfaW5kdXN0cmlhX2dyYWZpY283LA0KICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgY29yZXNfaWJtYWNyb1siYXp1bF9jbGFybyJdDQogICAgKSwNCiAgICBsaW5lV2lkdGggPSAyLjUsDQogICAgc2hhZG93ID0gRkFMU0UsDQogICAgbWFya2VyID0gbGlzdCgNCiAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsDQogICAgICByYWRpdXMgPSAyLjUsDQogICAgICBsaW5lV2lkdGggPSAwLA0KICAgICAgc3RhdGVzID0gbGlzdCgNCiAgICAgICAgaG92ZXIgPSBsaXN0KA0KICAgICAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgICAgIHJhZGl1cyA9IDUNCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIDkuIEZvcm1hdGHDp8Ojbw0KDQpncmFmaWNvIDwtIGdyYWZpY28gfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF90aGVtZSgNCiAgICB0ZW1hX2libWFjcm8NCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfdGl0bGUoDQogICAgdGV4dCA9ICJFbXByZWdvIGUgcmVuZGltZW50byBjb21iaW5hZG9zIG5vcyBzZXRvcmVzIHRyYW5zYWNpb27DoXZlaXMiDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3N1YnRpdGxlKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiSW5kaWNhZG9yIHNpbnTDqXRpY28gZGUgcGVzc29hcyBvY3VwYWRhcyBlIHJlbmRpbWVudG8gbcOpZGlvIHJlYWwg4oCUICIsDQogICAgICAiw61uZGljZXMgMjAxMiA9IDEwMCwgQnJhc2lsLCAyMDEy4oCTMjAyNSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3hBeGlzKA0KICAgIGNhdGVnb3JpZXMgPSBhcy5jaGFyYWN0ZXIoMjAxMjoyMDI1KSwNCiAgICB0aXRsZSA9IGxpc3QoDQogICAgICB0ZXh0ID0gIkFubyINCiAgICApLA0KICAgIHRpY2tJbnRlcnZhbCA9IDEsDQogICAgdGlja21hcmtQbGFjZW1lbnQgPSAib24iLA0KICAgIGxhYmVscyA9IGxpc3QoDQogICAgICByb3RhdGlvbiA9IDAsDQogICAgICBzdGVwID0gMQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfeUF4aXMoDQogICAgdGl0bGUgPSBsaXN0KA0KICAgICAgdGV4dCA9ICLDjW5kaWNlIGNvbWJpbmFkbyAoMjAxMiA9IDEwMCkiDQogICAgKSwNCiAgICBtaW4gPSBsaW1pdGVfaW5mZXJpb3JfZ3JhZmljbzcsDQogICAgbWF4ID0gbGltaXRlX3N1cGVyaW9yX2dyYWZpY283LA0KICAgIHN0YXJ0T25UaWNrID0gRkFMU0UsDQogICAgZW5kT25UaWNrID0gRkFMU0UsDQogICAgbGFiZWxzID0gbGlzdCgNCiAgICAgIGZvcm1hdHRlciA9IGh0bWx3aWRnZXRzOjpKUygNCiAgICAgICAgImZ1bmN0aW9uICgpIHsNCiAgICAgICAgICByZXR1cm4gSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICB0aGlzLnZhbHVlLA0KICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICcsJywNCiAgICAgICAgICAgICcuJw0KICAgICAgICAgICk7DQogICAgICAgIH0iDQogICAgICApDQogICAgKSwNCiAgICBwbG90TGluZXMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgdmFsdWUgPSAxMDAsDQogICAgICAgIGNvbG9yID0gdW5uYW1lKA0KICAgICAgICAgIGNvcmVzX2libWFjcm9bImNpbnphIl0NCiAgICAgICAgKSwNCiAgICAgICAgZGFzaFN0eWxlID0gIlNob3J0RG90IiwNCiAgICAgICAgd2lkdGggPSAxLjIsDQogICAgICAgIHpJbmRleCA9IDMsDQogICAgICAgIGxhYmVsID0gbGlzdCgNCiAgICAgICAgICB0ZXh0ID0gIkJhc2UgMjAxMiIsDQogICAgICAgICAgYWxpZ24gPSAicmlnaHQiLA0KICAgICAgICAgIHggPSAtOCwNCiAgICAgICAgICB5ID0gLTcsDQogICAgICAgICAgc3R5bGUgPSBsaXN0KA0KICAgICAgICAgICAgY29sb3IgPSB1bm5hbWUoDQogICAgICAgICAgICAgIGNvcmVzX2libWFjcm9bImNpbnphIl0NCiAgICAgICAgICAgICksDQogICAgICAgICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICAgICAgICkNCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfcGxvdE9wdGlvbnMoDQogICAgbGluZSA9IGxpc3QoDQogICAgICBmaWxsT3BhY2l0eSA9IDAsDQogICAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICAgIGRhdGFMYWJlbHMgPSBsaXN0KA0KICAgICAgICBlbmFibGVkID0gRkFMU0UNCiAgICAgICkNCiAgICApLA0KICAgIHNlcmllcyA9IGxpc3QoDQogICAgICBhbmltYXRpb24gPSBUUlVFLA0KICAgICAgc2hhZG93ID0gRkFMU0UsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBpbmFjdGl2ZSA9IGxpc3QoDQogICAgICAgICAgb3BhY2l0eSA9IDAuMzUNCiAgICAgICAgKSwNCiAgICAgICAgaG92ZXIgPSBsaXN0KA0KICAgICAgICAgIGxpbmVXaWR0aFBsdXMgPSAxDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gVFJVRSwNCiAgICB1c2VIVE1MID0gVFJVRSwNCiAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICBjb25zdCBuZiA9IGZ1bmN0aW9uKHZhbG9yKSB7DQogICAgICAgICAgcmV0dXJuIEhpZ2hjaGFydHMubnVtYmVyRm9ybWF0KA0KICAgICAgICAgICAgdmFsb3IsDQogICAgICAgICAgICAyLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBhbm8gPSB0aGlzLnBvaW50c1swXS5wb2ludC5jdXN0b20uYW5vOw0KDQogICAgICAgIGxldCBjb250ZXVkbyA9DQogICAgICAgICAgJzxkaXYgc3R5bGU9XCJtaW4td2lkdGg6MzMwcHg7cGFkZGluZzo0cHggMnB4O1wiPicgKw0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6MTNweDtmb250LXdlaWdodDpib2xkOycgKw0KICAgICAgICAgICAgICAnbWFyZ2luLWJvdHRvbTo5cHg7Y29sb3I6IzExMTgyNztcIj4nICsNCiAgICAgICAgICAgICAgYW5vICsNCiAgICAgICAgICAgICc8L2Rpdj4nOw0KDQogICAgICAgIHRoaXMucG9pbnRzLmZvckVhY2goZnVuY3Rpb24ocG9udG8sIGluZGljZSkgew0KICAgICAgICAgIGNvbnN0IGQgPSBwb250by5wb2ludC5jdXN0b207DQoNCiAgICAgICAgICBjb250ZXVkbyArPQ0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOicgKw0KICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgaW5kaWNlIDwgMSA/ICcxMHB4JyA6ICcwJw0KICAgICAgICAgICAgICApICsNCiAgICAgICAgICAgICAgJztcIj4nICsNCg0KICAgICAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLWJvdHRvbTozcHg7XCI+JyArDQogICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPVwiY29sb3I6JyArDQogICAgICAgICAgICAgICAgICBwb250by5jb2xvciArDQogICAgICAgICAgICAgICAgICAnO1wiPuKXjzwvc3Bhbj4gJyArDQogICAgICAgICAgICAgICAgZC5zZXRvciArDQogICAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICAgICAnSW5kaWNhZG9yIGNvbWJpbmFkbzogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5pbmRpY2VfY29tYmluYWRvKSArDQogICAgICAgICAgICAgICc8L2I+PGJyPicgKw0KDQogICAgICAgICAgICAgICfDjW5kaWNlIGRlIGVtcHJlZ286IDxiPicgKw0KICAgICAgICAgICAgICAgIG5mKGQuaW5kaWNlX2VtcHJlZ28pICsNCiAgICAgICAgICAgICAgJzwvYj48YnI+JyArDQoNCiAgICAgICAgICAgICAgJ1Blc3NvYXMgb2N1cGFkYXM6IDxiPicgKw0KICAgICAgICAgICAgICAgIG5mKGQub2N1cGFkb3NfbWlsKSArDQogICAgICAgICAgICAgICAgJyBtaWwgcGVzc29hczwvYj48YnI+JyArDQoNCiAgICAgICAgICAgICAgJ8ONbmRpY2UgZGUgcmVuZGltZW50bzogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5pbmRpY2VfcmVuZGltZW50bykgKw0KICAgICAgICAgICAgICAnPC9iPjxicj4nICsNCg0KICAgICAgICAgICAgICAnUmVuZGltZW50byBtw6lkaW8gcmVhbDogPGI+UiQgJyArDQogICAgICAgICAgICAgICAgbmYoZC5yZW5kaW1lbnRvX3JlYWxfYW51YWwpICsNCiAgICAgICAgICAgICAgICAnIHBvciBtw6pzPC9iPicgKw0KDQogICAgICAgICAgICAnPC9kaXY+JzsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgY29udGV1ZG8gKz0gJzwvZGl2Pic7DQoNCiAgICAgICAgcmV0dXJuIGNvbnRldWRvOw0KICAgICAgfSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2xlZ2VuZCgNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBsYXlvdXQgPSAiaG9yaXpvbnRhbCIsDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICB2ZXJ0aWNhbEFsaWduID0gInRvcCIsDQogICAgeSA9IDU1LA0KICAgIGZsb2F0aW5nID0gRkFMU0UsDQogICAgdGl0bGUgPSBsaXN0KA0KICAgICAgdGV4dCA9IE5VTEwNCiAgICApLA0KICAgIHN5bWJvbFdpZHRoID0gMjQsDQogICAgaXRlbURpc3RhbmNlID0gMjUNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY2FwdGlvbigNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIk5vdGE6IG8gaW5kaWNhZG9yIGNvbWJpbmEgYSB2YXJpYcOnw6NvIGRvIG7Dum1lcm8gZGUgcGVzc29hcyBvY3VwYWRhcyAiLA0KICAgICAgImNvbSBhIHZhcmlhw6fDo28gZG8gcmVuZGltZW50byBtw6lkaW8gcmVhbCBkZSBjYWRhIHNldG9yLiBFbGUgbsOjbyAiLA0KICAgICAgImNvcnJlc3BvbmRlIMOgIG1hc3NhIG9maWNpYWwgZGUgcmVuZGltZW50byBkbyB0cmFiYWxobyBlIGRldmUgc2VyICIsDQogICAgICAiaW50ZXJwcmV0YWRvIGFwZW5hcyBjb21vIHVtYSBtZWRpZGEgc2ludMOpdGljYSBkYSBldm9sdcOnw6NvIGNvbmp1bnRhICIsDQogICAgICAiZG9zIGRvaXMgY29tcG9uZW50ZXMuIg0KICAgICksDQogICAgYWxpZ24gPSAibGVmdCIsDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzZCNzI4MCIsDQogICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfZXhwb3J0aW5nKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIGZpbGVuYW1lID0gImVtcHJlZ28tcmVuZGltZW50by1jb21iaW5hZG9zLTIwMTItMjAyNSINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY3JlZGl0cygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkZvbnRlOiBJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyBTSURSQSA0MzYyIGUgNTQ0Mi4gIiwNCiAgICAgICJFbGFib3Jhw6fDo28gcHLDs3ByaWEgSWJNYWNybyBCSC4iDQogICAgKSwNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjb2xvciA9ICIjNkI3MjgwIiwNCiAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgKQ0KICApDQoNCiMgMTAuIEV4aWJpw6fDo28NCg0KZ3JhZmljbw0KDQpgYGANCg0KT3MgZG9pcyBzZXRvcmVzIHBlcmRlcmFtIGZvcsOnYSBkdXJhbnRlIGEgcmVjZXNzw6NvIGRlIDIwMTUgZSAyMDE2LiBPIGluZGljYWRvciBhZ3JvcGVjdcOhcmlvIGNhaXUgcGFyYSA4OSw3IGVtIDIwMTYgZSBvIGluZHVzdHJpYWwgcGFyYSA4OSw4LCBtb3N0cmFuZG8gcXVlIGVtcHJlZ28gZSByZW5kaW1lbnRvIHNlIGVuZnJhcXVlY2VyYW0gYW8gbWVzbW8gdGVtcG8uIEEgSW5kw7pzdHJpYSBnZXJhbCB2b2x0b3UgYSBjYWlyIGNvbSBpbnRlbnNpZGFkZSBlbSAyMDIxLCBxdWFuZG8gYXRpbmdpdSA4Nyw2LCBtYXMgc2UgcmVjdXBlcm91IG5vcyBhbm9zIHNlZ3VpbnRlcyBlIGVuY2Vycm91IDIwMjUgZW0gMTEyLDMuDQoNCk5hIEFncm9wZWN1w6FyaWEsIG8gaW5kaWNhZG9yIGFsY2Fuw6dvdSAxMDMsNiBlbSAyMDI1LiBFc3NlIHJlc3VsdGFkbywgbGlnZWlyYW1lbnRlIHN1cGVyaW9yIGFvIG7DrXZlbCBkZSAyMDEyLCBuw6NvIGRlY29ycmV1IGRhIGV4cGFuc8OjbyBkbyBlbXByZWdvLCBxdWUgdGVybWlub3UgY2VyY2EgZGUgMjIsMyUgYWJhaXhvIGRhIGJhc2UuIEZvaSBvIGF1bWVudG8gZG8gcmVuZGltZW50byBtw6lkaW8gcmVhbCBxdWUgY29tcGVuc291IGEgcmVkdcOnw6NvIGRvIG7Dum1lcm8gZGUgb2N1cGFkb3MuIE5hIEluZMO6c3RyaWEgZ2VyYWwsIGEgbWVsaG9yYSBmaW5hbCBmb2kgbWFpcyBlcXVpbGlicmFkYSwgcG9pcyB0YW50byBvIGVtcHJlZ28gcXVhbnRvIG8gcmVuZGltZW50byB0ZXJtaW5hcmFtIGFjaW1hIGRlIDIwMTIuDQoNCiMjIDIuOCBEZWNvbXBvc2nDp8OjbyBkYSB2YXJpYcOnw6NvIGNvbmp1bnRhDQoNClBhcmEgaWRlbnRpZmljYXIgY29tbyBlbXByZWdvIGUgcmVuZGltZW50byBmb3JtYXJhbSBvIHJlc3VsdGFkbyBkZSAyMDI1LCBhIG11ZGFuw6dhIGRvIGluZGljYWRvciBjb21iaW5hZG8gZm9pIHNlcGFyYWRhIGVtIHRyw6pzIHBhcnRlcy4gQSBjb250cmlidWnDp8OjbyBkbyBlbXByZWdvIGNvcnJlc3BvbmRlIGFvIGFmYXN0YW1lbnRvIGRvIMOtbmRpY2UgZGUgb2N1cGHDp8OjbyBlbSByZWxhw6fDo28gYSAxMDA6DQoNCiQkDQpDRV9zID0NCklee0V9X3tzLDIwMjV9DQotIDEwMA0KJCQNCg0KQSBjb250cmlidWnDp8OjbyBkbyByZW5kaW1lbnRvIHJlYWwgw6kgZGFkYSBwb3I6DQoNCiQkDQpDUl9zID0NCklee1J9X3tzLDIwMjV9DQotIDEwMA0KJCQNCg0KQ29tbyBvcyBkb2lzIMOtbmRpY2VzIG11ZGFyYW0gYW8gbWVzbW8gdGVtcG8sIGV4aXN0ZSBhaW5kYSB1bWEgcGFyY2VsYSBkZSBpbnRlcmHDp8OjbzoNCg0KJCQNCkNJX3MgPQ0KXGZyYWN7DQpcbGVmdChJXntFfV97cywyMDI1fS0xMDBccmlnaHQpDQpcbGVmdChJXntSfV97cywyMDI1fS0xMDBccmlnaHQpDQp9ezEwMH0NCiQkDQoNCkEgdmFyaWHDp8OjbyB0b3RhbCDDqSBjYWxjdWxhZGEgcG9yOg0KDQokJA0KXERlbHRhIENfcyA9DQpDX3tzLDIwMjV9DQotIDEwMA0KJCQNCg0KZSBhIGRlY29tcG9zacOnw6NvIGF0ZW5kZSDDoCBpZGVudGlkYWRlOg0KDQokJA0KXERlbHRhIENfcyA9DQpDRV9zICsgQ1JfcyArIENJX3MNCiQkDQoNCkEgaW50ZXJhw6fDo28gw6kgYXBlbmFzIHVtYSBjb25zZXF1w6puY2lhIG1hdGVtw6F0aWNhIGRhIHZhcmlhw6fDo28gc2ltdWx0w6JuZWEgZG9zIGRvaXMgY29tcG9uZW50ZXMgZSBuw6NvIGRldmUgc2VyIGludGVycHJldGFkYSBjb21vIHVtIGVmZWl0byBjYXVzYWwuDQoNCioqR3LDoWZpY28gMi44IOKAlCBDb21wb25lbnRlcyBkYSB2YXJpYcOnw6NvIGNvbmp1bnRhIGRlIGVtcHJlZ28gZSByZW5kaW1lbnRvKioNCg0KYGBge3IgcDItZGVjb21wb3NpY2FvLWVtcHJlZ28tcmVuZGltZW50bywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyAxLiBWYWxpZGHDp8OjbyBkbyBvYmpldG8gZGFkb3NfZ3JhZmljbzcNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzcgbsOjbyBleGlzdGUuIEV4ZWN1dGUgcHJpbWVpcm8gbyBjaHVuayBkbyBHcsOhZmljbyAyLjcuIiA9DQogICAgZXhpc3RzKCJkYWRvc19ncmFmaWNvNyIpDQopDQoNCmNvbHVuYXNfbmVjZXNzYXJpYXNfZ3JhZmljbzggPC0gYygNCiAgImFubyIsDQogICJzZXRvciIsDQogICJvY3VwYWRvc19taWwiLA0KICAicmVuZGltZW50b19yZWFsX2FudWFsIiwNCiAgImluZGljZV9lbXByZWdvIiwNCiAgImluZGljZV9yZW5kaW1lbnRvIiwNCiAgImluZGljZV9jb21iaW5hZG8iDQopDQoNCnN0b3BpZm5vdCgNCiAgIk8gb2JqZXRvIGRhZG9zX2dyYWZpY283IG7Do28gY29udMOpbSB0b2RhcyBhcyB2YXJpw6F2ZWlzIG5lY2Vzc8Ohcmlhcy4iID0NCiAgICBhbGwoY29sdW5hc19uZWNlc3Nhcmlhc19ncmFmaWNvOCAlaW4lIG5hbWVzKGRhZG9zX2dyYWZpY283KSkNCikNCg0KZGFkb3Nfb3JpZ2VtX2dyYWZpY284IDwtIGRhZG9zX2dyYWZpY283IHw+DQogIGRwbHlyOjp0cmFuc211dGUoDQogICAgYW5vID0gYXMuaW50ZWdlcihhbm8pLA0KICAgIHNldG9yID0gYXMuY2hhcmFjdGVyKHNldG9yKSwNCiAgICBvY3VwYWRvc19taWwgPSBhcy5udW1lcmljKG9jdXBhZG9zX21pbCksDQogICAgcmVuZGltZW50b19yZWFsX2FudWFsID0gYXMubnVtZXJpYyhyZW5kaW1lbnRvX3JlYWxfYW51YWwpLA0KICAgIGluZGljZV9lbXByZWdvID0gYXMubnVtZXJpYyhpbmRpY2VfZW1wcmVnbyksDQogICAgaW5kaWNlX3JlbmRpbWVudG8gPSBhcy5udW1lcmljKGluZGljZV9yZW5kaW1lbnRvKSwNCiAgICBpbmRpY2VfY29tYmluYWRvID0gYXMubnVtZXJpYyhpbmRpY2VfY29tYmluYWRvKQ0KICApIHw+DQogIGRwbHlyOjphcnJhbmdlKHNldG9yLCBhbm8pDQoNCmNvbnRhZ2VtX3NldG9yZXNfZ3JhZmljbzggPC0gZGFkb3Nfb3JpZ2VtX2dyYWZpY284IHw+DQogIGRwbHlyOjpjb3VudChzZXRvciwgbmFtZSA9ICJvYnNlcnZhY29lcyIpDQoNCmFub3NfcG9yX3NldG9yX2dyYWZpY284IDwtIGRhZG9zX29yaWdlbV9ncmFmaWNvOCB8Pg0KICBkcGx5cjo6Z3JvdXBfYnkoc2V0b3IpIHw+DQogIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgYW5vc192YWxpZG9zID0gc2V0ZXF1YWwoYW5vLCAyMDEyOjIwMjUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQp2YWxvcmVzX251bWVyaWNvc19vcmlnZW1fZ3JhZmljbzggPC0gZGFkb3Nfb3JpZ2VtX2dyYWZpY284IHw+DQogIGRwbHlyOjpzZWxlY3Qod2hlcmUoaXMubnVtZXJpYykpIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0KZGFkb3NfYmFzZV8yMDEyX2dyYWZpY284IDwtIGRhZG9zX29yaWdlbV9ncmFmaWNvOCB8Pg0KICBkcGx5cjo6ZmlsdGVyKGFubyA9PSAyMDEyKQ0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvNyBuw6NvIHBvc3N1aSBleGF0YW1lbnRlIDI4IG9ic2VydmHDp8O1ZXMuIiA9DQogICAgbnJvdyhkYWRvc19vcmlnZW1fZ3JhZmljbzgpID09IDI4LA0KICAiT3Mgc2V0b3JlcyBkbyBvYmpldG8gZGFkb3NfZ3JhZmljbzcgbsOjbyBzw6NvIG9zIGVzcGVyYWRvcy4iID0NCiAgICBzZXRlcXVhbCgNCiAgICAgIHVuaXF1ZShkYWRvc19vcmlnZW1fZ3JhZmljbzgkc2V0b3IpLA0KICAgICAgYygiQWdyb3BlY3XDoXJpYSIsICJJbmTDunN0cmlhIGdlcmFsIikNCiAgICApLA0KICAiQ2FkYSBzZXRvciBkZXZlIHBvc3N1aXIgZXhhdGFtZW50ZSAxNCBvYnNlcnZhw6fDtWVzLiIgPQ0KICAgIG5yb3coY29udGFnZW1fc2V0b3Jlc19ncmFmaWNvOCkgPT0gMiAmJg0KICAgIGFsbChjb250YWdlbV9zZXRvcmVzX2dyYWZpY284JG9ic2VydmFjb2VzID09IDE0KSwNCiAgIk9zIHNldG9yZXMgbsOjbyBwb3NzdWVtIHRvZG9zIG9zIGFub3MgZGUgMjAxMiBhIDIwMjUuIiA9DQogICAgbnJvdyhhbm9zX3Bvcl9zZXRvcl9ncmFmaWNvOCkgPT0gMiAmJg0KICAgIGFsbChhbm9zX3Bvcl9zZXRvcl9ncmFmaWNvOCRhbm9zX3ZhbGlkb3MpLA0KICAiRXhpc3RlbSBjb21iaW5hw6fDtWVzIGR1cGxpY2FkYXMgZGUgYW5vIGUgc2V0b3IuIiA9DQogICAgZHBseXI6Om5fZGlzdGluY3QoDQogICAgICBkYWRvc19vcmlnZW1fZ3JhZmljbzgkYW5vLA0KICAgICAgZGFkb3Nfb3JpZ2VtX2dyYWZpY284JHNldG9yDQogICAgKSA9PSAyOCwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBhdXNlbnRlcyBubyBvYmpldG8gZGFkb3NfZ3JhZmljbzcuIiA9DQogICAgIWFueU5BKGRhZG9zX29yaWdlbV9ncmFmaWNvOCksDQogICJFeGlzdGVtIHZhbG9yZXMgaW5maW5pdG9zIG5vIG9iamV0byBkYWRvc19ncmFmaWNvNy4iID0NCiAgICBhbGwoaXMuZmluaXRlKHZhbG9yZXNfbnVtZXJpY29zX29yaWdlbV9ncmFmaWNvOCkpLA0KICAiRXhpc3RlbSB2YWxvcmVzIGRlIGVtcHJlZ28gbsOjbyBwb3NpdGl2b3MuIiA9DQogICAgYWxsKGRhZG9zX29yaWdlbV9ncmFmaWNvOCRvY3VwYWRvc19taWwgPiAwKSwNCiAgIkV4aXN0ZW0gdmFsb3JlcyBkZSByZW5kaW1lbnRvIG7Do28gcG9zaXRpdm9zLiIgPQ0KICAgIGFsbChkYWRvc19vcmlnZW1fZ3JhZmljbzgkcmVuZGltZW50b19yZWFsX2FudWFsID4gMCksDQogICJPIMOtbmRpY2UgZGUgZW1wcmVnbyBuw6NvIMOpIGlndWFsIGEgMTAwIGVtIDIwMTIuIiA9DQogICAgYWxsKGFicyhkYWRvc19iYXNlXzIwMTJfZ3JhZmljbzgkaW5kaWNlX2VtcHJlZ28gLSAxMDApIDwgMWUtOCksDQogICJPIMOtbmRpY2UgZGUgcmVuZGltZW50byBuw6NvIMOpIGlndWFsIGEgMTAwIGVtIDIwMTIuIiA9DQogICAgYWxsKGFicyhkYWRvc19iYXNlXzIwMTJfZ3JhZmljbzgkaW5kaWNlX3JlbmRpbWVudG8gLSAxMDApIDwgMWUtOCksDQogICJPIGluZGljYWRvciBjb21iaW5hZG8gbsOjbyDDqSBpZ3VhbCBhIDEwMCBlbSAyMDEyLiIgPQ0KICAgIGFsbChhYnMoZGFkb3NfYmFzZV8yMDEyX2dyYWZpY284JGluZGljZV9jb21iaW5hZG8gLSAxMDApIDwgMWUtOCksDQogICJPIGluZGljYWRvciBjb21iaW5hZG8gbsOjbyBjb3JyZXNwb25kZSBhbyBwcm9kdXRvIGRvcyDDrW5kaWNlcy4iID0NCiAgICBhbGwoDQogICAgICBhYnMoDQogICAgICAgIGRhZG9zX29yaWdlbV9ncmFmaWNvOCRpbmRpY2VfY29tYmluYWRvIC0NCiAgICAgICAgICBkYWRvc19vcmlnZW1fZ3JhZmljbzgkaW5kaWNlX2VtcHJlZ28gKg0KICAgICAgICAgIGRhZG9zX29yaWdlbV9ncmFmaWNvOCRpbmRpY2VfcmVuZGltZW50byAvIDEwMA0KICAgICAgKSA8IDFlLTgNCiAgICApDQopDQoNCiMgMi4gU2VsZcOnw6NvIGRvcyBkYWRvcyBkZSAyMDI1DQoNCmRhZG9zX2dyYWZpY284IDwtIGRhZG9zX29yaWdlbV9ncmFmaWNvOCB8Pg0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIGFubyA9PSAyMDI1LA0KICAgIHNldG9yICVpbiUgYygiQWdyb3BlY3XDoXJpYSIsICJJbmTDunN0cmlhIGdlcmFsIikNCiAgKSB8Pg0KICBkcGx5cjo6dHJhbnNtdXRlKA0KICAgIHNldG9yID0gZmFjdG9yKA0KICAgICAgc2V0b3IsDQogICAgICBsZXZlbHMgPSBjKCJBZ3JvcGVjdcOhcmlhIiwgIkluZMO6c3RyaWEgZ2VyYWwiKQ0KICAgICksDQogICAgb2N1cGFkb3NfMjAyNV9taWwgPSBvY3VwYWRvc19taWwsDQogICAgcmVuZGltZW50b19yZWFsXzIwMjUgPSByZW5kaW1lbnRvX3JlYWxfYW51YWwsDQogICAgaW5kaWNlX2VtcHJlZ29fMjAyNSA9IGluZGljZV9lbXByZWdvLA0KICAgIGluZGljZV9yZW5kaW1lbnRvXzIwMjUgPSBpbmRpY2VfcmVuZGltZW50bywNCiAgICBpbmRpY2VfY29tYmluYWRvXzIwMjUgPSBpbmRpY2VfY29tYmluYWRvDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2Uoc2V0b3IpDQoNCiMgMy4gQ8OhbGN1bG8gZGFzIGNvbnRyaWJ1acOnw7Vlcw0KDQpkYWRvc19ncmFmaWNvOCA8LSBkYWRvc19ncmFmaWNvOCB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIGNvbnRyaWJ1aWNhb19lbXByZWdvID0NCiAgICAgIGluZGljZV9lbXByZWdvXzIwMjUgLSAxMDAsDQogICAgY29udHJpYnVpY2FvX3JlbmRpbWVudG8gPQ0KICAgICAgaW5kaWNlX3JlbmRpbWVudG9fMjAyNSAtIDEwMCwNCiAgICBjb250cmlidWljYW9faW50ZXJhY2FvID0NCiAgICAgICgNCiAgICAgICAgKGluZGljZV9lbXByZWdvXzIwMjUgLSAxMDApICoNCiAgICAgICAgKGluZGljZV9yZW5kaW1lbnRvXzIwMjUgLSAxMDApDQogICAgICApIC8gMTAwLA0KICAgIHZhcmlhY2FvX3RvdGFsX2luZGljZSA9DQogICAgICBpbmRpY2VfY29tYmluYWRvXzIwMjUgLSAxMDANCiAgKSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIHNldG9yLA0KICAgIG9jdXBhZG9zXzIwMjVfbWlsLA0KICAgIHJlbmRpbWVudG9fcmVhbF8yMDI1LA0KICAgIGluZGljZV9lbXByZWdvXzIwMjUsDQogICAgaW5kaWNlX3JlbmRpbWVudG9fMjAyNSwNCiAgICBpbmRpY2VfY29tYmluYWRvXzIwMjUsDQogICAgY29udHJpYnVpY2FvX2VtcHJlZ28sDQogICAgY29udHJpYnVpY2FvX3JlbmRpbWVudG8sDQogICAgY29udHJpYnVpY2FvX2ludGVyYWNhbywNCiAgICB2YXJpYWNhb190b3RhbF9pbmRpY2UNCiAgKQ0KDQojIDQuIE9yZ2FuaXphw6fDo28gZSB2YWxpZGHDp8OjbyBkZSBkYWRvc19ncmFmaWNvOA0KDQpzb21hX2NvbXBvbmVudGVzX2dyYWZpY284IDwtDQogIGRhZG9zX2dyYWZpY284JGNvbnRyaWJ1aWNhb19lbXByZWdvICsNCiAgZGFkb3NfZ3JhZmljbzgkY29udHJpYnVpY2FvX3JlbmRpbWVudG8gKw0KICBkYWRvc19ncmFmaWNvOCRjb250cmlidWljYW9faW50ZXJhY2FvDQoNCnZhbG9yZXNfbnVtZXJpY29zX2dyYWZpY284IDwtIGRhZG9zX2dyYWZpY284IHw+DQogIGRwbHlyOjpzZWxlY3Qod2hlcmUoaXMubnVtZXJpYykpIHw+DQogIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkNCg0Kc3RvcGlmbm90KA0KICAiTyBvYmpldG8gZGFkb3NfZ3JhZmljbzggbsOjbyBwb3NzdWkgZXhhdGFtZW50ZSBkdWFzIG9ic2VydmHDp8O1ZXMuIiA9DQogICAgbnJvdyhkYWRvc19ncmFmaWNvOCkgPT0gMiwNCiAgIk9zIHNldG9yZXMgZG8gb2JqZXRvIGZpbmFsIG7Do28gc8OjbyBvcyBlc3BlcmFkb3MuIiA9DQogICAgYWxsKA0KICAgICAgYXMuY2hhcmFjdGVyKGRhZG9zX2dyYWZpY284JHNldG9yKSA9PQ0KICAgICAgICBjKCJBZ3JvcGVjdcOhcmlhIiwgIkluZMO6c3RyaWEgZ2VyYWwiKQ0KICAgICksDQogICJFeGlzdGVtIHNldG9yZXMgZHVwbGljYWRvcyBubyBvYmpldG8gZGFkb3NfZ3JhZmljbzguIiA9DQogICAgZHBseXI6Om5fZGlzdGluY3QoZGFkb3NfZ3JhZmljbzgkc2V0b3IpID09IDIsDQogICJFeGlzdGVtIHZhbG9yZXMgYXVzZW50ZXMgbm8gb2JqZXRvIGRhZG9zX2dyYWZpY284LiIgPQ0KICAgICFhbnlOQShkYWRvc19ncmFmaWNvOCksDQogICJFeGlzdGVtIHZhbG9yZXMgaW5maW5pdG9zIG5vIG9iamV0byBkYWRvc19ncmFmaWNvOC4iID0NCiAgICBhbGwoaXMuZmluaXRlKHZhbG9yZXNfbnVtZXJpY29zX2dyYWZpY284KSksDQogICJBIHZhcmlhw6fDo28gdG90YWwgZG8gaW5kaWNhZG9yIGZvaSBjYWxjdWxhZGEgaW5jb3JyZXRhbWVudGUuIiA9DQogICAgYWxsKA0KICAgICAgYWJzKA0KICAgICAgICBkYWRvc19ncmFmaWNvOCR2YXJpYWNhb190b3RhbF9pbmRpY2UgLQ0KICAgICAgICAgIChkYWRvc19ncmFmaWNvOCRpbmRpY2VfY29tYmluYWRvXzIwMjUgLSAxMDApDQogICAgICApIDwgMWUtOA0KICAgICksDQogICJBIGNvbnRyaWJ1acOnw6NvIGRvIGVtcHJlZ28gZm9pIGNhbGN1bGFkYSBpbmNvcnJldGFtZW50ZS4iID0NCiAgICBhbGwoDQogICAgICBhYnMoDQogICAgICAgIGRhZG9zX2dyYWZpY284JGNvbnRyaWJ1aWNhb19lbXByZWdvIC0NCiAgICAgICAgICAoZGFkb3NfZ3JhZmljbzgkaW5kaWNlX2VtcHJlZ29fMjAyNSAtIDEwMCkNCiAgICAgICkgPCAxZS04DQogICAgKSwNCiAgIkEgY29udHJpYnVpw6fDo28gZG8gcmVuZGltZW50byBmb2kgY2FsY3VsYWRhIGluY29ycmV0YW1lbnRlLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgZGFkb3NfZ3JhZmljbzgkY29udHJpYnVpY2FvX3JlbmRpbWVudG8gLQ0KICAgICAgICAgIChkYWRvc19ncmFmaWNvOCRpbmRpY2VfcmVuZGltZW50b18yMDI1IC0gMTAwKQ0KICAgICAgKSA8IDFlLTgNCiAgICApLA0KICAiQSBjb250cmlidWnDp8OjbyBkYSBpbnRlcmHDp8OjbyBmb2kgY2FsY3VsYWRhIGluY29ycmV0YW1lbnRlLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgZGFkb3NfZ3JhZmljbzgkY29udHJpYnVpY2FvX2ludGVyYWNhbyAtDQogICAgICAgICAgKA0KICAgICAgICAgICAgKGRhZG9zX2dyYWZpY284JGluZGljZV9lbXByZWdvXzIwMjUgLSAxMDApICoNCiAgICAgICAgICAgIChkYWRvc19ncmFmaWNvOCRpbmRpY2VfcmVuZGltZW50b18yMDI1IC0gMTAwKQ0KICAgICAgICAgICkgLyAxMDANCiAgICAgICkgPCAxZS04DQogICAgKSwNCiAgIkEgc29tYSBkb3MgY29tcG9uZW50ZXMgbsOjbyBjb3JyZXNwb25kZSDDoCB2YXJpYcOnw6NvIHRvdGFsLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgc29tYV9jb21wb25lbnRlc19ncmFmaWNvOCAtDQogICAgICAgICAgZGFkb3NfZ3JhZmljbzgkdmFyaWFjYW9fdG90YWxfaW5kaWNlDQogICAgICApIDwgMWUtOA0KICAgICkNCikNCg0KIyA1LiBQcmVwYXJhw6fDo28gZGFzIHPDqXJpZXMgZSBsaW1pdGVzDQoNCmNyaWFyX3BvbnRvc19jb21wb25lbnRlIDwtIGZ1bmN0aW9uKHZhcmlhdmVsLCBub21lX2NvbXBvbmVudGUpIHsNCiAgbGFwcGx5KA0KICAgIHNlcV9sZW4obnJvdyhkYWRvc19ncmFmaWNvOCkpLA0KICAgIGZ1bmN0aW9uKGkpIHsNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBpIC0gMSwNCiAgICAgICAgeSA9IGRhZG9zX2dyYWZpY284W1t2YXJpYXZlbF1dW2ldLA0KICAgICAgICBjdXN0b20gPSBsaXN0KA0KICAgICAgICAgIHNldG9yID0gYXMuY2hhcmFjdGVyKGRhZG9zX2dyYWZpY284JHNldG9yW2ldKSwNCiAgICAgICAgICBub21lX2NvbXBvbmVudGUgPSBub21lX2NvbXBvbmVudGUsDQogICAgICAgICAgdmFsb3JfY29tcG9uZW50ZSA9IGRhZG9zX2dyYWZpY284W1t2YXJpYXZlbF1dW2ldLA0KICAgICAgICAgIGNvbnRyaWJ1aWNhb19lbXByZWdvID0NCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY284JGNvbnRyaWJ1aWNhb19lbXByZWdvW2ldLA0KICAgICAgICAgIGNvbnRyaWJ1aWNhb19yZW5kaW1lbnRvID0NCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY284JGNvbnRyaWJ1aWNhb19yZW5kaW1lbnRvW2ldLA0KICAgICAgICAgIGNvbnRyaWJ1aWNhb19pbnRlcmFjYW8gPQ0KICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzgkY29udHJpYnVpY2FvX2ludGVyYWNhb1tpXSwNCiAgICAgICAgICB2YXJpYWNhb190b3RhbF9pbmRpY2UgPQ0KICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzgkdmFyaWFjYW9fdG90YWxfaW5kaWNlW2ldLA0KICAgICAgICAgIGluZGljZV9lbXByZWdvXzIwMjUgPQ0KICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzgkaW5kaWNlX2VtcHJlZ29fMjAyNVtpXSwNCiAgICAgICAgICBpbmRpY2VfcmVuZGltZW50b18yMDI1ID0NCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY284JGluZGljZV9yZW5kaW1lbnRvXzIwMjVbaV0sDQogICAgICAgICAgaW5kaWNlX2NvbWJpbmFkb18yMDI1ID0NCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY284JGluZGljZV9jb21iaW5hZG9fMjAyNVtpXSwNCiAgICAgICAgICBvY3VwYWRvc18yMDI1X21pbCA9DQogICAgICAgICAgICBkYWRvc19ncmFmaWNvOCRvY3VwYWRvc18yMDI1X21pbFtpXSwNCiAgICAgICAgICByZW5kaW1lbnRvX3JlYWxfMjAyNSA9DQogICAgICAgICAgICBkYWRvc19ncmFmaWNvOCRyZW5kaW1lbnRvX3JlYWxfMjAyNVtpXQ0KICAgICAgICApDQogICAgICApDQogICAgfQ0KICApDQp9DQoNCnBvbnRvc19lbXByZWdvX2dyYWZpY284IDwtIGNyaWFyX3BvbnRvc19jb21wb25lbnRlKA0KICAiY29udHJpYnVpY2FvX2VtcHJlZ28iLA0KICAiRW1wcmVnbyINCikNCg0KcG9udG9zX3JlbmRpbWVudG9fZ3JhZmljbzggPC0gY3JpYXJfcG9udG9zX2NvbXBvbmVudGUoDQogICJjb250cmlidWljYW9fcmVuZGltZW50byIsDQogICJSZW5kaW1lbnRvIHJlYWwiDQopDQoNCnBvbnRvc19pbnRlcmFjYW9fZ3JhZmljbzggPC0gY3JpYXJfcG9udG9zX2NvbXBvbmVudGUoDQogICJjb250cmlidWljYW9faW50ZXJhY2FvIiwNCiAgIkludGVyYcOnw6NvIg0KKQ0KDQpwb250b3NfdG90YWxfZ3JhZmljbzggPC0gbGFwcGx5KA0KICBzZXFfbGVuKG5yb3coZGFkb3NfZ3JhZmljbzgpKSwNCiAgZnVuY3Rpb24oaSkgew0KICAgIHRvdGFsIDwtIGRhZG9zX2dyYWZpY284JHZhcmlhY2FvX3RvdGFsX2luZGljZVtpXQ0KDQogICAgbGlzdCgNCiAgICAgIHggPSBpIC0gMSwNCiAgICAgIHkgPSB0b3RhbCwNCiAgICAgIGRhdGFMYWJlbHMgPSBsaXN0KA0KICAgICAgICB5ID0gaWZlbHNlKHRvdGFsID49IDAsIC0xMiwgMjApDQogICAgICApLA0KICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgc2V0b3IgPSBhcy5jaGFyYWN0ZXIoZGFkb3NfZ3JhZmljbzgkc2V0b3JbaV0pLA0KICAgICAgICBjb250cmlidWljYW9fZW1wcmVnbyA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzgkY29udHJpYnVpY2FvX2VtcHJlZ29baV0sDQogICAgICAgIGNvbnRyaWJ1aWNhb19yZW5kaW1lbnRvID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvOCRjb250cmlidWljYW9fcmVuZGltZW50b1tpXSwNCiAgICAgICAgY29udHJpYnVpY2FvX2ludGVyYWNhbyA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzgkY29udHJpYnVpY2FvX2ludGVyYWNhb1tpXSwNCiAgICAgICAgdmFyaWFjYW9fdG90YWxfaW5kaWNlID0gdG90YWwsDQogICAgICAgIGluZGljZV9lbXByZWdvXzIwMjUgPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY284JGluZGljZV9lbXByZWdvXzIwMjVbaV0sDQogICAgICAgIGluZGljZV9yZW5kaW1lbnRvXzIwMjUgPQ0KICAgICAgICAgIGRhZG9zX2dyYWZpY284JGluZGljZV9yZW5kaW1lbnRvXzIwMjVbaV0sDQogICAgICAgIGluZGljZV9jb21iaW5hZG9fMjAyNSA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzgkaW5kaWNlX2NvbWJpbmFkb18yMDI1W2ldLA0KICAgICAgICBvY3VwYWRvc18yMDI1X21pbCA9DQogICAgICAgICAgZGFkb3NfZ3JhZmljbzgkb2N1cGFkb3NfMjAyNV9taWxbaV0sDQogICAgICAgIHJlbmRpbWVudG9fcmVhbF8yMDI1ID0NCiAgICAgICAgICBkYWRvc19ncmFmaWNvOCRyZW5kaW1lbnRvX3JlYWxfMjAyNVtpXQ0KICAgICAgKQ0KICAgICkNCiAgfQ0KKQ0KDQptYXRyaXpfY29tcG9uZW50ZXNfZ3JhZmljbzggPC0gYXMubWF0cml4KA0KICBkYWRvc19ncmFmaWNvOCB8Pg0KICAgIGRwbHlyOjpzZWxlY3QoDQogICAgICBjb250cmlidWljYW9fZW1wcmVnbywNCiAgICAgIGNvbnRyaWJ1aWNhb19yZW5kaW1lbnRvLA0KICAgICAgY29udHJpYnVpY2FvX2ludGVyYWNhbw0KICAgICkNCikNCg0KcGlsaGFfcG9zaXRpdmFfZ3JhZmljbzggPC0gcm93U3VtcygNCiAgcG1heChtYXRyaXpfY29tcG9uZW50ZXNfZ3JhZmljbzgsIDApDQopDQoNCnBpbGhhX25lZ2F0aXZhX2dyYWZpY284IDwtIHJvd1N1bXMoDQogIHBtaW4obWF0cml6X2NvbXBvbmVudGVzX2dyYWZpY284LCAwKQ0KKQ0KDQptZW5vcl92YWxvcl9ncmFmaWNvOCA8LSBtaW4oDQogIDAsDQogIHBpbGhhX25lZ2F0aXZhX2dyYWZpY284LA0KICBkYWRvc19ncmFmaWNvOCR2YXJpYWNhb190b3RhbF9pbmRpY2UNCikNCg0KbWFpb3JfdmFsb3JfZ3JhZmljbzggPC0gbWF4KA0KICAwLA0KICBwaWxoYV9wb3NpdGl2YV9ncmFmaWNvOCwNCiAgZGFkb3NfZ3JhZmljbzgkdmFyaWFjYW9fdG90YWxfaW5kaWNlDQopDQoNCmFtcGxpdHVkZV9ncmFmaWNvOCA8LSBtYWlvcl92YWxvcl9ncmFmaWNvOCAtIG1lbm9yX3ZhbG9yX2dyYWZpY284DQoNCm1hcmdlbV9ncmFmaWNvOCA8LSBtYXgoDQogIGFtcGxpdHVkZV9ncmFmaWNvOCAqIDAuMTUsDQogIDMNCikNCg0KbGltaXRlX2luZmVyaW9yX2dyYWZpY284IDwtIGZsb29yKA0KICAobWVub3JfdmFsb3JfZ3JhZmljbzggLSBtYXJnZW1fZ3JhZmljbzgpIC8gNQ0KKSAqIDUNCg0KbGltaXRlX3N1cGVyaW9yX2dyYWZpY284IDwtIGNlaWxpbmcoDQogIChtYWlvcl92YWxvcl9ncmFmaWNvOCArIG1hcmdlbV9ncmFmaWNvOCkgLyA1DQopICogNQ0KDQojIDYuIENvbnN0cnXDp8OjbyBkYXMgY29sdW5hcyBlbXBpbGhhZGFzDQoNCmdyYWZpY28gPC0gaGlnaGNoYXJ0ZXI6OmhpZ2hjaGFydCgpIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jaGFydCgNCiAgICB0eXBlID0gImNvbHVtbiIsDQogICAgaGVpZ2h0ID0gNTIwLA0KICAgIGJhY2tncm91bmRDb2xvciA9ICIjRkZGRkZGIiwNCiAgICBzcGFjaW5nVG9wID0gMTAsDQogICAgc3BhY2luZ1JpZ2h0ID0gMzAsDQogICAgc3BhY2luZ0JvdHRvbSA9IDc1LA0KICAgIHNwYWNpbmdMZWZ0ID0gMjANCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3NlcmllcygNCiAgICB0eXBlID0gImNvbHVtbiIsDQogICAgbmFtZSA9ICJFbXByZWdvIiwNCiAgICBkYXRhID0gcG9udG9zX2VtcHJlZ29fZ3JhZmljbzgsDQogICAgY29sb3IgPSB1bm5hbWUoY29yZXNfaWJtYWNyb1siYXp1bF9lc2N1cm8iXSksDQogICAgYm9yZGVyV2lkdGggPSAwLA0KICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgIHpJbmRleCA9IDINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3NlcmllcygNCiAgICB0eXBlID0gImNvbHVtbiIsDQogICAgbmFtZSA9ICJSZW5kaW1lbnRvIHJlYWwiLA0KICAgIGRhdGEgPSBwb250b3NfcmVuZGltZW50b19ncmFmaWNvOCwNCiAgICBjb2xvciA9IHVubmFtZShjb3Jlc19pYm1hY3JvWyJhbWFyZWxvIl0pLA0KICAgIGJvcmRlcldpZHRoID0gMCwNCiAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICB6SW5kZXggPSAyDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgdHlwZSA9ICJjb2x1bW4iLA0KICAgIG5hbWUgPSAiSW50ZXJhw6fDo28iLA0KICAgIGRhdGEgPSBwb250b3NfaW50ZXJhY2FvX2dyYWZpY284LA0KICAgIGNvbG9yID0gdW5uYW1lKGNvcmVzX2libWFjcm9bImF6dWxfY2xhcm8iXSksDQogICAgYm9yZGVyV2lkdGggPSAwLA0KICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgIHpJbmRleCA9IDINCiAgKQ0KDQojIDcuIEluY2x1c8OjbyBkb3MgbWFyY2Fkb3JlcyBkZSB0b3RhbA0KDQpncmFmaWNvIDwtIGdyYWZpY28gfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF9zZXJpZXMoDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBuYW1lID0gIlZhcmlhw6fDo28gdG90YWwiLA0KICAgIGRhdGEgPSBwb250b3NfdG90YWxfZ3JhZmljbzgsDQogICAgY29sb3IgPSB1bm5hbWUoY29yZXNfaWJtYWNyb1siY2luemEiXSksDQogICAgbGluZVdpZHRoID0gMCwNCiAgICB6SW5kZXggPSA4LA0KICAgIG1hcmtlciA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwNCiAgICAgIHN5bWJvbCA9ICJkaWFtb25kIiwNCiAgICAgIHJhZGl1cyA9IDcsDQogICAgICBmaWxsQ29sb3IgPSB1bm5hbWUoY29yZXNfaWJtYWNyb1siY2luemEiXSksDQogICAgICBsaW5lQ29sb3IgPSAiI0ZGRkZGRiIsDQogICAgICBsaW5lV2lkdGggPSAxLjUsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBob3ZlciA9IGxpc3QoDQogICAgICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICAgICAgcmFkaXVzID0gOQ0KICAgICAgICApDQogICAgICApDQogICAgKSwNCiAgICBkYXRhTGFiZWxzID0gbGlzdCgNCiAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgY3JvcCA9IEZBTFNFLA0KICAgICAgb3ZlcmZsb3cgPSAiYWxsb3ciLA0KICAgICAgYWxsb3dPdmVybGFwID0gRkFMU0UsDQogICAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICJmdW5jdGlvbiAoKSB7DQogICAgICAgICAgY29uc3QgdmFsb3IgPSB0aGlzLnk7DQogICAgICAgICAgY29uc3Qgc2luYWwgPSB2YWxvciA+IDAgPyAnKycgOiB2YWxvciA8IDAgPyAn4oiSJyA6ICcnOw0KDQogICAgICAgICAgcmV0dXJuIHNpbmFsICsNCiAgICAgICAgICAgIEhpZ2hjaGFydHMubnVtYmVyRm9ybWF0KA0KICAgICAgICAgICAgICBNYXRoLmFicyh2YWxvciksDQogICAgICAgICAgICAgIDIsDQogICAgICAgICAgICAgICcsJywNCiAgICAgICAgICAgICAgJy4nDQogICAgICAgICAgICApICsNCiAgICAgICAgICAgICcgcG9udG9zJzsNCiAgICAgICAgfSINCiAgICAgICksDQogICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgIGNvbG9yID0gIiM0QjU1NjMiLA0KICAgICAgICBmb250U2l6ZSA9ICIxMHB4IiwNCiAgICAgICAgZm9udFdlaWdodCA9ICJub3JtYWwiLA0KICAgICAgICB0ZXh0T3V0bGluZSA9ICJub25lIg0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIDguIEZvcm1hdGHDp8Ojbw0KDQpncmFmaWNvIDwtIGdyYWZpY28gfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2FkZF90aGVtZSgNCiAgICB0ZW1hX2libWFjcm8NCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfdGl0bGUoDQogICAgdGV4dCA9ICJDb21wb25lbnRlcyBkYSB2YXJpYcOnw6NvIGNvbmp1bnRhIGRlIGVtcHJlZ28gZSByZW5kaW1lbnRvIg0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19zdWJ0aXRsZSgNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkRlY29tcG9zacOnw6NvIGRvIGluZGljYWRvciBjb21iaW5hZG8gZW50cmUgZW1wcmVnbywgcmVuZGltZW50byByZWFsICIsDQogICAgICAiZSBpbnRlcmHDp8OjbyDigJQgcG9udG9zIGRlIMOtbmRpY2UsIEJyYXNpbCwgMjAxMuKAkzIwMjUiDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY194QXhpcygNCiAgICBjYXRlZ29yaWVzID0gYygNCiAgICAgICJBZ3JvcGVjdcOhcmlhIiwNCiAgICAgICJJbmTDunN0cmlhIGdlcmFsIg0KICAgICksDQogICAgdGl0bGUgPSBsaXN0KA0KICAgICAgdGV4dCA9ICJTZXRvciINCiAgICApLA0KICAgIHJldmVyc2VkID0gRkFMU0UsDQogICAgbGFiZWxzID0gbGlzdCgNCiAgICAgIHJvdGF0aW9uID0gMA0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfeUF4aXMoDQogICAgdGl0bGUgPSBsaXN0KA0KICAgICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICAgIkNvbnRyaWJ1acOnw6NvIHBhcmEgYSB2YXJpYcOnw6NvIGFjdW11bGFkYSAiLA0KICAgICAgICAiKHBvbnRvcyBkZSDDrW5kaWNlKSINCiAgICAgICkNCiAgICApLA0KICAgIG1pbiA9IGxpbWl0ZV9pbmZlcmlvcl9ncmFmaWNvOCwNCiAgICBtYXggPSBsaW1pdGVfc3VwZXJpb3JfZ3JhZmljbzgsDQogICAgc3RhcnRPblRpY2sgPSBGQUxTRSwNCiAgICBlbmRPblRpY2sgPSBGQUxTRSwNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHRoaXMudmFsdWUsDQogICAgICAgICAgICAyLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKSArICcgcG9udG9zJzsNCiAgICAgICAgfSINCiAgICAgICkNCiAgICApLA0KICAgIHBsb3RMaW5lcyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB2YWx1ZSA9IDAsDQogICAgICAgIGNvbG9yID0gdW5uYW1lKGNvcmVzX2libWFjcm9bImNpbnphIl0pLA0KICAgICAgICBkYXNoU3R5bGUgPSAiU29saWQiLA0KICAgICAgICB3aWR0aCA9IDEuMiwNCiAgICAgICAgekluZGV4ID0gNSwNCiAgICAgICAgbGFiZWwgPSBsaXN0KA0KICAgICAgICAgIHRleHQgPSAiU2VtIHZhcmlhw6fDo28gZW0gcmVsYcOnw6NvIGEgMjAxMiIsDQogICAgICAgICAgYWxpZ24gPSAibGVmdCIsDQogICAgICAgICAgeCA9IDgsDQogICAgICAgICAgeSA9IC03LA0KICAgICAgICAgIHN0eWxlID0gbGlzdCgNCiAgICAgICAgICAgIGNvbG9yID0gdW5uYW1lKGNvcmVzX2libWFjcm9bImNpbnphIl0pLA0KICAgICAgICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICAgICAgICApDQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Bsb3RPcHRpb25zKA0KICAgIGNvbHVtbiA9IGxpc3QoDQogICAgICBzdGFja2luZyA9ICJub3JtYWwiLA0KICAgICAgYm9yZGVyV2lkdGggPSAwLA0KICAgICAgcG9pbnRXaWR0aCA9IDc4LA0KICAgICAgcG9pbnRQYWRkaW5nID0gMC4wOCwNCiAgICAgIGdyb3VwUGFkZGluZyA9IDAuMjUsDQogICAgICBzaGFkb3cgPSBGQUxTRSwNCiAgICAgIGRhdGFMYWJlbHMgPSBsaXN0KA0KICAgICAgICBlbmFibGVkID0gRkFMU0UNCiAgICAgICkNCiAgICApLA0KICAgIHNjYXR0ZXIgPSBsaXN0KA0KICAgICAgbGluZVdpZHRoID0gMCwNCiAgICAgIHNoYWRvdyA9IEZBTFNFDQogICAgKSwNCiAgICBzZXJpZXMgPSBsaXN0KA0KICAgICAgYW5pbWF0aW9uID0gVFJVRSwNCiAgICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgICAgc3RhdGVzID0gbGlzdCgNCiAgICAgICAgaW5hY3RpdmUgPSBsaXN0KA0KICAgICAgICAgIG9wYWNpdHkgPSAwLjM1DQogICAgICAgICkNCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gVFJVRSwNCiAgICB1c2VIVE1MID0gVFJVRSwNCiAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICBjb25zdCBkID0gdGhpcy5wb2ludHNbMF0ucG9pbnQuY3VzdG9tOw0KDQogICAgICAgIGNvbnN0IG5mID0gZnVuY3Rpb24odmFsb3IpIHsNCiAgICAgICAgICByZXR1cm4gSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQoDQogICAgICAgICAgICB2YWxvciwNCiAgICAgICAgICAgIDIsDQogICAgICAgICAgICAnLCcsDQogICAgICAgICAgICAnLicNCiAgICAgICAgICApOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHBvbnRvcyA9IGZ1bmN0aW9uKHZhbG9yKSB7DQogICAgICAgICAgY29uc3Qgc2luYWwgPQ0KICAgICAgICAgICAgdmFsb3IgPiAwID8gJysnIDoNCiAgICAgICAgICAgIHZhbG9yIDwgMCA/ICfiiJInIDogJyc7DQoNCiAgICAgICAgICByZXR1cm4gc2luYWwgKw0KICAgICAgICAgICAgbmYoTWF0aC5hYnModmFsb3IpKSArDQogICAgICAgICAgICAnIHBvbnRvcyBkZSDDrW5kaWNlJzsNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gKA0KICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWluLXdpZHRoOjM2MHB4O3BhZGRpbmc6NHB4IDJweDtcIj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6MTNweDtmb250LXdlaWdodDpib2xkOycgKw0KICAgICAgICAgICAgICAnbWFyZ2luLWJvdHRvbTo0cHg7Y29sb3I6IzExMTgyNztcIj4nICsNCiAgICAgICAgICAgICAgZC5zZXRvciArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjExcHg7Y29sb3I6IzZCNzI4MDsnICsNCiAgICAgICAgICAgICAgJ21hcmdpbi1ib3R0b206MTBweDtcIj4nICsNCiAgICAgICAgICAgICAgJ011ZGFuw6dhIGFjdW11bGFkYSBlbnRyZSAyMDEyIGUgMjAyNScgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206M3B4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJjb2xvcjojMDIwMjNDO1wiPuKXjzwvc3Bhbj4gJyArDQogICAgICAgICAgICAgICdDb250cmlidWnDp8OjbyBkbyBlbXByZWdvOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBwb250b3MoZC5jb250cmlidWljYW9fZW1wcmVnbykgKw0KICAgICAgICAgICAgICAnPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206M3B4O1wiPicgKw0KICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9XCJjb2xvcjojRkVCNzEyO1wiPuKXjzwvc3Bhbj4gJyArDQogICAgICAgICAgICAgICdDb250cmlidWnDp8OjbyBkbyByZW5kaW1lbnRvIHJlYWw6IDxiPicgKw0KICAgICAgICAgICAgICAgIHBvbnRvcyhkLmNvbnRyaWJ1aWNhb19yZW5kaW1lbnRvKSArDQogICAgICAgICAgICAgICc8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCI+JyArDQogICAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cImNvbG9yOiM0NkIxRTE7XCI+4pePPC9zcGFuPiAnICsNCiAgICAgICAgICAgICAgJ0NvbnRyaWJ1acOnw6NvIGRhIGludGVyYcOnw6NvOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBwb250b3MoZC5jb250cmlidWljYW9faW50ZXJhY2FvKSArDQogICAgICAgICAgICAgICc8L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiYm9yZGVyLXRvcDoxcHggc29saWQgI0U1RTdFQjsnICsNCiAgICAgICAgICAgICAgJ3BhZGRpbmctdG9wOjdweDttYXJnaW4tYm90dG9tOjlweDtcIj4nICsNCiAgICAgICAgICAgICAgJ1Zhcmlhw6fDo28gdG90YWwgZG8gaW5kaWNhZG9yOiA8Yj4nICsNCiAgICAgICAgICAgICAgICBwb250b3MoZC52YXJpYWNhb190b3RhbF9pbmRpY2UpICsNCiAgICAgICAgICAgICAgJzwvYj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjNweDtcIj4nICsNCiAgICAgICAgICAgICAgJ8ONbmRpY2UgZGUgZW1wcmVnbyBlbSAyMDI1OiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLmluZGljZV9lbXByZWdvXzIwMjUpICsNCiAgICAgICAgICAgICAgJzwvYj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjNweDtcIj4nICsNCiAgICAgICAgICAgICAgJ8ONbmRpY2UgZGUgcmVuZGltZW50byBlbSAyMDI1OiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLmluZGljZV9yZW5kaW1lbnRvXzIwMjUpICsNCiAgICAgICAgICAgICAgJzwvYj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIj4nICsNCiAgICAgICAgICAgICAgJ0luZGljYWRvciBjb21iaW5hZG8gZW0gMjAyNTogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5pbmRpY2VfY29tYmluYWRvXzIwMjUpICsNCiAgICAgICAgICAgICAgJzwvYj4gPHNwYW4gc3R5bGU9XCJjb2xvcjojNkI3MjgwO1wiPijDrW5kaWNlKTwvc3Bhbj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsNCg0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJib3JkZXItdG9wOjFweCBzb2xpZCAjRTVFN0VCOycgKw0KICAgICAgICAgICAgICAncGFkZGluZy10b3A6N3B4O1wiPicgKw0KICAgICAgICAgICAgICAnUGVzc29hcyBvY3VwYWRhcyBlbSAyMDI1OiA8Yj4nICsNCiAgICAgICAgICAgICAgICBuZihkLm9jdXBhZG9zXzIwMjVfbWlsKSArDQogICAgICAgICAgICAgICAgJyBtaWwgcGVzc29hczwvYj48YnI+JyArDQogICAgICAgICAgICAgICdSZW5kaW1lbnRvIG3DqWRpbyByZWFsIGVtIDIwMjU6IDxiPlIkICcgKw0KICAgICAgICAgICAgICAgIG5mKGQucmVuZGltZW50b19yZWFsXzIwMjUpICsNCiAgICAgICAgICAgICAgICAnIHBvciBtw6pzPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgJzwvZGl2PicNCiAgICAgICAgKTsNCiAgICAgIH0iDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19sZWdlbmQoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiLA0KICAgIGFsaWduID0gImNlbnRlciIsDQogICAgdmVydGljYWxBbGlnbiA9ICJ0b3AiLA0KICAgIGZsb2F0aW5nID0gRkFMU0UsDQogICAgc3ltYm9sV2lkdGggPSAxNiwNCiAgICBpdGVtRGlzdGFuY2UgPSAyMA0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jYXB0aW9uKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiTm90YTogYSB2YXJpYcOnw6NvIGRvIGluZGljYWRvciBjb21iaW5hZG8gZm9pIGRlY29tcG9zdGEgIiwNCiAgICAgICJhbGdlYnJpY2FtZW50ZSBlbSBlbXByZWdvLCByZW5kaW1lbnRvIHJlYWwgZSBpbnRlcmHDp8Ojby4gQSBzb21hIGRvcyAiLA0KICAgICAgInRyw6pzIGNvbXBvbmVudGVzIGNvcnJlc3BvbmRlIMOgIGRpZmVyZW7Dp2EgZW50cmUgbyBpbmRpY2Fkb3IgZGUgMjAyNSAiLA0KICAgICAgImUgYSBiYXNlIDEwMCBkZSAyMDEyLiBPIGluZGljYWRvciDDqSBzaW50w6l0aWNvIGUgbsOjbyBjb3JyZXNwb25kZSDDoCAiLA0KICAgICAgIm1hc3NhIG9maWNpYWwgZGUgcmVuZGltZW50byBkbyB0cmFiYWxoby4iDQogICAgKSwNCiAgICBhbGlnbiA9ICJsZWZ0IiwNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjb2xvciA9ICIjNkI3MjgwIiwNCiAgICAgIGZvbnRTaXplID0gIjEwcHgiDQogICAgKQ0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19leHBvcnRpbmcoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgZmlsZW5hbWUgPSAiZGVjb21wb3NpY2FvLWVtcHJlZ28tcmVuZGltZW50by0yMDEyLTIwMjUiDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2NyZWRpdHMoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICJGb250ZTogSUJHRS9QTkFEIENvbnTDrW51YSDigJMgU0lEUkEgNDM2MiBlIDU0NDIuICIsDQogICAgICAiRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICAgICksDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzZCNzI4MCIsDQogICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICkNCiAgKQ0KDQojIDkuIEV4aWJpw6fDo28NCg0KZ3JhZmljbw0KDQpgYGANCg0KTmEgQWdyb3BlY3XDoXJpYSwgYSBjb250cmlidWnDp8OjbyBkbyBlbXByZWdvIGZvaSBuZWdhdGl2YSBlbSAyMiwyNiBwb250b3MsIGVucXVhbnRvIG8gcmVuZGltZW50byBhY3Jlc2NlbnRvdSAzMywyNCBwb250b3MuIEEgaW50ZXJhw6fDo28gcmV0aXJvdSBvdXRyb3MgNyw0MCBwb250b3MgcG9ycXVlIGVtcHJlZ28gZSByZW5kYSBzZSBtb3ZlcmFtIGVtIGRpcmXDp8O1ZXMgb3Bvc3RhcywgZGVpeGFuZG8gdW1hIHZhcmlhw6fDo28gdG90YWwgcG9zaXRpdmEgZGUgYXBlbmFzIDMsNTggcG9udG9zLiBPIHJlc3VsdGFkbyBtb3N0cmEgcXVlIG8gYXZhbsOnbyBkbyByZW5kaW1lbnRvIGNvbXBlbnNvdSB1bWEgcGVyZGEgb2N1cGFjaW9uYWwgcHJvZnVuZGEsIG1hcyBuw6NvIHByb2R1eml1IHVtYSBleHBhbnPDo28gY29uanVudGEgZm9ydGUuDQoNCk5hIEluZMO6c3RyaWEgZ2VyYWwsIG8gZW1wcmVnbyBjb250cmlidWl1IGNvbSAyLDY4IHBvbnRvcyBlIG8gcmVuZGltZW50byBjb20gOSwzMywgZW5xdWFudG8gYSBpbnRlcmHDp8OjbyBhY3Jlc2NlbnRvdSAwLDI1LiBPIGluZGljYWRvciBjb21iaW5hZG8gdGVybWlub3UgMTIsMjYgcG9udG9zIGFjaW1hIGRlIDIwMTIuIERpZmVyZW50ZW1lbnRlIGRhIEFncm9wZWN1w6FyaWEsIG9zIGRvaXMgY29tcG9uZW50ZXMgY2FtaW5oYXJhbSBuYSBtZXNtYSBkaXJlw6fDo28sIGVtYm9yYSBvIHJlbmRpbWVudG8gdGVuaGEgcmVzcG9uZGlkbyBwZWxhIG1haW9yIHBhcmNlbGEgZG8gZ2FuaG8uDQoNCiMjIDIuOSBDb21wb3Npw6fDo28gZG8gcmVuZGltZW50byBkb21pY2lsaWFyDQoNCk9zIGVmZWl0b3MgZG8gbWVyY2FkbyBkZSB0cmFiYWxobyBjaGVnYW0gw6BzIGZhbcOtbGlhcywgbWFzIG8gcmVuZGltZW50byBkb21pY2lsaWFyIG7Do28gZGVwZW5kZSBhcGVuYXMgZGUgc2Fsw6FyaW9zIGUgb3V0cmFzIHJlY2VpdGFzIGRvIHRyYWJhbGhvLiBBcG9zZW50YWRvcmlhcywgcGVuc8O1ZXMsIGFsdWd1w6lpcywgcHJvZ3JhbWFzIHNvY2lhaXMgZSBkZW1haXMgcmVuZGltZW50b3MgdGFtYsOpbSBwYXJ0aWNpcGFtIGRvIG9yw6dhbWVudG8gZG9zIGRvbWljw61saW9zLCBwb2RlbmRvIGFtb3J0ZWNlciBvdSBhbXBsaWFyIG11ZGFuw6dhcyBvY29ycmlkYXMgbm8gZW1wcmVnby4NCg0KQSBwYXJ0aWNpcGHDp8OjbyBkZSBjYWRhIGZvbnRlIGZvaSByZXByZXNlbnRhZGEgcG9yOg0KDQokJA0KcF97ayx0fSA9DQpcZnJhY3tSX3trLHR9fQ0Ke1JfdH0NClx0aW1lcyAxMDANCiQkDQoNCmVtIHF1ZSAkUl97ayx0fSQgY29ycmVzcG9uZGUgYW8gcmVuZGltZW50byBwcm92ZW5pZW50ZSBkYSBmb250ZSAkayQsIGUgJFJfdCQgcmVwcmVzZW50YSBvIHJlbmRpbWVudG8gZG9taWNpbGlhciB0b3RhbC4gQSBtdWRhbsOnYSBlbnRyZSAyMDEyIGUgMjAyNSBmb2kgY2FsY3VsYWRhIGVtIHBvbnRvcyBwZXJjZW50dWFpczoNCg0KJCQNClxEZWx0YSBwX2sgPQ0KcF97aywyMDI1fQ0KLQ0KcF97aywyMDEyfQ0KJCQNCg0KQ29tbyBzZSB0cmF0YSBkZSB1bWEgY29tcG9zacOnw6NvLCBvIGF1bWVudG8gZGEgcGFydGljaXBhw6fDo28gZGUgdW1hIGZvbnRlIG7Do28gc2lnbmlmaWNhIG5lY2Vzc2FyaWFtZW50ZSBxdWUgc2V1IHZhbG9yIG1vbmV0w6FyaW8gdGVuaGEgY3Jlc2NpZG8uIEEgcGFyY2VsYSB0YW1iw6ltIHBvZGUgc3ViaXIgcXVhbmRvIG91dHJhcyBmb250ZXMgZGltaW51ZW0uDQoNCg0KKipHcsOhZmljbyAyLjkg4oCUIERlIG9uZGUgdmVtIGEgcmVuZGEgZG9taWNpbGlhciBicmFzaWxlaXJhKioNCg0KYGBge3IgcDItY29tcG9zaWNhby1yZW5kYSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyAxLiBJbXBvcnRhw6fDo28gZGEgcGxhbmlsaGEgU0lEUkEgNzQyOQ0KDQpkYWRvc19icnV0b3NfZ3JhZmljbzkgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKA0KICAiQ29tcG9zaWNhby5yZW5kYS5zaWRyYS54bHN4IiwNCiAgc2hlZXQgPSAiVGFiZWxhIiwNCiAgY29sX25hbWVzID0gRkFMU0UNCikNCg0Kc3RvcGlmbm90KA0KICAiQSBwbGFuaWxoYSBuw6NvIHBvc3N1aSBhcyBzZWlzIGxpbmhhcyBuZWNlc3PDoXJpYXMgcGFyYSBhIGV4dHJhw6fDo28uIiA9DQogICAgbnJvdyhkYWRvc19icnV0b3NfZ3JhZmljbzkpID49IDYsDQogICJBIHBsYW5pbGhhIG7Do28gcG9zc3VpIHRvZGFzIGFzIGNvbHVuYXMgZXNwZXJhZGFzLiIgPQ0KICAgIG5jb2woZGFkb3NfYnJ1dG9zX2dyYWZpY285KSA+PSAxMTMNCikNCg0KIyAyLiBFeHRyYcOnw6NvIGRvcyBhbm9zLCBmb250ZXMgZSB2YWxvcmVzDQoNCmFub3NfZXh0cmFpZG9zX2dyYWZpY285IDwtIHVubGlzdCgNCiAgZGFkb3NfYnJ1dG9zX2dyYWZpY285WzQsIC0xXSwNCiAgdXNlLm5hbWVzID0gRkFMU0UNCikNCg0KZm9udGVzX2V4dHJhaWRhc19ncmFmaWNvOSA8LSB1bmxpc3QoDQogIGRhZG9zX2JydXRvc19ncmFmaWNvOVs1LCAtMV0sDQogIHVzZS5uYW1lcyA9IEZBTFNFDQopDQoNCnZhbG9yZXNfZXh0cmFpZG9zX2dyYWZpY285IDwtIHVubGlzdCgNCiAgZGFkb3NfYnJ1dG9zX2dyYWZpY285WzYsIC0xXSwNCiAgdXNlLm5hbWVzID0gRkFMU0UNCikNCg0KZGFkb3NfYXV4aWxpYXJlc19ncmFmaWNvOSA8LSB0aWJibGU6OnRpYmJsZSgNCiAgYW5vID0gc3VwcHJlc3NXYXJuaW5ncygNCiAgICBhcy5pbnRlZ2VyKA0KICAgICAgYXMuY2hhcmFjdGVyKGFub3NfZXh0cmFpZG9zX2dyYWZpY285KQ0KICAgICkNCiAgKSwNCiAgZm9udGVfY29tcGxldGEgPSBhcy5jaGFyYWN0ZXIoDQogICAgZm9udGVzX2V4dHJhaWRhc19ncmFmaWNvOQ0KICApLA0KICBwYXJ0aWNpcGFjYW9fcGN0ID0gc3VwcHJlc3NXYXJuaW5ncygNCiAgICBhcy5udW1lcmljKA0KICAgICAgYXMuY2hhcmFjdGVyKHZhbG9yZXNfZXh0cmFpZG9zX2dyYWZpY285KQ0KICAgICkNCiAgKQ0KKSB8Pg0KICB0aWR5cjo6ZmlsbCgNCiAgICBhbm8sDQogICAgLmRpcmVjdGlvbiA9ICJkb3duIg0KICApIHw+DQogIGRwbHlyOjpmaWx0ZXIoDQogICAgIWlzLm5hKGFubyksDQogICAgIWlzLm5hKGZvbnRlX2NvbXBsZXRhKSwNCiAgICBmb250ZV9jb21wbGV0YSAhPSAiIg0KICApDQoNCiMgMy4gU2VsZcOnw6NvIGRlIDIwMTIgZSAyMDI1DQoNCmZvbnRlc191dGlsaXphZGFzX2dyYWZpY285IDwtIGMoDQogICJIYWJpdHVhbG1lbnRlIHJlY2ViaWRvIGVtIHRvZG9zIG9zIHRyYWJhbGhvcyIsDQogICJBcG9zZW50YWRvcmlhIGUgcGVuc8OjbyIsDQogICJBbHVndWVsIGUgYXJyZW5kYW1lbnRvIiwNCiAgIlBlbnPDo28gYWxpbWVudMOtY2lhLCBkb2HDp8OjbyBlIG1lc2FkYSBkZSBuw6NvIG1vcmFkb3IiLA0KICAiUHJvZ3JhbWFzIHNvY2lhaXMgZG8gZ292ZXJubyIsDQogICJPdXRyb3MgcmVuZGltZW50b3MiDQopDQoNCmRhZG9zX3NlbGVjaW9uYWRvc19ncmFmaWNvOSA8LSBkYWRvc19hdXhpbGlhcmVzX2dyYWZpY285IHw+DQogIGRwbHlyOjpmaWx0ZXIoDQogICAgYW5vICVpbiUgYygyMDEyTCwgMjAyNUwpLA0KICAgIGZvbnRlX2NvbXBsZXRhICVpbiUgZm9udGVzX3V0aWxpemFkYXNfZ3JhZmljbzkNCiAgKQ0KDQojIDQuIEV4Y2x1c8OjbyBkYXMgY2F0ZWdvcmlhcyBhZ3JlZ2FkYXMgZSBwYWRyb25pemHDp8OjbyBkb3Mgbm9tZXMNCg0KZGFkb3Nfc2VsZWNpb25hZG9zX2dyYWZpY285IDwtIGRhZG9zX3NlbGVjaW9uYWRvc19ncmFmaWNvOSB8Pg0KICBkcGx5cjo6bXV0YXRlKA0KICAgIGZvbnRlID0gZHBseXI6OnJlY29kZSgNCiAgICAgIGZvbnRlX2NvbXBsZXRhLA0KICAgICAgIkhhYml0dWFsbWVudGUgcmVjZWJpZG8gZW0gdG9kb3Mgb3MgdHJhYmFsaG9zIiA9DQogICAgICAgICJUcmFiYWxobyIsDQogICAgICAiQXBvc2VudGFkb3JpYSBlIHBlbnPDo28iID0NCiAgICAgICAgIkFwb3NlbnRhZG9yaWFzIGUgcGVuc8O1ZXMiLA0KICAgICAgIkFsdWd1ZWwgZSBhcnJlbmRhbWVudG8iID0NCiAgICAgICAgIkFsdWd1w6lpcyIsDQogICAgICAiUGVuc8OjbyBhbGltZW50w61jaWEsIGRvYcOnw6NvIGUgbWVzYWRhIGRlIG7Do28gbW9yYWRvciIgPQ0KICAgICAgICAiUGVuc8O1ZXMsIGRvYcOnw7VlcyBlIG1lc2FkYXMiLA0KICAgICAgIlByb2dyYW1hcyBzb2NpYWlzIGRvIGdvdmVybm8iID0NCiAgICAgICAgIlByb2dyYW1hcyBzb2NpYWlzIiwNCiAgICAgICJPdXRyb3MgcmVuZGltZW50b3MiID0NCiAgICAgICAgIk91dHJvcyByZW5kaW1lbnRvcyINCiAgICApLA0KICAgIG9yZGVtX2ZvbnRlID0gZHBseXI6OmNhc2Vfd2hlbigNCiAgICAgIGZvbnRlID09ICJUcmFiYWxobyIgfiAxTCwNCiAgICAgIGZvbnRlID09ICJBcG9zZW50YWRvcmlhcyBlIHBlbnPDtWVzIiB+IDJMLA0KICAgICAgZm9udGUgPT0gIkFsdWd1w6lpcyIgfiAzTCwNCiAgICAgIGZvbnRlID09ICJQZW5zw7VlcywgZG9hw6fDtWVzIGUgbWVzYWRhcyIgfiA0TCwNCiAgICAgIGZvbnRlID09ICJQcm9ncmFtYXMgc29jaWFpcyIgfiA1TCwNCiAgICAgIGZvbnRlID09ICJPdXRyb3MgcmVuZGltZW50b3MiIH4gNkwNCiAgICApDQogICkNCg0KIyA1LiBDw6FsY3VsbyBkYXMgdmFyaWHDp8O1ZXMgZW0gcG9udG9zIHBlcmNlbnR1YWlzDQoNCmNvbXBhcmFjYW9fZm9udGVzX2dyYWZpY285IDwtIGRhZG9zX3NlbGVjaW9uYWRvc19ncmFmaWNvOSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIGZvbnRlLA0KICAgIGZvbnRlX2NvbXBsZXRhLA0KICAgIG9yZGVtX2ZvbnRlLA0KICAgIGFubywNCiAgICBwYXJ0aWNpcGFjYW9fcGN0DQogICkgfD4NCiAgdGlkeXI6OnBpdm90X3dpZGVyKA0KICAgIG5hbWVzX2Zyb20gPSBhbm8sDQogICAgdmFsdWVzX2Zyb20gPSBwYXJ0aWNpcGFjYW9fcGN0LA0KICAgIG5hbWVzX3ByZWZpeCA9ICJwYXJ0aWNpcGFjYW9fIg0KICApIHw+DQogIGRwbHlyOjptdXRhdGUoDQogICAgdmFyaWFjYW9fcHAgPQ0KICAgICAgcGFydGljaXBhY2FvXzIwMjUgLQ0KICAgICAgcGFydGljaXBhY2FvXzIwMTINCiAgKQ0KDQojIDYuIE9yZ2FuaXphw6fDo28gZG8gb2JqZXRvIGRhZG9zX2dyYWZpY285DQoNCmNvcmVzX25lY2Vzc2FyaWFzX2dyYWZpY285IDwtIGMoDQogICJhbWFyZWxvIiwNCiAgImF6dWxfZXNjdXJvIiwNCiAgImF6dWxfbWVkaW8iLA0KICAiYW1hcmVsb19jbGFybyIsDQogICJhenVsX2NsYXJvIiwNCiAgImNpbnphIiwNCiAgInByZXRvIg0KKQ0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBjb3Jlc19pYm1hY3JvIG7Do28gcG9zc3VpIHRvZGFzIGFzIGNvcmVzIG5lY2Vzc8Ohcmlhcy4iID0NCiAgICBhbGwoDQogICAgICBjb3Jlc19uZWNlc3Nhcmlhc19ncmFmaWNvOSAlaW4lDQogICAgICAgIG5hbWVzKGNvcmVzX2libWFjcm8pDQogICAgKQ0KKQ0KDQpkYWRvc19ncmFmaWNvOSA8LSBkYWRvc19zZWxlY2lvbmFkb3NfZ3JhZmljbzkgfD4NCiAgZHBseXI6OmxlZnRfam9pbigNCiAgICBjb21wYXJhY2FvX2ZvbnRlc19ncmFmaWNvOSB8Pg0KICAgICAgZHBseXI6OnNlbGVjdCgNCiAgICAgICAgZm9udGUsDQogICAgICAgIHBhcnRpY2lwYWNhb18yMDEyLA0KICAgICAgICBwYXJ0aWNpcGFjYW9fMjAyNSwNCiAgICAgICAgdmFyaWFjYW9fcHANCiAgICAgICksDQogICAgYnkgPSAiZm9udGUiDQogICkgfD4NCiAgZHBseXI6Om11dGF0ZSgNCiAgICBjb3JfZm9udGUgPSBkcGx5cjo6Y2FzZV93aGVuKA0KICAgICAgZm9udGUgPT0gIlRyYWJhbGhvIiB+DQogICAgICAgIHVubmFtZShjb3Jlc19pYm1hY3JvWyJhenVsX2VzY3VybyJdKSwNCiAgICAgIGZvbnRlID09ICJBcG9zZW50YWRvcmlhcyBlIHBlbnPDtWVzIiB+DQogICAgICAgIHVubmFtZShjb3Jlc19pYm1hY3JvWyJhbWFyZWxvIl0pLA0KICAgICAgZm9udGUgPT0gIkFsdWd1w6lpcyIgfg0KICAgICAgICB1bm5hbWUoY29yZXNfaWJtYWNyb1siYXp1bF9jbGFybyJdKSwNCiAgICAgIGZvbnRlID09ICJQZW5zw7VlcywgZG9hw6fDtWVzIGUgbWVzYWRhcyIgfg0KICAgICAgICB1bm5hbWUoY29yZXNfaWJtYWNyb1siYXp1bF9tZWRpbyJdKSwNCiAgICAgIGZvbnRlID09ICJQcm9ncmFtYXMgc29jaWFpcyIgfg0KICAgICAgICB1bm5hbWUoY29yZXNfaWJtYWNyb1siYW1hcmVsb19jbGFybyJdKSwNCiAgICAgIGZvbnRlID09ICJPdXRyb3MgcmVuZGltZW50b3MiIH4NCiAgICAgICAgdW5uYW1lKGNvcmVzX2libWFjcm9bImNpbnphIl0pDQogICAgKQ0KICApIHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgYW5vLA0KICAgIGZvbnRlLA0KICAgIGZvbnRlX2NvbXBsZXRhLA0KICAgIHBhcnRpY2lwYWNhb19wY3QsDQogICAgcGFydGljaXBhY2FvXzIwMTIsDQogICAgcGFydGljaXBhY2FvXzIwMjUsDQogICAgdmFyaWFjYW9fcHAsDQogICAgY29yX2ZvbnRlLA0KICAgIG9yZGVtX2ZvbnRlDQogICkgfD4NCiAgZHBseXI6OmFycmFuZ2UoDQogICAgYW5vLA0KICAgIG9yZGVtX2ZvbnRlDQogICkNCg0KIyA3LiBWYWxpZGHDp8OjbyBkZSBkYWRvc19ncmFmaWNvOQ0KDQpzb21hc19hbnVhaXNfZ3JhZmljbzkgPC0gZGFkb3NfZ3JhZmljbzkgfD4NCiAgZHBseXI6Omdyb3VwX2J5KGFubykgfD4NCiAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICBzb21hX3BhcnRpY2lwYWNvZXMgPQ0KICAgICAgc3VtKHBhcnRpY2lwYWNhb19wY3QpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQp2YWxvcmVzX2VzcGVyYWRvc19ncmFmaWNvOSA8LSB0aWJibGU6OnRyaWJibGUoDQogIH5hbm8sIH5mb250ZSwgfnZhbG9yX2VzcGVyYWRvLA0KICAyMDEyTCwgIlRyYWJhbGhvIiwgNzUuNywNCiAgMjAxMkwsICJBcG9zZW50YWRvcmlhcyBlIHBlbnPDtWVzIiwgMTYuNSwNCiAgMjAxMkwsICJBbHVndcOpaXMiLCAyLjMsDQogIDIwMTJMLCAiUGVuc8O1ZXMsIGRvYcOnw7VlcyBlIG1lc2FkYXMiLCAxLjIsDQogIDIwMTJMLCAiUHJvZ3JhbWFzIHNvY2lhaXMiLCAxLjUsDQogIDIwMTJMLCAiT3V0cm9zIHJlbmRpbWVudG9zIiwgMi44LA0KICAyMDI1TCwgIlRyYWJhbGhvIiwgNzUuMSwNCiAgMjAyNUwsICJBcG9zZW50YWRvcmlhcyBlIHBlbnPDtWVzIiwgMTYuNCwNCiAgMjAyNUwsICJBbHVndcOpaXMiLCAyLjEsDQogIDIwMjVMLCAiUGVuc8O1ZXMsIGRvYcOnw7VlcyBlIG1lc2FkYXMiLCAwLjksDQogIDIwMjVMLCAiUHJvZ3JhbWFzIHNvY2lhaXMiLCAzLjUsDQogIDIwMjVMLCAiT3V0cm9zIHJlbmRpbWVudG9zIiwgMi4wDQopDQoNCnZhbGlkYWNhb192YWxvcmVzX2dyYWZpY285IDwtIGRhZG9zX2dyYWZpY285IHw+DQogIGRwbHlyOjpzZWxlY3QoDQogICAgYW5vLA0KICAgIGZvbnRlLA0KICAgIHBhcnRpY2lwYWNhb19wY3QNCiAgKSB8Pg0KICBkcGx5cjo6bGVmdF9qb2luKA0KICAgIHZhbG9yZXNfZXNwZXJhZG9zX2dyYWZpY285LA0KICAgIGJ5ID0gYygiYW5vIiwgImZvbnRlIikNCiAgKQ0KDQp2YWxvcmVzX251bWVyaWNvc19ncmFmaWNvOSA8LSBkYWRvc19ncmFmaWNvOSB8Pg0KICBkcGx5cjo6c2VsZWN0KA0KICAgIHdoZXJlKGlzLm51bWVyaWMpDQogICkgfD4NCiAgdW5saXN0KHVzZS5uYW1lcyA9IEZBTFNFKQ0KDQpzdG9waWZub3QoDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvOSBuw6NvIHBvc3N1aSBleGF0YW1lbnRlIDEyIG9ic2VydmHDp8O1ZXMuIiA9DQogICAgbnJvdyhkYWRvc19ncmFmaWNvOSkgPT0gMTIsDQogICJPIG9iamV0byBkYWRvc19ncmFmaWNvOSBuw6NvIGNvbnTDqW0gZXhhdGFtZW50ZSBhcyB2YXJpw6F2ZWlzIHNvbGljaXRhZGFzLiIgPQ0KICAgIGFsbCgNCiAgICAgIG5hbWVzKGRhZG9zX2dyYWZpY285KSA9PQ0KICAgICAgICBjKA0KICAgICAgICAgICJhbm8iLA0KICAgICAgICAgICJmb250ZSIsDQogICAgICAgICAgImZvbnRlX2NvbXBsZXRhIiwNCiAgICAgICAgICAicGFydGljaXBhY2FvX3BjdCIsDQogICAgICAgICAgInBhcnRpY2lwYWNhb18yMDEyIiwNCiAgICAgICAgICAicGFydGljaXBhY2FvXzIwMjUiLA0KICAgICAgICAgICJ2YXJpYWNhb19wcCIsDQogICAgICAgICAgImNvcl9mb250ZSIsDQogICAgICAgICAgIm9yZGVtX2ZvbnRlIg0KICAgICAgICApDQogICAgKSwNCiAgIk7Do28gZXhpc3RlbSBleGF0YW1lbnRlIHNlaXMgb2JzZXJ2YcOnw7VlcyBwYXJhIDIwMTIuIiA9DQogICAgc3VtKGRhZG9zX2dyYWZpY285JGFubyA9PSAyMDEyTCkgPT0gNiwNCiAgIk7Do28gZXhpc3RlbSBleGF0YW1lbnRlIHNlaXMgb2JzZXJ2YcOnw7VlcyBwYXJhIDIwMjUuIiA9DQogICAgc3VtKGRhZG9zX2dyYWZpY285JGFubyA9PSAyMDI1TCkgPT0gNiwNCiAgIk8gb2JqZXRvIGNvbnTDqW0gYW5vcyBkaWZlcmVudGVzIGRlIDIwMTIgZSAyMDI1LiIgPQ0KICAgIHNldGVxdWFsKA0KICAgICAgdW5pcXVlKGRhZG9zX2dyYWZpY285JGFubyksDQogICAgICBjKDIwMTJMLCAyMDI1TCkNCiAgICApLA0KICAiRXhpc3RlbSBjb21iaW5hw6fDtWVzIGR1cGxpY2FkYXMgZGUgYW5vIGUgZm9udGUuIiA9DQogICAgZHBseXI6Om5fZGlzdGluY3QoDQogICAgICBkYWRvc19ncmFmaWNvOSRhbm8sDQogICAgICBkYWRvc19ncmFmaWNvOSRmb250ZQ0KICAgICkgPT0gMTIsDQogICJBcyBzZWlzIGZvbnRlcyBuw6NvIGFwYXJlY2VtIG5vcyBkb2lzIGFub3MuIiA9DQogICAgYWxsKA0KICAgICAgdGFibGUoZGFkb3NfZ3JhZmljbzkkZm9udGUpID09IDINCiAgICApLA0KICAiRXhpc3RlbSB2YWxvcmVzIGF1c2VudGVzIG5vIG9iamV0byBkYWRvc19ncmFmaWNvOS4iID0NCiAgICAhYW55TkEoZGFkb3NfZ3JhZmljbzkpLA0KICAiRXhpc3RlbSB2YWxvcmVzIGluZmluaXRvcyBubyBvYmpldG8gZGFkb3NfZ3JhZmljbzkuIiA9DQogICAgYWxsKGlzLmZpbml0ZSh2YWxvcmVzX251bWVyaWNvc19ncmFmaWNvOSkpLA0KICAiRXhpc3RlbSBwYXJ0aWNpcGHDp8O1ZXMgYWJhaXhvIGRlIHplcm8uIiA9DQogICAgYWxsKGRhZG9zX2dyYWZpY285JHBhcnRpY2lwYWNhb19wY3QgPj0gMCksDQogICJFeGlzdGVtIHBhcnRpY2lwYcOnw7VlcyBhY2ltYSBkZSAxMDAlLiIgPQ0KICAgIGFsbChkYWRvc19ncmFmaWNvOSRwYXJ0aWNpcGFjYW9fcGN0IDw9IDEwMCksDQogICJBIHNvbWEgZGFzIGZvbnRlcyBuw6NvIGVzdMOhIGRlbnRybyBkYSB0b2xlcsOibmNpYSBkZSAxMDAlLiIgPQ0KICAgIGFsbCgNCiAgICAgIHNvbWFzX2FudWFpc19ncmFmaWNvOSRzb21hX3BhcnRpY2lwYWNvZXMgPj0gOTkuNyAmDQogICAgICAgIHNvbWFzX2FudWFpc19ncmFmaWNvOSRzb21hX3BhcnRpY2lwYWNvZXMgPD0gMTAwLjMNCiAgICApLA0KICAiQSB2YXJpYcOnw6NvIGVtIHBvbnRvcyBwZXJjZW50dWFpcyBmb2kgY2FsY3VsYWRhIGluY29ycmV0YW1lbnRlLiIgPQ0KICAgIGFsbCgNCiAgICAgIGFicygNCiAgICAgICAgZGFkb3NfZ3JhZmljbzkkdmFyaWFjYW9fcHAgLQ0KICAgICAgICAgICgNCiAgICAgICAgICAgIGRhZG9zX2dyYWZpY285JHBhcnRpY2lwYWNhb18yMDI1IC0NCiAgICAgICAgICAgICAgZGFkb3NfZ3JhZmljbzkkcGFydGljaXBhY2FvXzIwMTINCiAgICAgICAgICApDQogICAgICApIDwgMWUtOA0KICAgICksDQogICJPcyB2YWxvcmVzIGV4dHJhw61kb3MgbsOjbyBjb3JyZXNwb25kZW0gw6AgZXN0cnV0dXJhIGNvbmZpcm1hZGEgZGEgcGxhbmlsaGEuIiA9DQogICAgYWxsKA0KICAgICAgYWJzKA0KICAgICAgICB2YWxpZGFjYW9fdmFsb3Jlc19ncmFmaWNvOSRwYXJ0aWNpcGFjYW9fcGN0IC0NCiAgICAgICAgICB2YWxpZGFjYW9fdmFsb3Jlc19ncmFmaWNvOSR2YWxvcl9lc3BlcmFkbw0KICAgICAgKSA8IDFlLTgNCiAgICApDQopDQoNCiMgOC4gUHJlcGFyYcOnw6NvIGRhcyBzw6lyaWVzDQoNCm9yZGVtX2ZvbnRlc19ncmFmaWNvOSA8LSBjb21wYXJhY2FvX2ZvbnRlc19ncmFmaWNvOSB8Pg0KICBkcGx5cjo6YXJyYW5nZShvcmRlbV9mb250ZSkgfD4NCiAgZHBseXI6OnB1bGwoZm9udGUpDQoNCmNyaWFyX3BvbnRvc19mb250ZV9ncmFmaWNvOSA8LSBmdW5jdGlvbihub21lX2ZvbnRlKSB7DQogIGRhZG9zX2ZvbnRlIDwtIGRhZG9zX2dyYWZpY285IHw+DQogICAgZHBseXI6OmZpbHRlcihmb250ZSA9PSBub21lX2ZvbnRlKSB8Pg0KICAgIGRwbHlyOjphcnJhbmdlKGFubykNCg0KICBsYXBwbHkoDQogICAgc2VxX2xlbihucm93KGRhZG9zX2ZvbnRlKSksDQogICAgZnVuY3Rpb24oaSkgew0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IGkgLSAxLA0KICAgICAgICB5ID0gZGFkb3NfZm9udGUkcGFydGljaXBhY2FvX3BjdFtpXSwNCiAgICAgICAgY3VzdG9tID0gbGlzdCgNCiAgICAgICAgICBhbm8gPSBkYWRvc19mb250ZSRhbm9baV0sDQogICAgICAgICAgZm9udGUgPSBkYWRvc19mb250ZSRmb250ZVtpXSwNCiAgICAgICAgICBmb250ZV9jb21wbGV0YSA9DQogICAgICAgICAgICBkYWRvc19mb250ZSRmb250ZV9jb21wbGV0YVtpXSwNCiAgICAgICAgICBwYXJ0aWNpcGFjYW9fcGN0ID0NCiAgICAgICAgICAgIGRhZG9zX2ZvbnRlJHBhcnRpY2lwYWNhb19wY3RbaV0sDQogICAgICAgICAgcGFydGljaXBhY2FvXzIwMTIgPQ0KICAgICAgICAgICAgZGFkb3NfZm9udGUkcGFydGljaXBhY2FvXzIwMTJbaV0sDQogICAgICAgICAgcGFydGljaXBhY2FvXzIwMjUgPQ0KICAgICAgICAgICAgZGFkb3NfZm9udGUkcGFydGljaXBhY2FvXzIwMjVbaV0sDQogICAgICAgICAgdmFyaWFjYW9fcHAgPQ0KICAgICAgICAgICAgZGFkb3NfZm9udGUkdmFyaWFjYW9fcHBbaV0NCiAgICAgICAgKQ0KICAgICAgKQ0KICAgIH0NCiAgKQ0KfQ0KDQojIDkuIENvbnN0cnXDp8OjbyBkYXMgY29sdW5hcyBlbXBpbGhhZGFzDQoNCmdyYWZpY28gPC0gaGlnaGNoYXJ0ZXI6OmhpZ2hjaGFydCgpIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jaGFydCgNCiAgICB0eXBlID0gImNvbHVtbiIsDQogICAgaGVpZ2h0ID0gNTMwLA0KICAgIGJhY2tncm91bmRDb2xvciA9ICIjRkZGRkZGIiwNCiAgICBtYXJnaW5Ub3AgPSAxNDUsDQogICAgc3BhY2luZ1JpZ2h0ID0gMzAsDQogICAgc3BhY2luZ0JvdHRvbSA9IDkwLA0KICAgIHNwYWNpbmdMZWZ0ID0gMjANCiAgKQ0KDQpmb3IgKGZvbnRlX2kgaW4gb3JkZW1fZm9udGVzX2dyYWZpY285KSB7DQogIGRhZG9zX3NlcmllX2kgPC0gZGFkb3NfZ3JhZmljbzkgfD4NCiAgICBkcGx5cjo6ZmlsdGVyKGZvbnRlID09IGZvbnRlX2kpIHw+DQogICAgZHBseXI6OmFycmFuZ2UoYW5vKQ0KDQogIGNvcl9zZXJpZV9pIDwtIHVuaXF1ZSgNCiAgICBkYWRvc19zZXJpZV9pJGNvcl9mb250ZQ0KICApDQoNCiAgY29yX3RleHRvX2kgPC0gaWYgKA0KICAgIGZvbnRlX2kgJWluJQ0KICAgICAgYygNCiAgICAgICAgIlRyYWJhbGhvIiwNCiAgICAgICAgIlBlbnPDtWVzLCBkb2HDp8O1ZXMgZSBtZXNhZGFzIg0KICAgICAgKQ0KICApIHsNCiAgICAiI0ZGRkZGRiINCiAgfSBlbHNlIHsNCiAgICB1bm5hbWUoY29yZXNfaWJtYWNyb1sicHJldG8iXSkNCiAgfQ0KDQogIGdyYWZpY28gPC0gZ3JhZmljbyB8Pg0KICAgIGhpZ2hjaGFydGVyOjpoY19hZGRfc2VyaWVzKA0KICAgICAgdHlwZSA9ICJjb2x1bW4iLA0KICAgICAgbmFtZSA9IGZvbnRlX2ksDQogICAgICBkYXRhID0gY3JpYXJfcG9udG9zX2ZvbnRlX2dyYWZpY285KA0KICAgICAgICBmb250ZV9pDQogICAgICApLA0KICAgICAgY29sb3IgPSBjb3Jfc2VyaWVfaSwNCiAgICAgIGJvcmRlcldpZHRoID0gMCwNCiAgICAgIHNoYWRvdyA9IEZBTFNFLA0KICAgICAgZGF0YUxhYmVscyA9IGxpc3QoDQogICAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgICBpbnNpZGUgPSBUUlVFLA0KICAgICAgICBjcm9wID0gVFJVRSwNCiAgICAgICAgb3ZlcmZsb3cgPSAibm9uZSIsDQogICAgICAgIGZvcm1hdHRlciA9IGh0bWx3aWRnZXRzOjpKUygNCiAgICAgICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKHRoaXMueSA8IDMpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgICAgdGhpcy55LA0KICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAnLCcsDQogICAgICAgICAgICAgICcuJw0KICAgICAgICAgICAgKSArICclJzsNCiAgICAgICAgICB9Ig0KICAgICAgICApLA0KICAgICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgICAgY29sb3IgPSBjb3JfdGV4dG9faSwNCiAgICAgICAgICBmb250U2l6ZSA9ICIxMHB4IiwNCiAgICAgICAgICBmb250V2VpZ2h0ID0gIm5vcm1hbCIsDQogICAgICAgICAgdGV4dE91dGxpbmUgPSAibm9uZSINCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCn0NCg0KIyAxMC4gRm9ybWF0YcOnw6NvDQoNCmdyYWZpY28gPC0gZ3JhZmljbyB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfYWRkX3RoZW1lKA0KICAgIHRlbWFfaWJtYWNybw0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY190aXRsZSgNCiAgICB0ZXh0ID0gIkRlIG9uZGUgdmVtIGEgcmVuZGEgZG9taWNpbGlhciBicmFzaWxlaXJhIg0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19zdWJ0aXRsZSgNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIlBhcnRpY2lwYcOnw6NvIGRhcyBmb250ZXMgbm8gcmVuZGltZW50byBkb21pY2lsaWFyIHBlciBjYXBpdGEgIiwNCiAgICAgICLigJQgQnJhc2lsLCAyMDEyIGUgMjAyNSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3hBeGlzKA0KICAgIGNhdGVnb3JpZXMgPSBjKA0KICAgICAgIjIwMTIiLA0KICAgICAgIjIwMjUiDQogICAgKSwNCiAgICB0aXRsZSA9IGxpc3QoDQogICAgICB0ZXh0ID0gIkFubyINCiAgICApLA0KICAgIHJldmVyc2VkID0gRkFMU0UsDQogICAgbGFiZWxzID0gbGlzdCgNCiAgICAgIHJvdGF0aW9uID0gMCwNCiAgICAgIHN0eWxlID0gbGlzdCgNCiAgICAgICAgZm9udFNpemUgPSAiMTFweCINCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCgNCiAgICAgIHRleHQgPSAiUGFydGljaXBhw6fDo28gbm8gcmVuZGltZW50byBkb21pY2lsaWFyIHBlciBjYXBpdGEgKCUpIg0KICAgICksDQogICAgbWluID0gMCwNCiAgICBtYXggPSAxMDAsDQogICAgdGlja0ludGVydmFsID0gMjAsDQogICAgc3RhcnRPblRpY2sgPSBUUlVFLA0KICAgIGVuZE9uVGljayA9IFRSVUUsDQogICAgcmV2ZXJzZWRTdGFja3MgPSBGQUxTRSwNCiAgICBsYWJlbHMgPSBsaXN0KA0KICAgICAgZm9ybWF0dGVyID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHRoaXMudmFsdWUsDQogICAgICAgICAgICAxLA0KICAgICAgICAgICAgJywnLA0KICAgICAgICAgICAgJy4nDQogICAgICAgICAgKSArICclJzsNCiAgICAgICAgfSINCiAgICAgICkNCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX3Bsb3RPcHRpb25zKA0KICAgIGNvbHVtbiA9IGxpc3QoDQogICAgICBzdGFja2luZyA9ICJub3JtYWwiLA0KICAgICAgYm9yZGVyV2lkdGggPSAwLA0KICAgICAgcG9pbnRXaWR0aCA9IDE0NSwNCiAgICAgIHBvaW50UGFkZGluZyA9IDAuMDgsDQogICAgICBncm91cFBhZGRpbmcgPSAwLjI1LA0KICAgICAgc2hhZG93ID0gRkFMU0UNCiAgICApLA0KICAgIHNlcmllcyA9IGxpc3QoDQogICAgICBhbmltYXRpb24gPSBUUlVFLA0KICAgICAgc2hhZG93ID0gRkFMU0UsDQogICAgICBzdGF0ZXMgPSBsaXN0KA0KICAgICAgICBpbmFjdGl2ZSA9IGxpc3QoDQogICAgICAgICAgb3BhY2l0eSA9IDAuMzUNCiAgICAgICAgKQ0KICAgICAgKQ0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfdG9vbHRpcCgNCiAgICBzaGFyZWQgPSBGQUxTRSwNCiAgICB1c2VIVE1MID0gVFJVRSwNCiAgICBmb3JtYXR0ZXIgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAiZnVuY3Rpb24gKCkgew0KICAgICAgICBjb25zdCBkID0gdGhpcy5wb2ludC5jdXN0b207DQoNCiAgICAgICAgY29uc3QgbmYgPSBmdW5jdGlvbih2YWxvcikgew0KICAgICAgICAgIHJldHVybiBIaWdoY2hhcnRzLm51bWJlckZvcm1hdCgNCiAgICAgICAgICAgIHZhbG9yLA0KICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICcsJywNCiAgICAgICAgICAgICcuJw0KICAgICAgICAgICk7DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3Qgc2luYWwgPQ0KICAgICAgICAgIGQudmFyaWFjYW9fcHAgPiAwID8gJysnIDoNCiAgICAgICAgICBkLnZhcmlhY2FvX3BwIDwgMCA/ICfiiJInIDogJyc7DQoNCiAgICAgICAgcmV0dXJuICgNCiAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1pbi13aWR0aDozMzBweDtwYWRkaW5nOjRweCAycHg7XCI+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6Ym9sZDsnICsNCiAgICAgICAgICAgICAgJ21hcmdpbi1ib3R0b206NHB4O2NvbG9yOiMxMTE4Mjc7XCI+JyArDQogICAgICAgICAgICAgIGQuZm9udGVfY29tcGxldGEgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxMXB4O2NvbG9yOiM2QjcyODA7JyArDQogICAgICAgICAgICAgICdtYXJnaW4tYm90dG9tOjEwcHg7XCI+JyArDQogICAgICAgICAgICAgICdCcmFzaWwg4oCUICcgKyBkLmFubyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo1cHg7XCI+JyArDQogICAgICAgICAgICAgICdQYXJ0aWNpcGHDp8OjbyBubyBhbm86IDxiPicgKw0KICAgICAgICAgICAgICAgIG5mKGQucGFydGljaXBhY2FvX3BjdCkgKw0KICAgICAgICAgICAgICAgICclPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NXB4O1wiPicgKw0KICAgICAgICAgICAgICAnUGFydGljaXBhw6fDo28gZW0gMjAxMjogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5wYXJ0aWNpcGFjYW9fMjAxMikgKw0KICAgICAgICAgICAgICAgICclPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206NXB4O1wiPicgKw0KICAgICAgICAgICAgICAnUGFydGljaXBhw6fDo28gZW0gMjAyNTogPGI+JyArDQogICAgICAgICAgICAgICAgbmYoZC5wYXJ0aWNpcGFjYW9fMjAyNSkgKw0KICAgICAgICAgICAgICAgICclPC9iPicgKw0KICAgICAgICAgICAgJzwvZGl2PicgKw0KDQogICAgICAgICAgICAnPGRpdiBzdHlsZT1cImJvcmRlci10b3A6MXB4IHNvbGlkICNFNUU3RUI7JyArDQogICAgICAgICAgICAgICdwYWRkaW5nLXRvcDo3cHg7bWFyZ2luLXRvcDo3cHg7XCI+JyArDQogICAgICAgICAgICAgICdWYXJpYcOnw6NvIGVudHJlIDIwMTIgZSAyMDI1OiA8Yj4nICsNCiAgICAgICAgICAgICAgICBzaW5hbCArDQogICAgICAgICAgICAgICAgbmYoTWF0aC5hYnMoZC52YXJpYWNhb19wcCkpICsNCiAgICAgICAgICAgICAgICAnIHAucC48L2I+JyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEwcHg7Y29sb3I6IzZCNzI4MDsnICsNCiAgICAgICAgICAgICAgJ21hcmdpbi10b3A6OHB4O1wiPicgKw0KICAgICAgICAgICAgICAnRGlmZXJlbsOnYSBlbnRyZSBhcyBwYXJ0aWNpcGHDp8O1ZXMgZGUgMjAyNSBlIDIwMTIuJyArDQogICAgICAgICAgICAnPC9kaXY+JyArDQoNCiAgICAgICAgICAnPC9kaXY+Jw0KICAgICAgICApOw0KICAgICAgfSINCiAgICApDQogICkgfD4NCiAgaGlnaGNoYXJ0ZXI6OmhjX2xlZ2VuZCgNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBsYXlvdXQgPSAiaG9yaXpvbnRhbCIsDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICB2ZXJ0aWNhbEFsaWduID0gInRvcCIsDQogICAgZmxvYXRpbmcgPSBGQUxTRSwNCiAgICB5ID0gNTUsDQogICAgc3ltYm9sV2lkdGggPSAxNiwNCiAgICBpdGVtRGlzdGFuY2UgPSAxNSwNCiAgICBpdGVtTWFyZ2luVG9wID0gMywNCiAgICBpdGVtTWFyZ2luQm90dG9tID0gMw0KICApIHw+DQogIGhpZ2hjaGFydGVyOjpoY19jYXB0aW9uKA0KICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAiTm90YTogYXMgcGFydGljaXBhw6fDtWVzIGluZGljYW0gcXVhbnRvIGNhZGEgZm9udGUgcmVwcmVzZW50YSBubyAiLA0KICAgICAgInJlbmRpbWVudG8gbcOpZGlvIG1lbnNhbCByZWFsIGRvbWljaWxpYXIgcGVyIGNhcGl0YS4gQXMgY2F0ZWdvcmlhcyAiLA0KICAgICAgImFwcmVzZW50YWRhcyBzw6NvIG11dHVhbWVudGUgZXhjbHVzaXZhcyBlIHNvbWFtIDEwMCUgZW0gY2FkYSBhbm8uICIsDQogICAgICAiQSBjYXRlZ29yaWEgYWdyZWdhZGEg4oCcT3V0cmFzIGZvbnRlc+KAnSBuw6NvIGZvaSBpbmNsdcOtZGEgcGFyYSBldml0YXIgIiwNCiAgICAgICJkdXBsYSBjb250YWdlbSBkZSBzdWFzIHN1YmNhdGVnb3JpYXMuIg0KICAgICksDQogICAgYWxpZ24gPSAibGVmdCIsDQogICAgc3R5bGUgPSBsaXN0KA0KICAgICAgY29sb3IgPSAiIzZCNzI4MCIsDQogICAgICBmb250U2l6ZSA9ICIxMHB4Ig0KICAgICkNCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfZXhwb3J0aW5nKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIGZpbGVuYW1lID0gImNvbXBvc2ljYW8tcmVuZGltZW50by1kb21pY2lsaWFyLTIwMTItMjAyNSINCiAgKSB8Pg0KICBoaWdoY2hhcnRlcjo6aGNfY3JlZGl0cygNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgIkZvbnRlOiBJQkdFL1BOQUQgQ29udMOtbnVhIOKAkyBTSURSQSA3NDI5LiAiLA0KICAgICAgIkVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYk1hY3JvIEJILiINCiAgICApLA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNvbG9yID0gIiM2QjcyODAiLA0KICAgICAgZm9udFNpemUgPSAiMTBweCINCiAgICApDQogICkNCg0KIyAxMS4gRXhpYmnDp8Ojbw0KDQpncmFmaWNvDQoNCmBgYA0KDQpPIHRyYWJhbGhvIHBlcm1hbmVjZXUgY29tbyBhIHByaW5jaXBhbCBmb250ZSBkbyByZW5kaW1lbnRvIGRvbWljaWxpYXIsIGVtYm9yYSBzdWEgcGFydGljaXBhw6fDo28gdGVuaGEgcmVjdWFkbyBkZSA3NSw3JSBlbSAyMDEyIHBhcmEgNzUsMSUgZW0gMjAyNS4gQXBvc2VudGFkb3JpYXMgZSBwZW5zw7VlcyBmaWNhcmFtIHByYXRpY2FtZW50ZSBlc3TDoXZlaXMsIHBhc3NhbmRvIGRlIDE2LDUlIHBhcmEgMTYsNCUuIEEgbXVkYW7Dp2EgbWFpcyBleHByZXNzaXZhIG9jb3JyZXUgbm9zIHByb2dyYW1hcyBzb2NpYWlzLCBjdWphIHBhcnRpY2lwYcOnw6NvIGF1bWVudG91IGRlIDEsNSUgcGFyYSAzLDUlLCBlbnF1YW50byBhbHVndcOpaXMsIHBlbnPDtWVzIGFsaW1lbnTDrWNpYXMsIGRvYcOnw7VlcywgbWVzYWRhcyBlIG91dHJvcyByZW5kaW1lbnRvcyBwZXJkZXJhbSBlc3Bhw6dvLg0KDQpBIGVzdGFiaWxpZGFkZSBkYSBwYXJjZWxhIGRvIHRyYWJhbGhvLCBwcsOzeGltYSBkZSB0csOqcyBxdWFydG9zIGRhIHJlbmRhIGRvbWljaWxpYXIsIHJlZm9yw6dhIGEgaW1wb3J0w6JuY2lhIGRhcyB0cmFqZXTDs3JpYXMgYXByZXNlbnRhZGFzIG5vcyBncsOhZmljb3MgYW50ZXJpb3Jlcy4gTWVzbW8gcGVxdWVuYXMgbXVkYW7Dp2FzIG5hIG9jdXBhw6fDo28gZSBub3MgcmVuZGltZW50b3MgZGUgc2V0b3JlcyBjb20gbXVpdG9zIHRyYWJhbGhhZG9yZXMgcG9kZW0gYWxjYW7Dp2FyIHVtYSBwYXJjZWxhIGFtcGxhIGRhcyBmYW3DrWxpYXMuIEFvIG1lc21vIHRlbXBvLCBvIGNyZXNjaW1lbnRvIGRhIHBhcnRpY2lwYcOnw6NvIGRvcyBwcm9ncmFtYXMgc29jaWFpcyBtb3N0cmEgcXVlIG91dHJhcyBmb250ZXMgcGFzc2FyYW0gYSBleGVyY2VyIHVtIHBhcGVsIG1haW9yIG5hIHN1c3RlbnRhw6fDo28gZGEgcmVuZGEsIGVzcGVjaWFsbWVudGUgZW0gcGVyw61vZG9zIG5vcyBxdWFpcyBvIG1lcmNhZG8gZGUgdHJhYmFsaG8gZm9pIGF0aW5naWRvIHBvciByZWNlc3PDo28gb3UgcGFuZGVtaWEuDQoNCg0KIyBQYXJ0ZSAzIOKAlCBDw6JtYmlvIGUgZGVzaWd1YWxkYWRlIGRlIHJlbmRhDQoNCiMjIDMuMSBPIMONbmRpY2UgZGUgR2luaSBlIG8gY8OibWJpbw0KDQpBbyBhbmFsaXNhciB0b2RvcyBvcyBmYXRvcmVzIGVudm9sdmVuZG8gbyBjw6JtYmlvIGUgY29tbyBpc3NvIGFmZXRhIGEgZGluw6JtaWNhIGRhcyBmYW3DrWxpYXMgZSBkb3MgZW1wcmVnb3MsIG8gcHLDs3hpbW8gZW50ZW5kaW1lbnRvIHNlIGTDoSBwb3IgY29udGEgZGUgY29tbyBpc3NvIGltcGFjdGEgYSBkZXNpZ3VhbGRhZGUgbm8gZmluYWwgZGVzc2EgY2FkZWlhLiBQYXJhIGlzc28sIGEgcHJpb3JpIGEgbcOpdHJpY2EgdXRpbGl6YWRhIHBhcmEgZm9tZW50YXIgZXNzYSBkaXNjdXNzw6NvIHNlcsOhIG8gw41uZGljZSBkZSBHaW5pLCBjb25zdGFudGVtZW50ZSB1c2FkbyBwYXJhIG1lZGlyIG8gZ3JhdSBkZSBkZXNpZ3VhbGRhZGUgbmEgZGlzdHJpYnVpw6fDo28gZGUgcmVuZGEgb3UgZGUgcmlxdWV6YSBlbSB1bWEgcG9wdWxhw6fDo28sIGN1am8gdmFsb3IgdmFyaWEgZGUgMCBhIDEsIHNlbmRvIHF1ZSBvIHplcm8gcmVwcmVzZW50YSB1bWEgaWd1YWxkYWRlIHBlcmZlaXRhLCBvdSBzZWphLCBlbSB0ZW9yaWEgdG9kYXMgYXMgcGVzc29hcyB0ZXJpYW0gYSBtZXNtYSByZW5kYSwgZSBvIHVtIHJlcHJlc2VudGEgdW1hIGRlc2lndWFsZGFkZSBtw6F4aW1hLCBlbSBxdWUgdG9kYSBhIHJlbmRhIGVzdGFyaWEgY29uY2VudHJhZGEgZW0gdW1hIMO6bmljYSBwZXNzb2EuDQoNCkFvIHZvbHRhciBwYXJhIG8gY2Vuw6FyaW8gYnJhc2lsZWlybyBlIHN1YSBzw6lyaWUgaGlzdMOzcmljYSBkbyBHaW5pLCBjb21wYXJhbmRvLWEgY29tIGEgZXZvbHXDp8OjbyBkbyBjw6JtYmlvLCBpbmZlcmUtc2UgcHJpbWVpcmFtZW50ZSBxdWUgYSByZWxhw6fDo28gZW50cmUgb3MgZG9pcyBuw6NvIMOpIG11aXRvIGNvcnJlbGFjaW9uYWRhLCBzZW5kbyBxdWUgYXBlbmFzIGFsZ3VucyBhbm9zIGVzcGVjw61maWNvcyBwYXJlY2VtLCDDoCBwcmltZWlyYSB2aXN0YSwgaW5kaWNhciB1bSByZWFsIGltcGFjdG8gZG8gY8OibWJpbyBzb2JyZSBhIGRlc2lndWFsZGFkZSwgbWFzIHF1ZSwgYW5hbGlzYWRvcyBjb20gbWFpcyBjdWlkYWRvLCByZXZlbGFtIG91dHJhcyBjYXVzYXMgcG9yIHRyw6FzLiBPIGFubyBkZSAyMDIwLCBtYXJjYWRvIHBlbGEgcGFuZGVtaWEsIMOpIG8gY2FzbyBtYWlzIGV2aWRlbnRlOiBvIGPDom1iaW8gZGV1IHVtIHNhbHRvIGV4cHJlc3Npdm8sIHNhaW5kbyBkZSBSJDQsMDMgZW0gMjAxOSBwYXJhIFIkNSwyMCwganVzdGFtZW50ZSBvIHRpcG8gZGUgY2hvcXVlIHF1ZSBhIHRlb3JpYSBkaXJpYSBxdWUgZGV2ZXJpYSBwaW9yYXIgYSBkZXNpZ3VhbGRhZGUsIGUgYWluZGEgYXNzaW0gbyBHaW5pIGNhaXUsIGRlIDAsNTQ0IHBhcmEgMCw1MjQsIG11aXRvIHBvciBjb250YSBkb3MgYXV4w61saW9zIGVtZXJnZW5jaWFpcyBkaXN0cmlidcOtZG9zIGR1cmFudGUgbyBwZXLDrW9kbyBwYW5kw6ptaWNvLCBxdWUgc3VzdGVudGFyYW0gYSByZW5kYSBkYXMgZmFtw61saWFzIG1haXMgcG9icmVzIGV4YXRhbWVudGUgbm8gbW9tZW50byBlbSBxdWUgbyBjw6JtYmlvIG1haXMgcGVzYXZhLiANCg0KSsOhIG5vIHBlcsOtb2RvIGRhIHJlY2Vzc8OjbyBkZSAyMDE1IGEgMjAxNiwgcXVhbmRvIG8gY8OibWJpbyBkaXNwYXJvdSBkZSBSJDIsMzUgcGFyYSBSJDMsNDkgZW0gYXBlbmFzIGRvaXMgYW5vcywgbyBHaW5pIHByYXRpY2FtZW50ZSBuw6NvIHNlIG1vdmV1LCBvc2NpbGFuZG8gZGUgMCw1MjYgcGFyYSAwLDUzNyDigJQgdW0gY29udHJhc3RlIHF1ZSB0YW1iw6ltIHZhaSBjb250cmEgYSBpbnR1acOnw6NvLCBqw6EgcXVlIHVtIGNob3F1ZSBjYW1iaWFsIGRlc3NhIG1hZ25pdHVkZSwgZW0gbWVpbyBhIHVtYSByZWNlc3PDo28gcHJvZnVuZGEsIHBvZGVyaWEgc2UgZXNwZXJhciB1bSBzYWx0byBtdWl0byBtYWlvciBuYSBkZXNpZ3VhbGRhZGUgbWVkaWRhLiBFbSAyMDI0LCBvIEdpbmkgYXRpbmdpdSBvIG1lbm9yIHZhbG9yIGRhIHPDqXJpZSwgMCw1MDYsIGNvbSBvIGPDom1iaW8gZW0gUiQ1LDQ4LCBlIGVtIDIwMjUsIG8gw7psdGltbyBhbm8gY29tIHJlZ2lzdHJvLCBvIGPDom1iaW8gc3ViaXUgbGlnZWlyYW1lbnRlIHBhcmEgUiQ1LDU1IGUgbyBHaW5pIHRhbWLDqW0gc3ViaXUsIHBhcmEgMCw1MTEg4oCUIG91IHNlamEsIGRlc3NhIHZleiBvcyBkb2lzIHNlIG1vdmVyYW0gbmEgbWVzbWEgZGlyZcOnw6NvLCBtYXMgaXNzbyBuw6NvIGRldmUgc2VyIGxpZG8gY29tbyBjb25maXJtYcOnw6NvIGRlIHVtYSByZWxhw6fDo28gY29uc3RhbnRlLCBlIHNpbSBjb21vIG1haXMgdW0gcG9udG8gaXNvbGFkbyBlbSB1bWEgc8OpcmllIHF1ZSwgYW5vIGEgYW5vLCBuw6NvIHNlZ3VlIHBhZHLDo28gYWxndW0uDQoNCkxvZ28sIHBvZGUtc2UgaW5mZXJpciBxdWUgbyBjw6JtYmlvIGUgYSBkZXNpZ3VhbGRhZGUsIG1lZGlkYSBwZWxvIEdpbmksIG7Do28gZXN0w6NvIGRpcmV0YW1lbnRlIGNvcnJlbGFjaW9uYWRvcywgZSBxdWUgbyBjw6JtYmlvIGltcGFjdGEgYSBkZXNpZ3VhbGRhZGUgZGUgZm9ybWEgc2VjdW5kw6FyaWEgZSBtYWlzIGluZGlyZXRhLCBkaWZlcmVudGUgZG8gcXVlIG9jb3JyZSBjb20gbyBwb2RlciBkZSBjb21wcmEgZSBvIG1lcmNhZG8gZGUgdHJhYmFsaG8sIGRpc2N1dGlkb3MgYW50ZXJpb3JtZW50ZS4gRW50cmV0YW50bywgbyBHaW5pIGVzY29uZGUgdW1hIHBhcnRlIHF1ZSwgc2UgbsOjbyBiZW0gYW5hbGlzYWRhLCBwb2RlIG1hc2NhcmFyIGEgdmVyZGFkZWlyYSBkZXNpZ3VhbGRhZGUsIHNlbmRvIG5lY2Vzc8OhcmlvIHVzYXIgb3V0cmEgYW7DoWxpc2UgcGFyYSBpbmZlcmlyIHVtYSByZWxhw6fDo28gRGVzaWd1YWxkYWRlIHggQ8OibWJpby4NCg0KKipHcsOhZmljbyAzLjEg4oCUIMONbmRpY2UgZGUgR2luaSwgQnJhc2lsICgyMDEy4oCTMjAyNSkqKg0KDQpgYGB7ciBwMy1naW5pfQ0KYW5vc19naW5pIDwtIDIwMTI6MjAyNQ0KZ2luaSA8LSBjKDAuNTQwLCAwLjUzMiwgMC41MjYsIDAuNTI0LCAwLjUzNywgMC41MzksIDAuNTQ1LCAwLjU0NCwNCiAgICAgICAgICAwLjUyNCwgMC41NDQsIDAuNTE4LCAwLjUxOCwgMC41MDYsIDAuNTExKQ0KDQpncmFmaWNvX2dpbmkgPC0gaGlnaGNoYXJ0KCkgJT4lDQogIGhjX2NoYXJ0KHR5cGUgPSAibGluZSIsIGFuaW1hdGlvbiA9IEZBTFNFKSAlPiUNCiAgaGNfYWRkX3NlcmllcygNCiAgICBuYW1lICAgICAgID0gIsONbmRpY2UgZGUgR2luaSIsDQogICAgZGF0YSAgICAgICA9IGdpbmksDQogICAgY29sb3IgICAgICA9IElCX0FaVUxfQkFTRSwNCiAgICBsaW5lV2lkdGggID0gMi41LA0KICAgIG1hcmtlciAgICAgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCByYWRpdXMgPSAzLCBmaWxsQ29sb3IgPSBJQl9BWlVMX0JBU0UpDQogICkgJT4lDQogIGhjX3hBeGlzKA0KICAgIGNhdGVnb3JpZXMgPSBhcy5jaGFyYWN0ZXIoYW5vc19naW5pKSwNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9IE5VTEwpDQogICkgJT4lDQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIsONbmRpY2UgZGUgR2luaSIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpLA0KICAgIG1pbiA9IDAuNDksIG1heCA9IDAuNTUsDQogICAgcGxvdExpbmVzID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHZhbHVlID0gMC41MDYsIGNvbG9yID0gSUJfQU1BUkVMTywgd2lkdGggPSAxLjUsIGRhc2hTdHlsZSA9ICJEYXNoIiwgekluZGV4ID0gNCwNCiAgICAgICAgbGFiZWwgPSBsaXN0KHRleHQgPSAiTWVub3IgZGEgc8OpcmllICgyMDI0KSIsDQogICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8sIGZvbnRTaXplID0gIjEwcHgiKSkNCiAgICAgICkNCiAgICApDQogICkgJT4lDQogIGhjX2xlZ2VuZChlbmFibGVkID0gRkFMU0UpICU+JQ0KICBoY190b29sdGlwKA0KICAgIGZvcm1hdHRlciA9IEpTKCJmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAnPGI+JyArIHRoaXMueCArICc8L2I+PGJyLz5HaW5pOiA8Yj4nICsgSGlnaGNoYXJ0cy5udW1iZXJGb3JtYXQodGhpcy55LCAzKSArICc8L2I+JzsNCiAgICB9IikNCiAgKSAlPiUNCiAgaGNfZm9ybWF0YXJfYmFzZSgNCiAgICB0aXR1bG8gICAgPSAiVHJhamV0w7NyaWEgZG8gw41uZGljZSBkZSBHaW5pIOKAlCBCcmFzaWwgKDIwMTLigJMyMDI1KSIsDQogICAgc3VidGl0dWxvID0gIlJlbmRpbWVudG8gZG9taWNpbGlhciBwZXIgY2FwaXRhLCBQTkFEIENvbnTDrW51YS4gUGlzbyBoaXN0w7NyaWNvIGVtIDIwMjQsIGNvbSByZXZlcnPDo28gZW0gMjAyNSIsDQogICAgZm9udGUgICAgID0gIkZvbnRlOiBJQkdFIChQTkFEIENvbnTDrW51YSkgZSBJcGVhZGF0YS4gRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICApDQoNCmdyYWZpY29fZ2luaQ0KYGBgDQoNCioqR3LDoWZpY28gMy4yIOKAlCBDw6JtYmlvIG3DqWRpbyBhbnVhbCAocmVhaXMgcG9yIGTDs2xhcikqKg0KDQpgYGB7ciBwMy1jYW1iaW8tYW51YWx9DQphbm9zX2NhbWJpbyA8LSAyMDEyOjIwMjUNCmNhbWJpbyA8LSBjKDEuOTUsIDIuMTYsIDIuMzUsIDMuMzMsIDMuNDksIDMuMTksIDMuODcsIDQuMDMsDQogICAgICAgICAgICA1LjIwLCA1LjU4LCA1LjIyLCA0Ljg0LCA1LjQ4LCA1LjU1KQ0KDQpncmFmaWNvX2NhbWJpb19hbnVhbCA8LSBoaWdoY2hhcnQoKSAlPiUNCiAgaGNfY2hhcnQodHlwZSA9ICJsaW5lIiwgYW5pbWF0aW9uID0gRkFMU0UpICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiQ8OibWJpbyAoUiQvVVMkKSIsDQogICAgZGF0YSA9IGNhbWJpbywNCiAgICBjb2xvciA9IElCX0FNQVJFTE8sDQogICAgbGluZVdpZHRoID0gMi41LA0KICAgIG1hcmtlciA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIHJhZGl1cyA9IDMsIHN5bWJvbCA9ICJkaWFtb25kIikNCiAgKSAlPiUNCiAgaGNfeEF4aXMoDQogICAgY2F0ZWdvcmllcyA9IGFzLmNoYXJhY3Rlcihhbm9zX2NhbWJpbyksDQogICAgdGl0bGUgPSBsaXN0KHRleHQgPSBOVUxMKQ0KICApICU+JQ0KICBoY195QXhpcygNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJSJCBwb3IgVVMkIiwgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQ0lOWkFfRVNDVVJPKSkNCiAgKSAlPiUNCiAgaGNfbGVnZW5kKGVuYWJsZWQgPSBGQUxTRSkgJT4lDQogIGhjX3Rvb2x0aXAodmFsdWVQcmVmaXggPSAiUiQgIiwgdmFsdWVEZWNpbWFscyA9IDIpICU+JQ0KICBoY19mb3JtYXRhcl9iYXNlKA0KICAgIHRpdHVsbyAgICA9ICJDw6JtYmlvIE3DqWRpYSBBbnVhbCIsDQogICAgc3VidGl0dWxvID0gIlIkL1VTJCwgbcOpZGlhIGFudWFsIGRvIHBlcsOtb2RvIiwNCiAgICBmb250ZSAgICAgPSAiRm9udGVzOiBmYXJtbmV3czsgQW51w6FyaW8gSUJHRSAoMjAxMuKAkzIwMjMpOyBCYWNlbiAoU0dTIDEsIDIwMjTigJMyMDI1KS4gRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICApDQoNCmdyYWZpY29fY2FtYmlvX2FudWFsDQpgYGANCg0KKipHcsOhZmljbyAzLjMg4oCUIFZhcmlhw6fDo28gYW51YWwgZG8gR2luaSDDlyB2YXJpYcOnw6NvIGFudWFsIGRvIGPDom1iaW8qKg0KDQpgYGB7ciBwMy1jb3JyZWxhY2FvLWdpbml9DQphbm9zIDwtIDIwMTI6MjAyNQ0KDQojIOKUgOKUgCBDb3JyZWxhw6fDo28gZGUgdmFyaWHDp8OjbyAoUHJpbWVpcmEgZGlmZXJlbsOnYSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQpkX2dpbmkgICAgIDwtIGRpZmYoZ2luaSkNCmRfY2FtYmlvICAgPC0gZGlmZihjYW1iaW8pDQphbm9zX2RlbHRhIDwtIGFub3NbLTFdDQoNCm1vZGVsb19kZWx0YSA8LSBsbShkX2dpbmkgfiBkX2NhbWJpbykNCnJfZGVsdGEgICAgICA8LSBjb3IoZF9naW5pLCBkX2NhbWJpbykNCnIyX2RlbHRhICAgICA8LSBzdW1tYXJ5KG1vZGVsb19kZWx0YSkkci5zcXVhcmVkDQpiYXRlX3Rlb3JpYSAgPC0gc2lnbihkX2dpbmkpID09IHNpZ24oZF9jYW1iaW8pDQoNCnBvbnRvc19kZWx0YSA8LSBtYXAoc2VxX2Fsb25nKGFub3NfZGVsdGEpLCBmdW5jdGlvbihpKSB7DQogIGxpc3QoDQogICAgeCA9IGRfY2FtYmlvW2ldLCANCiAgICB5ID0gZF9naW5pW2ldLCANCiAgICBuYW1lID0gYXMuY2hhcmFjdGVyKGFub3NfZGVsdGFbaV0pLA0KICAgIGNvbG9yID0gaWYgKGJhdGVfdGVvcmlhW2ldKSBJQl9BWlVMX0JBU0UgZWxzZSBJQl9BTUFSRUxPDQogICkNCn0pDQoNCmxpbmhhX2RlbHRhIDwtIGxpc3QoDQogIGxpc3QoeCA9IG1pbihkX2NhbWJpbyksIHkgPSBwcmVkaWN0KG1vZGVsb19kZWx0YSwgZGF0YS5mcmFtZShkX2NhbWJpbyA9IG1pbihkX2NhbWJpbykpKSksDQogIGxpc3QoeCA9IG1heChkX2NhbWJpbyksIHkgPSBwcmVkaWN0KG1vZGVsb19kZWx0YSwgZGF0YS5mcmFtZShkX2NhbWJpbyA9IG1heChkX2NhbWJpbykpKSkNCikNCg0KZ3JhZmljb19jb3JyZWxhY2FvX2RlbHRhIDwtIGhpZ2hjaGFydCgpICU+JQ0KICBoY19jaGFydCh0eXBlID0gInNjYXR0ZXIiLCBhbmltYXRpb24gPSBGQUxTRSkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJBbm8iLCANCiAgICBkYXRhID0gcG9udG9zX2RlbHRhLA0KICAgIG1hcmtlciA9IGxpc3QocmFkaXVzID0gNSksDQogICAgZGF0YUxhYmVscyA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwgDQogICAgICBmb3JtYXQgPSAie3BvaW50Lm5hbWV9IiwNCiAgICAgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICI5cHgiLCBjb2xvciA9IElCX0NJTlpBX0VTQ1VSTywgdGV4dE91dGxpbmUgPSAibm9uZSIpDQogICAgKQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiVGVuZMOqbmNpYSBsaW5lYXIiLCANCiAgICB0eXBlID0gImxpbmUiLCANCiAgICBkYXRhID0gbGluaGFfZGVsdGEsDQogICAgY29sb3IgPSBJQl9DSU5aQV9DTEFSTywgDQogICAgZGFzaFN0eWxlID0gIkRhc2giLCANCiAgICBsaW5lV2lkdGggPSAxLjUsDQogICAgbWFya2VyID0gbGlzdChlbmFibGVkID0gRkFMU0UpLCANCiAgICBlbmFibGVNb3VzZVRyYWNraW5nID0gRkFMU0UNCiAgKSAlPiUNCiAgaGNfeEF4aXMoDQogICAgdGl0bGUgPSBsaXN0KHRleHQgPSAizpQgQ8OibWJpbyAoYW5vIGEgYW5vKSIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpLA0KICAgIHBsb3RMaW5lcyA9IGxpc3QobGlzdCh2YWx1ZSA9IDAsIGNvbG9yID0gSUJfQ0lOWkFfQ0xBUk8sIHdpZHRoID0gMSkpDQogICkgJT4lDQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIs6UIMONbmRpY2UgZGUgR2luaSAoYW5vIGEgYW5vKSIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpLA0KICAgIHBsb3RMaW5lcyA9IGxpc3QobGlzdCh2YWx1ZSA9IDAsIGNvbG9yID0gSUJfQ0lOWkFfQ0xBUk8sIHdpZHRoID0gMSkpDQogICkgJT4lDQogIGhjX2xlZ2VuZChlbmFibGVkID0gRkFMU0UpICU+JQ0KICBoY190b29sdGlwKA0KICAgIHBvaW50Rm9ybWF0ID0gIkFubzogPGI+e3BvaW50Lm5hbWV9PC9iPjxici8+zpRDw6JtYmlvOiA8Yj57cG9pbnQueDouMmZ9PC9iPjxici8+zpRHaW5pOiA8Yj57cG9pbnQueTouM2Z9PC9iPiINCiAgKSAlPiUNCiAgaGNfZm9ybWF0YXJfYmFzZSgNCiAgICB0aXR1bG8gICAgPSAiQ29ycmVsYcOnw6NvIGRlIHZhcmlhw6fDo28iLA0KICAgIHN1YnRpdHVsbyA9IHNwcmludGYoDQogICAgICAiciA9ICUuMmYgfCBSwrIgPSAlLjJmIHwgbiA9ICVkLiBBenVsOiBtZXNtYSBkaXJlw6fDo28gZGEgdGVvcmlhOyBhbWFyZWxvOiBkaXJlw6fDo28gb3Bvc3RhIiwNCiAgICAgIHJfZGVsdGEsIHIyX2RlbHRhLCBsZW5ndGgoZF9naW5pKQ0KICAgICksDQogICAgZm9udGUgICAgID0gIkZvbnRlczogSUJHRSBlIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsLiBFbGFib3Jhw6fDo28gcHLDs3ByaWEgSWJNYWNybyBCSC4iDQogICkNCg0KZ3JhZmljb19jb3JyZWxhY2FvX2RlbHRhDQpgYGANCg0KIyMgMy4yIE8gcXVlIG8gR2luaSBuw6NvIGNhcHRhOiBQTkFEIENvbnTDrW51YSDDlyBSZWNlaXRhIEZlZGVyYWwNCg0KUGFyYSBpbnZlc3RpZ2FyIGEgY29uY2VudHJhw6fDo28gZGUgcmVuZGEgZGUgZm9ybWEgbWFpcyBmaWRlZGlnbmEsIMOpIHByZWNpc28gb2xoYXIgcGFyYSBvcyBkYWRvcyBkYSBSZWNlaXRhIEZlZGVyYWwsIGUgbsOjbyBzb21lbnRlIHBhcmEgb3MgZGEgUE5BRCBDb250w61udWEsIHF1ZSDDqSBkZSBvbmRlIHbDqm0gb3MgZGFkb3MgdXNhZG9zIHBhcmEgY2FsY3VsYXIgbyBHaW5pLCBwb2lzIGEgUE5BRCDDqSB1bWEgcGVzcXVpc2EgZG9taWNpbGlhciBxdWUgc3ViZXN0aW1hIGVzdHJ1dHVyYWxtZW50ZSBvIHRvcG8gZGEgZGlzdHJpYnVpw6fDo28sIGV4YXRhbWVudGUgb25kZSBzZSBjb25jZW50cmEgYSByZW5kYSBkZSBjYXBpdGFsLCBhbHVndWVsIGUgYXBsaWNhw6fDtWVzIGZpbmFuY2VpcmFzLCBvIHRpcG8gZGUgcmVuZGltZW50byBxdWUgbWVub3MgYXBhcmVjZSBxdWFuZG8gYWxndcOpbSDDqSBlbnRyZXZpc3RhZG8gcG9ydGEgYSBwb3J0YSwgZSBxdWUgbWVub3MgcmVhZ2UgYSBtZXRvZG9sb2dpYSBkZSBkZWNsYXJhw6fDo28gZGUgaW1wb3N0byBkZSByZW5kYS4gQSBkaWZlcmVuw6dhIGVudHJlIGFzIGR1YXMgZm9udGVzIMOpIGdyaXRhbnRlOiBwZWxhIFBOQUQsIG8gY3Jlc2NpbWVudG8gcmVhbCBhY3VtdWxhZG8gZG8gMSUgbWFpcyByaWNvIGZvaSBkZSBhcGVuYXMgNSwxJSwgZW5xdWFudG8gcGVsb3MgZGFkb3MgZGUgSW1wb3N0byBkZSBSZW5kYSBkYSBSZWNlaXRhIEZlZGVyYWwsIG8gY3Jlc2NpbWVudG8gZG8gMCwxJSBtYWlzIHJpY28gY2hlZ291IGEgcXVhc2UgNDklIG5vIG1lc21vIHRpcG8gZGUgcGVyw61vZG8sIHF1YXNlIGRleiB2ZXplcyBtYWlzLiBFc3NhIGRpc2NyZXDDom5jaWEgbsOjbyDDqSBnZW5lcmFsaXphZGE6IHF1YW5kbyBzZSBvbGhhIGEgbcOpZGlhIGdlcmFsIGRhIHBvcHVsYcOnw6NvLCBhcyBkdWFzIGZvbnRlcyBjb252ZXJnZW0gYmFzdGFudGUsIGNvbSBjcmVzY2ltZW50byBkZSAxMyw4JSBwZWxhIFBOQUQgZSA5LDglIHBlbGEgUmVjZWl0YSBGZWRlcmFsLCBvIHF1ZSBtb3N0cmEgcXVlIG8gR2luaSBuw6NvIGVycmEgZW0gdG9kbyBsdWdhciwgZSBzaW0gZXNwZWNpZmljYW1lbnRlIG5vIHRvcG8gZGEgZGlzdHJpYnVpw6fDo28sIHF1ZSDDqSBqdXN0YW1lbnRlIG9uZGUgbW9yYSBhIHJlbmRhIG1haXMgcHJvdGVnaWRhIGRvIGPDom1iaW8uDQoNCioqR3LDoWZpY28gMy40IOKAlCBDcmVzY2ltZW50byByZWFsIGFjdW11bGFkbyBkYSByZW5kYTogdG9wbyDDlyBtw6lkaWEsIHBvciBmb250ZSBkZSBkYWRvKioNCg0KYGBge3IgcDMtcG5hZC1yZWNlaXRhfQ0KZm9udGVzX2RpdmVyZ2VuY2lhIDwtIGMoDQogICJQTkFEIENvbnTDrW51YTxicj4oMjAxMuKAkzIwMjMpIiwNCiAgIlJlY2VpdGEgRmVkZXJhbCAvIElSUEY8YnI+KDIwMTfigJMyMDIzKSINCikNCnRvcG9fZGl2ZXJnZW5jaWEgIDwtIGMoNS4xLCA0OC44KSAgICMgJSDigJQgMSUgbWFpcyByaWNvIChQTkFEKSBlIDAsMSUgbWFpcyByaWNvIChJUlBGKQ0KbWVkaWFfZGl2ZXJnZW5jaWEgPC0gYygxMy44LCA5LjgpICAgIyAlIOKAlCBtw6lkaWEgZ2VyYWwgZGEgcG9wdWxhw6fDo28sIHBvciBmb250ZQ0KDQpncmFmaWNvX2RpdmVyZ2VuY2lhIDwtIGhpZ2hjaGFydCgpICU+JQ0KICBoY19jaGFydCh0eXBlID0gImNvbHVtbiIsIGFuaW1hdGlvbiA9IEZBTFNFKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGZvbnRlc19kaXZlcmdlbmNpYSwgdGl0bGUgPSBsaXN0KHRleHQgPSBOVUxMKSkgJT4lDQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIkNyZXNjaW1lbnRvIHJlYWwgYWN1bXVsYWRvICglKSIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpDQogICkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSAgPSAiVG9wbyBkYSBkaXN0cmlidWnDp8OjbyAoMSUgLyAwLDElIG1haXMgcmljbykiLA0KICAgIGRhdGEgID0gdG9wb19kaXZlcmdlbmNpYSwNCiAgICBjb2xvciA9IElCX0FaVUxfQkFTRQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgID0gIk3DqWRpYSBnZXJhbCBkYSBwb3B1bGHDp8OjbyIsDQogICAgZGF0YSAgPSBtZWRpYV9kaXZlcmdlbmNpYSwNCiAgICBjb2xvciA9IElCX0FNQVJFTE8NCiAgKSAlPiUNCiAgaGNfcGxvdE9wdGlvbnMoDQogICAgY29sdW1uID0gbGlzdCgNCiAgICAgIGdyb3VwaW5nID0gVFJVRSwgZ3JvdXBQYWRkaW5nID0gMC4xNSwgcG9pbnRQYWRkaW5nID0gMC4wOCwgYm9yZGVyV2lkdGggPSAwLA0KICAgICAgZGF0YUxhYmVscyA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGZvcm1hdCA9ICJ7eX0lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8sIHRleHRPdXRsaW5lID0gIm5vbmUiLCBmb250U2l6ZSA9ICIxMXB4IikpDQogICAgKQ0KICApICU+JQ0KICBoY190b29sdGlwKHNoYXJlZCA9IFRSVUUsIHZhbHVlU3VmZml4ID0gIiUiKSAlPiUNCiAgaGNfZm9ybWF0YXJfYmFzZSgNCiAgICB0aXR1bG8gICAgPSAiRHVhcyBmYWl4YXM6IFBOQUQgeCBSZWNlaXRhIEZlZGVyYWwiLA0KICAgIHN1YnRpdHVsbyA9ICJDcmVzY2ltZW50byByZWFsIGFjdW11bGFkbyBkYSByZW5kYSDigJQgdG9wbyB2cy4gbcOpZGlhLCBwb3IgZm9udGUgZGUgZGFkby4gTyB0b3BvIGNhcHRhIHJlbmRhIGRlIGNhcGl0YWwgcXVlIG8gUE5BRCBuw6NvIHbDqiBiZW0g4oCUIGEgbWVzbWEgcmVuZGEgcXVlIHNlIHByb3RlZ2UgZG8gY8OibWJpbyIsDQogICAgZm9udGUgICAgID0gIkZvbnRlczogSUJHRS9QTkFEIENvbnTDrW51YTsgUmVjZWl0YSBGZWRlcmFsIChJUlBGKSB2aWEgT2JzZXJ2YXTDs3JpbyBkZSBQb2zDrXRpY2EgRmlzY2FsIEZHVi9JQlJFLiBFbGFib3Jhw6fDo28gcHLDs3ByaWEgSWJNYWNybyBCSC4iDQogICkNCg0KZ3JhZmljb19kaXZlcmdlbmNpYQ0KYGBgDQoNCiMjIDMuMyBSZW5kYSBtw6lkaWEgcmVhbCBlIGPDom1iaW8NCg0KRW0gbWVpbyBhIGlzc28sIMOpIHZpw6F2ZWwgcmVhbGl6YXIgdW1hIGludmVzdGlnYcOnw6NvIGRlc2NhcnRhbmRvIHVtIHBvdWNvIGEgbcOpdHJpY2EgZGUgZGVzaWd1YWxkYWRlIGUgYW5hbGlzYW5kbyBkaXJldGFtZW50ZSBhIHJlbmRhIG3DqWRpYSwgYSBmaW0gZGUgZXN0YWJlbGVjZXIgdW1hIHJlbGHDp8OjbyBkaXJldGEgY29tIG8gY8OibWJpby4gTyByZXN1bHRhZG8sIG5vdmFtZW50ZSwgw6kgbnVsbywgcXVhc2UgaW52ZXJzbyBlbSBhbGd1bnMgYW5vcywgZnJhY2EgZSBlc3RhdGlzdGljYW1lbnRlIG7Do28gc2lnbmlmaWNhdGl2YSBkZW1haXMgcGFyYSBzdXN0ZW50YXIgcXVhbHF1ZXIgbGVpdHVyYSBzb2JyZSBhIGRpcmXDp8OjbyBkYSByZWxhw6fDo28uIE8gcXVlIGVzc2UgcmVzdWx0YWRvIHJlZm9yw6dhIMOpIHF1ZSBvIHByb2JsZW1hIG7Do28gZXN0w6EgYXBlbmFzIG5vIMONbmRpY2UgZGUgR2luaSBjb21vIG3DqXRyaWNhIGRlIGRlc2lndWFsZGFkZSwgbWFzIG5vIHByw7NwcmlvIG7DrXZlbCBkZSBhZ3JlZ2HDp8OjbzogcXVhbmRvIHNlIG9saGEgbyBwYcOtcyBpbnRlaXJvIHNvbWFkbywgc2VqYSBwZWxhIMOzdGljYSBkYSBkaXN0cmlidWnDp8Ojbywgc2VqYSBwZWxhIMOzdGljYSBkbyBuw612ZWwgZGUgcmVuZGEsIG8gZWZlaXRvIGRvIGPDom1iaW8gc2UgcGVyZGUgbmEgbcOpZGlhLg0KDQoqKkdyw6FmaWNvIDMuNSDigJQgUmVuZGEgbcOpZGlhIHJlYWwgw5cgY8OibWJpbyoqDQoNCmBgYHtyIHAzLXJlbmRhLWNhbWJpb30NCmFub3NfcmVuZGEgICA8LSBjKDIwMTIsIDIwMTQsIDIwMTksIDIwMjAsIDIwMjEsIDIwMjIsIDIwMjMsIDIwMjQpDQpyZW5kYV9tZWRpYSAgPC0gYygyODM3LCAyOTc0LCAyOTU4LCAyODU2LCAyNzA5LCAyNzY0LCAyOTcxLCAzMDU3KQ0KY2FtYmlvX3JlbmRhIDwtIGMoMS45NSwgMi4zNSwgNC4wMywgNS4yMCwgNS41OCwgNS4yMiwgNC44NCwgNS40OCkNCg0Kcl9yZW5kYSAgPC0gY29yKHJlbmRhX21lZGlhLCBjYW1iaW9fcmVuZGEpDQpyMl9yZW5kYSA8LSBzdW1tYXJ5KGxtKHJlbmRhX21lZGlhIH4gY2FtYmlvX3JlbmRhKSkkci5zcXVhcmVkDQoNCmdyYWZpY29fcmVuZGFfY2FtYmlvIDwtIGhpZ2hjaGFydCgpICU+JQ0KICBoY19jaGFydCh0eXBlID0gImxpbmUiLCBhbmltYXRpb24gPSBGQUxTRSkgJT4lDQogIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBhcy5jaGFyYWN0ZXIoYW5vc19yZW5kYSksIHRpdGxlID0gbGlzdCh0ZXh0ID0gTlVMTCkpICU+JQ0KICBoY195QXhpc19tdWx0aXBsZXMoDQogICAgbGlzdCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIlJlbmRhIG3DqWRpYSByZWFsIChSJC9tw6pzKSIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0FaVUxfQkFTRSkpLA0KICAgICAgbGFiZWxzID0gbGlzdChzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9BWlVMX0JBU0UpKSwNCiAgICAgIG9wcG9zaXRlID0gRkFMU0UNCiAgICApLA0KICAgIGxpc3QoDQogICAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJDw6JtYmlvIChSJC9VUyQpIiwgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQU1BUkVMTykpLA0KICAgICAgbGFiZWxzID0gbGlzdChzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9BTUFSRUxPKSksDQogICAgICBvcHBvc2l0ZSA9IFRSVUUNCiAgICApDQogICkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJSZW5kYSBtw6lkaWEgcmVhbCAoUiQpIiwgZGF0YSA9IHJlbmRhX21lZGlhLCBjb2xvciA9IElCX0FaVUxfQkFTRSwNCiAgICB5QXhpcyA9IDAsIGxpbmVXaWR0aCA9IDIuNSwgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gMykNCiAgKSAlPiUNCiAgaGNfYWRkX3NlcmllcygNCiAgICBuYW1lID0gIkPDom1iaW8gKFIkL1VTJCkiLCBkYXRhID0gY2FtYmlvX3JlbmRhLCBjb2xvciA9IElCX0FNQVJFTE8sDQogICAgeUF4aXMgPSAxLCBsaW5lV2lkdGggPSAyLjUsIGRhc2hTdHlsZSA9ICJEYXNoIiwgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gMywgc3ltYm9sID0gImRpYW1vbmQiKQ0KICApICU+JQ0KICBoY190b29sdGlwKHNoYXJlZCA9IFRSVUUsIHZhbHVlRGVjaW1hbHMgPSAyKSAlPiUNCiAgaGNfbGVnZW5kKGVuYWJsZWQgPSBUUlVFKSAlPiUNCiAgaGNfZm9ybWF0YXJfYmFzZSgNCiAgICB0aXR1bG8gICAgPSAiUmVuZGEgbcOpZGlhIHJlYWwgeCBDw6JtYmlvIiwNCiAgICBzdWJ0aXR1bG8gPSBzcHJpbnRmKCJyID0gJS4yZiB8IFLCsiA9ICUuMmYuIEFub3MgZGlzcG9uw612ZWlzIG5hIHPDqXJpZSBvZmljaWFsIGRvIElCR0UgKGZhbHRhbSAyMDEzLCAyMDE14oCTMjAxOCBlIDIwMjUpIiwgcl9yZW5kYSwgcjJfcmVuZGEpLA0KICAgIGZvbnRlICAgICA9ICJGb250ZXM6IElCR0UsIFBOQUQgQ29udMOtbnVhIOKAlCBSZW5kaW1lbnRvIGRlIHRvZGFzIGFzIGZvbnRlcyAyMDI0OyBmYXJtbmV3czsgQW51w6FyaW8gSUJHRTsgQmFjZW4gKFNHUyAxKS4gRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICApDQoNCmdyYWZpY29fcmVuZGFfY2FtYmlvDQpgYGANCg0KIyMgMy40IE8gY2FuYWwgZG9zIHByZcOnb3M6IElQQ0EgcG9yIGdydXBvIGUgb3LDp2FtZW50byBmYW1pbGlhcg0KDQpDb21vIGFuYWxpc2FkbywgYSBpZGVpYSDDqSB0ZW50YXIgZW5jb250cmFyIHVtYSByZWxhw6fDo28gZW50cmUgY8OibWJpbyBlIGRlc2lndWFsZGFkZSwgZSBwYXJhIGlzc28gw6kgcHJlY2lzbyB2b2x0YXIgYW8gaW7DrWNpbyBkZXN0ZSB0cmFiYWxobyBlIGJ1c2NhciBub3ZhbWVudGUgbyBpbXBhY3RvIGRvcyBjb21wb25lbnRlcyBtYWlzIGVzcGVjw61maWNvcyBkbyBJUENBLCBwcmluY2lwYWxtZW50ZSBvIGRlIGFsaW1lbnRhw6fDo28uIFZhbGUgbm90YXIgcXVlLCBubyBpbsOtY2lvIGRvIHJlbGF0w7NyaW8sIGEgYW7DoWxpc2UgZW5jb250cm91IHJlc3VsdGFkb3MgZGUgaW1wYWN0byByZWxldmFudGVzIGVudm9sdmVuZG8gdGFtYsOpbSBoYWJpdGHDp8OjbyBlIHRyYW5zcG9ydGUsIGUgcG9yIGlzc28gdGVzdGFtb3MgZGlyZXRhbWVudGUgZXNzZXMgZG9pcyBncnVwb3MgY29udHJhIG8gY8OibWJpbywgdXNhbmRvIG8gbWVzbW8gdGVzdGUgcmlnb3Jvc28gYXBsaWNhZG8gYW8gcmVzdGFudGUgZGVzdGEgcGFydGU6IGEgSGFiaXRhw6fDo28gYXByZXNlbnRvdSBjb3JyZWxhw6fDo28gZnJhY2EgZSBuw6NvIHNpZ25pZmljYXRpdmEgKHIgPSAwLDI2LCBwID0gMCwzOSBuYSB2YXJpYcOnw6NvIGFubyBhIGFubyksIGFzc2ltIGNvbW8gbyBUcmFuc3BvcnRlIChyID0gMCwyMiwgcCA9IDAsNDcpIOKAlCBvIHF1ZSBuw6NvIGludmFsaWRhIGEgcmVsZXbDom5jaWEgZGVzc2VzIGRvaXMgZ3J1cG9zIHBhcmEgbyBjdXN0byBkZSB2aWRhIGVtIGdlcmFsLCBhcGVuYXMgbW9zdHJhIHF1ZSBvIGNhbmFsIGVzcGVjw61maWNvIGRlIHRyYW5zbWlzc8OjbyBkbyBjw6JtYmlvIG7Do28gcGFzc2EgcG9yIGVsZXMgY29tIGEgbWVzbWEgZm9yw6dhLiBBIEFsaW1lbnRhw6fDo28gc2VndWUgc2VuZG8gbyBjb21wb25lbnRlIHF1ZSBtYWlzIHNlIGFwcm94aW1hIGRlIHVtYSByZWxhw6fDo28gcmVhbCBjb20gbyBjw6JtYmlvLCBjb20gciA9IDAsNjggKHAgPSAwLDAwNykgbmEgdmFyaWHDp8OjbyBhbm8gYSBhbm8sIHVtYSBjb3JyZWxhw6fDo28gZm9ydGUgZSBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYXRpdmEuIEUsIGFvIGFkaWNpb25hciBvcyBkYWRvcyBkYSBQZXNxdWlzYSBkZSBPcsOnYW1lbnRvcyBGYW1pbGlhcmVzIGRvIElCR0UsIHVtIGZhdG8gY2F0YWxpemEgYWluZGEgbWFpcyBlc3NlIGNlbsOhcmlvOiBvcyBpdGVucyBlc3NlbmNpYWlzLCBlbnRyZSBlbGVzIGEgYWxpbWVudGHDp8OjbywgdG9tYW0gNzAsNiUgZG8gb3LDp2FtZW50byBkYXMgZmFtw61saWFzIGRlIGJhaXhhIHJlbmRhLCBjb250cmEgNDUsNSUgbmFzIGRlIGFsdGEgcmVuZGEsIG8gcXVlIHNpZ25pZmljYSBxdWUgbyBtZXNtbyByZXBhc3NlIGNhbWJpYWwgaW1wYWN0YSAxLDU1IHZleiBtYWlzIGFzIGZhbcOtbGlhcyBtYWlzIHBvYnJlcyBlLCBvbGhhbmRvIHPDsyBwYXJhIGEgYWxpbWVudGHDp8OjbyBpc29sYWRhbWVudGUsIGVzc2EgZGlmZXJlbsOnYSDDqSBhaW5kYSBtYWlzIGV4dHJlbWEsIGNvbSAyMiwwJSBkbyBvcsOnYW1lbnRvIGRhIGJhaXhhIHJlbmRhIGRlc3RpbmFkb3MgYSBlbGEsIGNvbnRyYSBhcGVuYXMgNyw2JSBuYSBhbHRhIHJlbmRhLCBxdWFzZSB0csOqcyB2ZXplcyBtYWlzIHBlc28uDQoNCmBgYHtyIHAzLWRhZG9zLWlwY2EtZ3J1cG9zfQ0KIyAxLiBDb2xldGEgZGFzIDMgc8OpcmllcyBkZSBJUENBIHBvciBncnVwbyArIGPDom1iaW8sIGRpcmV0byBkbyBCYWNlbg0KZGFkb3NfYmFjZW5fZ3J1cG9zIDwtIHJiY2I6OmdldF9zZXJpZXMoDQogIGMoY2FtYmlvID0gMzY5NywgaXBjYV9hbGltID0gMTYzNSwgaXBjYV9oYWIgPSAxNjM2LCBpcGNhX3RyYW5zcCA9IDE2MzkpLA0KICBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiDQopDQoNCiMgMi4gQWdyZWdhw6fDo28gYW51YWwgKHPDsyBhbm9zIGNvbSBvcyAxMiBtZXNlcyBjb21wbGV0b3MpDQpkZl9ncnVwb3MgPC0gZGFkb3NfYmFjZW5fZ3J1cG9zJGlwY2FfYWxpbSAlPiUNCiAgaW5uZXJfam9pbihkYWRvc19iYWNlbl9ncnVwb3MkaXBjYV9oYWIsIGJ5ID0gImRhdGUiKSAlPiUNCiAgaW5uZXJfam9pbihkYWRvc19iYWNlbl9ncnVwb3MkaXBjYV90cmFuc3AsIGJ5ID0gImRhdGUiKSAlPiUNCiAgaW5uZXJfam9pbihkYWRvc19iYWNlbl9ncnVwb3MkY2FtYmlvLCBieSA9ICJkYXRlIikgJT4lDQogIG11dGF0ZShhbm8gPSB5ZWFyKGRhdGUpKSAlPiUNCiAgZ3JvdXBfYnkoYW5vKSAlPiUNCiAgZmlsdGVyKG4oKSA9PSAxMikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBhbGltZW50YWNhbyA9IChwcm9kKDEgKyBpcGNhX2FsaW0gLyAxMDApIC0gMSkgKiAxMDAsDQogICAgaGFiaXRhY2FvICAgPSAocHJvZCgxICsgaXBjYV9oYWIgLyAxMDApIC0gMSkgKiAxMDAsDQogICAgdHJhbnNwb3J0ZSAgPSAocHJvZCgxICsgaXBjYV90cmFuc3AgLyAxMDApIC0gMSkgKiAxMDAsDQogICAgY2FtYmlvICAgICAgPSBtZWFuKGNhbWJpbywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KYW5vc19ncnVwb3MgPC0gZGZfZ3J1cG9zJGFubw0KDQojIDMuIENvcnJlbGHDp8OjbyBlbSBuw612ZWwgZSBuYSB2YXJpYcOnw6NvIGFubyBhIGFubywgcGFyYSBhcyAzIGNhdGVnb3JpYXMNCnRlc3Rhcl9jYXRlZ29yaWEgPC0gZnVuY3Rpb24oc2VyaWUsIGNhbWJpbykgew0KICBkX3NlcmllICA8LSBkaWZmKHNlcmllKQ0KICBkX2NhbWJpbyA8LSBkaWZmKGNhbWJpbykNCiAgbGlzdCgNCiAgICByX25pdmVsID0gY29yKHNlcmllLCBjYW1iaW8pLA0KICAgIHBfbml2ZWwgPSBzdW1tYXJ5KGxtKHNlcmllIH4gY2FtYmlvKSkkY29lZmZpY2llbnRzWzIsIDRdLA0KICAgIHJfZGVsdGEgPSBjb3IoZF9zZXJpZSwgZF9jYW1iaW8pLA0KICAgIHBfZGVsdGEgPSBzdW1tYXJ5KGxtKGRfc2VyaWUgfiBkX2NhbWJpbykpJGNvZWZmaWNpZW50c1syLCA0XQ0KICApDQp9DQoNCnJlc19hbGltICAgPC0gdGVzdGFyX2NhdGVnb3JpYShkZl9ncnVwb3MkYWxpbWVudGFjYW8sIGRmX2dydXBvcyRjYW1iaW8pDQpyZXNfaGFiICAgIDwtIHRlc3Rhcl9jYXRlZ29yaWEoZGZfZ3J1cG9zJGhhYml0YWNhbywgICBkZl9ncnVwb3MkY2FtYmlvKQ0KcmVzX3RyYW5zcCA8LSB0ZXN0YXJfY2F0ZWdvcmlhKGRmX2dydXBvcyR0cmFuc3BvcnRlLCAgZGZfZ3J1cG9zJGNhbWJpbykNCg0Kcl9hbGltICAgPC0gcmVzX2FsaW0kcl9kZWx0YQ0Kcl9oYWIgICAgPC0gcmVzX2hhYiRyX2RlbHRhDQpyX3RyYW5zcCA8LSByZXNfdHJhbnNwJHJfZGVsdGENCg0KIyA0LiBQb250b3MgZSByZXRhcyBkZSByZWdyZXNzw6NvICh2YXJpYcOnw6NvIGFubyBhIGFubykgcGFyYSBvIEdyw6FmaWNvIDMuNw0KZF9jYW1iaW9fZ3J1cG9zICAgPC0gZGlmZihkZl9ncnVwb3MkY2FtYmlvKQ0KYW5vc19kZWx0YV9ncnVwb3MgPC0gYW5vc19ncnVwb3NbLTFdDQoNCnBvbnRvc19jYXRlZ29yaWEgPC0gZnVuY3Rpb24oc2VyaWUpIHsNCiAgZF9zZXJpZSA8LSBkaWZmKHNlcmllKQ0KICBtYXAoc2VxX2Fsb25nKGRfc2VyaWUpLCBmdW5jdGlvbihpKSB7DQogICAgbGlzdCh4ID0gZF9jYW1iaW9fZ3J1cG9zW2ldLCB5ID0gZF9zZXJpZVtpXSwNCiAgICAgICAgIG5hbWUgPSBhcy5jaGFyYWN0ZXIoYW5vc19kZWx0YV9ncnVwb3NbaV0pKQ0KICB9KQ0KfQ0KDQpyZXRhX2NhdGVnb3JpYSA8LSBmdW5jdGlvbihzZXJpZSkgew0KICBkX3NlcmllIDwtIGRpZmYoc2VyaWUpDQogIGNvZWZzICAgPC0gY29lZihsbShkX3NlcmllIH4gZF9jYW1iaW9fZ3J1cG9zKSkNCiAgbWFwKHJhbmdlKGRfY2FtYmlvX2dydXBvcyksIGZ1bmN0aW9uKHgpIHsNCiAgICBsaXN0KHggPSB4LCB5ID0gdW5uYW1lKGNvZWZzWzFdICsgY29lZnNbMl0gKiB4KSkNCiAgfSkNCn0NCg0KcG9udG9zX2FsaW0gICA8LSBwb250b3NfY2F0ZWdvcmlhKGRmX2dydXBvcyRhbGltZW50YWNhbykNCnBvbnRvc19oYWIgICAgPC0gcG9udG9zX2NhdGVnb3JpYShkZl9ncnVwb3MkaGFiaXRhY2FvKQ0KcG9udG9zX3RyYW5zcCA8LSBwb250b3NfY2F0ZWdvcmlhKGRmX2dydXBvcyR0cmFuc3BvcnRlKQ0KDQpyZXRhX2FsaW0gICA8LSByZXRhX2NhdGVnb3JpYShkZl9ncnVwb3MkYWxpbWVudGFjYW8pDQpyZXRhX2hhYiAgICA8LSByZXRhX2NhdGVnb3JpYShkZl9ncnVwb3MkaGFiaXRhY2FvKQ0KcmV0YV90cmFuc3AgPC0gcmV0YV9jYXRlZ29yaWEoZGZfZ3J1cG9zJHRyYW5zcG9ydGUpDQpgYGANCg0KKipHcsOhZmljbyAzLjYg4oCUIElQQ0EgcG9yIGdydXBvIMOXIGPDom1iaW8qKg0KDQpgYGB7ciBwMy1pcGNhLWdydXBvc30NCnBhaW5lbF9pcGNhX2NhdGVnb3JpYXMgPC0gaGlnaGNoYXJ0KCkgJT4lDQogIGhjX2NoYXJ0KGFuaW1hdGlvbiA9IEZBTFNFKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGFzLmNoYXJhY3Rlcihhbm9zX2dydXBvcyksIHRpdGxlID0gbGlzdCh0ZXh0ID0gTlVMTCkpICU+JQ0KICBoY195QXhpc19tdWx0aXBsZXMoDQogICAgbGlzdCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIklQQ0EgcG9yIGdydXBvICglIGFjdW11bGFkbyBubyBhbm8pIiwgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQ0lOWkFfRVNDVVJPKSksDQogICAgICBsYWJlbHMgPSBsaXN0KHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpLA0KICAgICAgb3Bwb3NpdGUgPSBGQUxTRQ0KICAgICksDQogICAgbGlzdCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIkPDom1iaW8gbcOpZGlvIChSJC9VUyQpIiwgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQU1BUkVMTykpLA0KICAgICAgbGFiZWxzID0gbGlzdChzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9BTUFSRUxPKSksDQogICAgICBvcHBvc2l0ZSA9IFRSVUUNCiAgICApDQogICkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJDw6JtYmlvIChSJC9VUyQpIiwgdHlwZSA9ICJjb2x1bW4iLA0KICAgIGRhdGEgPSByb3VuZChkZl9ncnVwb3MkY2FtYmlvLCAyKSwgY29sb3IgPSBJQl9BTUFSRUxPLCB5QXhpcyA9IDEsIGJvcmRlcldpZHRoID0gMCwgb3BhY2l0eSA9IDAuNDUNCiAgKSAlPiUNCiAgaGNfYWRkX3NlcmllcygNCiAgICBuYW1lID0gIkFsaW1lbnRhw6fDo28gZSBiZWJpZGFzIChzaWduaWZpY2F0aXZvKSIsIHR5cGUgPSAibGluZSIsDQogICAgZGF0YSA9IHJvdW5kKGRmX2dydXBvcyRhbGltZW50YWNhbywgMiksIGNvbG9yID0gSUJfQVpVTF9CQVNFLCB5QXhpcyA9IDAsDQogICAgbGluZVdpZHRoID0gMy41LCBkYXNoU3R5bGUgPSAiU29saWQiLCBtYXJrZXIgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCByYWRpdXMgPSA0LCBzeW1ib2wgPSAiY2lyY2xlIikNCiAgKSAlPiUNCiAgaGNfYWRkX3NlcmllcygNCiAgICBuYW1lID0gIkhhYml0YcOnw6NvIChucykiLCB0eXBlID0gImxpbmUiLA0KICAgIGRhdGEgPSByb3VuZChkZl9ncnVwb3MkaGFiaXRhY2FvLCAyKSwgY29sb3IgPSBJQl9DSU5aQV9DTEFSTywgeUF4aXMgPSAwLA0KICAgIGxpbmVXaWR0aCA9IDEuNSwgZGFzaFN0eWxlID0gIkRhc2giLCBtYXJrZXIgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCByYWRpdXMgPSAyLCBzeW1ib2wgPSAic3F1YXJlIiksDQogICAgb3BhY2l0eSA9IDAuOA0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiVHJhbnNwb3J0ZSAobnMpIiwgdHlwZSA9ICJsaW5lIiwNCiAgICBkYXRhID0gcm91bmQoZGZfZ3J1cG9zJHRyYW5zcG9ydGUsIDIpLCBjb2xvciA9IElCX0NJTlpBX0NMQVJPLCB5QXhpcyA9IDAsDQogICAgbGluZVdpZHRoID0gMS41LCBkYXNoU3R5bGUgPSAiRG90IiwgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gMiwgc3ltYm9sID0gImRpYW1vbmQiKSwNCiAgICBvcGFjaXR5ID0gMC44DQogICkgJT4lDQogIGhjX3Rvb2x0aXAoc2hhcmVkID0gVFJVRSwgdmFsdWVEZWNpbWFscyA9IDIpICU+JQ0KICBoY19sZWdlbmQoZW5hYmxlZCA9IFRSVUUpICU+JQ0KICBoY19mb3JtYXRhcl9iYXNlKA0KICAgIHRpdHVsbyAgICA9ICJPIGPDom1iaW8gdHJhbnNtaXRlIHZpYSBwcmXDp29zIOKAlCBtYXMgc8OzIHBhcmEgdW0gZ3J1cG8iLA0KICAgIHN1YnRpdHVsbyA9ICJBenVsID0gY29ycmVsYcOnw6NvIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSAoQWxpbWVudGHDp8Ojbyk7IGNpbnphID0gbsOjbyBzaWduaWZpY2F0aXZhIChIYWJpdGHDp8OjbyBlIFRyYW5zcG9ydGUpLiBDw6JtYmlvIGVtIGNvbHVuYSAoZWl4byBkaXJlaXRvKSwgSVBDQSBlbSBsaW5oYSAoZWl4byBlc3F1ZXJkbykuIiwNCiAgICBmb250ZSAgICAgPSAiRm9udGU6IEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIChTR1MgMzY5NywgMTYzNSwgMTYzNiwgMTYzOSkuIEVsYWJvcmHDp8OjbyBwcsOzcHJpYSBJYk1hY3JvIEJILiINCiAgKQ0KDQpwYWluZWxfaXBjYV9jYXRlZ29yaWFzDQpgYGANCg0KKipHcsOhZmljbyAzLjcg4oCUIFZhcmlhw6fDo28gZG8gY8OibWJpbyDDlyB2YXJpYcOnw6NvIGRvIElQQ0EgcG9yIGNhdGVnb3JpYSoqDQoNCmBgYHtyIHAzLXJlZ3Jlc3Nhby1ncnVwb3N9DQpwYWluZWxfcmVncmVzc2FvX2NhdGVnb3JpYXMgPC0gaGlnaGNoYXJ0KCkgJT4lDQogIGhjX2NoYXJ0KHR5cGUgPSAic2NhdHRlciIpICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiQWxpbWVudGHDp8OjbyAocG9udG9zKSIsDQogICAgZGF0YSA9IHBvbnRvc19hbGltLA0KICAgIGNvbG9yID0gSUJfQU1BUkVMTywNCiAgICBtYXJrZXIgPSBsaXN0KHN5bWJvbCA9ICJjaXJjbGUiLCByYWRpdXMgPSA1KSwNCiAgICBzaG93SW5MZWdlbmQgPSBGQUxTRQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSBzcHJpbnRmKCJBbGltZW50YcOnw6NvIOKAlCByID0gJS4yZiAoc2lnbmlmaWNhdGl2bykiLCByX2FsaW0pLA0KICAgIGRhdGEgPSByZXRhX2FsaW0sDQogICAgdHlwZSA9ICJsaW5lIiwNCiAgICBjb2xvciA9IElCX0FNQVJFTE8sDQogICAgbGluZVdpZHRoID0gNCwNCiAgICBkYXNoU3R5bGUgPSAiU29saWQiLA0KICAgIG1hcmtlciA9IGxpc3QoZW5hYmxlZCA9IEZBTFNFKSwNCiAgICBlbmFibGVNb3VzZVRyYWNraW5nID0gRkFMU0UNCiAgKSAlPiUNCiAgaGNfYWRkX3NlcmllcygNCiAgICBuYW1lID0gIkhhYml0YcOnw6NvIChwb250b3MpIiwNCiAgICBkYXRhID0gcG9udG9zX2hhYiwNCiAgICBjb2xvciA9IElCX0NJTlpBX0NMQVJPLA0KICAgIG1hcmtlciA9IGxpc3Qoc3ltYm9sID0gInNxdWFyZSIsIHJhZGl1cyA9IDQpLA0KICAgIHNob3dJbkxlZ2VuZCA9IEZBTFNFDQogICkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9IHNwcmludGYoIkhhYml0YcOnw6NvIOKAlCByID0gJS4yZiAobnMpIiwgcl9oYWIpLA0KICAgIGRhdGEgPSByZXRhX2hhYiwNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIGNvbG9yID0gSUJfQ0lOWkFfQ0xBUk8sDQogICAgbGluZVdpZHRoID0gMiwNCiAgICBkYXNoU3R5bGUgPSAiRGFzaCIsDQogICAgbWFya2VyID0gbGlzdChlbmFibGVkID0gRkFMU0UpLA0KICAgIGVuYWJsZU1vdXNlVHJhY2tpbmcgPSBGQUxTRQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiVHJhbnNwb3J0ZSAocG9udG9zKSIsDQogICAgZGF0YSA9IHBvbnRvc190cmFuc3AsDQogICAgY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8sDQogICAgbWFya2VyID0gbGlzdChzeW1ib2wgPSAiZGlhbW9uZCIsIHJhZGl1cyA9IDQpLA0KICAgIHNob3dJbkxlZ2VuZCA9IEZBTFNFDQogICkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9IHNwcmludGYoIlRyYW5zcG9ydGUg4oCUIHIgPSAlLjJmIChucykiLCByX3RyYW5zcCksDQogICAgZGF0YSA9IHJldGFfdHJhbnNwLA0KICAgIHR5cGUgPSAibGluZSIsDQogICAgY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8sDQogICAgbGluZVdpZHRoID0gMiwNCiAgICBkYXNoU3R5bGUgPSAiRG90IiwNCiAgICBtYXJrZXIgPSBsaXN0KGVuYWJsZWQgPSBGQUxTRSksDQogICAgZW5hYmxlTW91c2VUcmFja2luZyA9IEZBTFNFDQogICkgJT4lDQogIGhjX3hBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIlZhcmlhw6fDo28gZG8gY8OibWJpbyAoUiQvVVMkLCBhbm8gYSBhbm8pIikpICU+JQ0KICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJWYXJpYcOnw6NvIGRvIElQQ0EgZGEgY2F0ZWdvcmlhIChwLnAuLCBhbm8gYSBhbm8pIikpICU+JQ0KICBoY19mb3JtYXRhcl9iYXNlKA0KICAgIHRpdHVsbyA9ICJBbGltZW50YcOnw6NvIHJlYWdlIGFvIGPDom1iaW8gbXVpdG8gbWFpcyBkbyBxdWUgSGFiaXRhw6fDo28gZSBUcmFuc3BvcnRlIiwNCiAgICBzdWJ0aXR1bG8gPSAiVmFyaWHDp8OjbyBhbm8gYSBhbm86IGPDom1iaW8geCBJUENBIHBvciBjYXRlZ29yaWEgKDIwMTPigJMyMDI1KSIsDQogICAgZm9udGUgPSAiRm9udGU6IEJhY2VuIChTR1MgMzY5NykgZSBJQkdFIChTR1MgMTYzNSwgMTYzNiwgMTYzOSkiDQogICkNCg0KcGFpbmVsX3JlZ3Jlc3Nhb19jYXRlZ29yaWFzDQpgYGANCg0KKipHcsOhZmljbyAzLjgg4oCUIENvcnJlbGHDp8OjbyBkZSBjYWRhIGNhdGVnb3JpYSBkbyBJUENBIGNvbSBvIGPDom1iaW8qKg0KDQpgYGB7ciBwMy1jb3JyZWxhY2FvLWdydXBvc30NCmNhdGVnb3JpYXNfaXBjYSA8LSBjKCJBbGltZW50YcOnw6NvIiwgIkhhYml0YcOnw6NvIiwgIlRyYW5zcG9ydGUiKQ0Kcl9kZWx0YV9jYXRlZ29yaWFzIDwtIGMocmVzX2FsaW0kcl9kZWx0YSwgcmVzX2hhYiRyX2RlbHRhLCByZXNfdHJhbnNwJHJfZGVsdGEpDQpwX2RlbHRhX2NhdGVnb3JpYXMgPC0gYyhyZXNfYWxpbSRwX2RlbHRhLCByZXNfaGFiJHBfZGVsdGEsIHJlc190cmFuc3AkcF9kZWx0YSkNCnBhaW5lbF9jb21wYXJhY2FvX2NhdGVnb3JpYXMgPC0gaGlnaGNoYXJ0KCkgJT4lDQogIGhjX2NoYXJ0KHR5cGUgPSAiY29sdW1uIiwgYW5pbWF0aW9uID0gRkFMU0UpICU+JQ0KICBoY194QXhpcyhjYXRlZ29yaWVzID0gY2F0ZWdvcmlhc19pcGNhLCB0aXRsZSA9IGxpc3QodGV4dCA9IE5VTEwpKSAlPiUNCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiciAodmFyaWHDp8OjbyBhbm8gYSBhbm8geCBjw6JtYmlvKSIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpKSAlPiUNCiAgaGNfYWRkX3NlcmllcygNCiAgICBuYW1lID0gIkNvcnJlbGHDp8OjbyBjb20gbyBjw6JtYmlvICh2YXJpYcOnw6NvIGFubyBhIGFubykiLA0KICAgIGRhdGEgPSBtYXAoc2VxX2Fsb25nKGNhdGVnb3JpYXNfaXBjYSksIGZ1bmN0aW9uKGkpIHsNCiAgICAgIGxpc3QoeSA9IHJfZGVsdGFfY2F0ZWdvcmlhc1tpXSwNCiAgICAgICAgICAgY29sb3IgPSBpZiAocF9kZWx0YV9jYXRlZ29yaWFzW2ldIDwgMC4wNSkgSUJfQVpVTF9CQVNFIGVsc2UgSUJfQ0lOWkFfQ0xBUk8pDQogICAgfSksDQogICAgZGF0YUxhYmVscyA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGZvcm1hdCA9ICJ7eTouMmZ9IiwNCiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQ0lOWkFfRVNDVVJPLCB0ZXh0T3V0bGluZSA9ICJub25lIikpDQogICkgJT4lDQogIGhjX2xlZ2VuZChlbmFibGVkID0gRkFMU0UpICU+JQ0KICBoY19mb3JtYXRhcl9iYXNlKA0KICAgIHRpdHVsbyAgICA9ICJTw7MgQWxpbWVudGHDp8OjbyByZWFnZSBhbyBjw6JtYmlvIGRlIGZvcm1hIHJvYnVzdGEiLA0KICAgIHN1YnRpdHVsbyA9IHNwcmludGYoIkF6dWwgPSBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYXRpdm8gKHA8MCwwNSkuIEFsaW1lbnRhw6fDo286IHI9JS4yZiAocD0lLjNmKTsgSGFiaXRhw6fDo286IHI9JS4yZiAocD0lLjNmKTsgVHJhbnNwb3J0ZTogcj0lLjJmIChwPSUuM2YpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICByZXNfYWxpbSRyX2RlbHRhLCByZXNfYWxpbSRwX2RlbHRhLCByZXNfaGFiJHJfZGVsdGEsIHJlc19oYWIkcF9kZWx0YSwgcmVzX3RyYW5zcCRyX2RlbHRhLCByZXNfdHJhbnNwJHBfZGVsdGEpLA0KICAgIGZvbnRlICAgICA9ICJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwgKFNHUyAzNjk3LCAxNjM1LCAxNjM2LCAxNjM5KS4gRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICApDQoNCnBhaW5lbF9jb21wYXJhY2FvX2NhdGVnb3JpYXMNCmBgYA0KDQoqKkdyw6FmaWNvIDMuOSDigJQgUGVzbyBkZSBjYWRhIGNhdGVnb3JpYSBubyBvcsOnYW1lbnRvIGZhbWlsaWFyIChQT0YpKioNCg0KYGBge3IgcDMtcG9mLWdydXBvc30NCmNhdGVnb3JpYXNfaXBjYSA8LSBjKCJBbGltZW50YcOnw6NvIiwgIkhhYml0YcOnw6NvIiwgIlRyYW5zcG9ydGUiKQ0KcG9mX2JhaXhhX3JlbmRhIDwtIGMoMjIuMCwgMzkuMiwgOS40KSAgICMgQWxpbWVudGHDp8OjbywgSGFiaXRhw6fDo28sIFRyYW5zcG9ydGUNCnBvZl9hbHRhX3JlbmRhICA8LSBjKDcuNiwgMjIuNiwgMTUuMykNCg0KcGFpbmVsX3BvZl9jYXRlZ29yaWFzIDwtIGhpZ2hjaGFydCgpICU+JQ0KICBoY19jaGFydCh0eXBlID0gImNvbHVtbiIsIGFuaW1hdGlvbiA9IEZBTFNFKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGNhdGVnb3JpYXNfaXBjYSwgdGl0bGUgPSBsaXN0KHRleHQgPSBOVUxMKSkgJT4lDQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIiUgZG8gb3LDp2FtZW50byBmYW1pbGlhciIsIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTykpLCANCiAgICBtYXggPSA0NQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiQXTDqSBSJDEuOTA4IChiYWl4YSByZW5kYSkiLCANCiAgICBkYXRhID0gcG9mX2JhaXhhX3JlbmRhLCANCiAgICBjb2xvciA9IElCX0FaVUxfQkFTRQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiTWFpcyBkZSBSJDIzLjg1MCAoYWx0YSByZW5kYSkiLCANCiAgICBkYXRhID0gcG9mX2FsdGFfcmVuZGEsIA0KICAgIGNvbG9yID0gSUJfQU1BUkVMTw0KICApICU+JQ0KICBoY19wbG90T3B0aW9ucygNCiAgICBjb2x1bW4gPSBsaXN0KA0KICAgICAgZ3JvdXBpbmcgPSBUUlVFLCANCiAgICAgIGdyb3VwUGFkZGluZyA9IDAuMTUsIA0KICAgICAgcG9pbnRQYWRkaW5nID0gMC4wOCwgDQogICAgICBib3JkZXJXaWR0aCA9IDAsDQogICAgICBkYXRhTGFiZWxzID0gbGlzdCgNCiAgICAgICAgZW5hYmxlZCA9IFRSVUUsIA0KICAgICAgICBmb3JtYXQgPSAie3l9JSIsDQogICAgICAgIHN0eWxlID0gbGlzdChjb2xvciA9IElCX0NJTlpBX0VTQ1VSTywgdGV4dE91dGxpbmUgPSAibm9uZSIsIGZvbnRTaXplID0gIjExcHgiKQ0KICAgICAgKQ0KICAgICkNCiAgKSAlPiUNCiAgaGNfdG9vbHRpcChzaGFyZWQgPSBUUlVFLCB2YWx1ZVN1ZmZpeCA9ICIlIikgJT4lDQogIGhjX2Zvcm1hdGFyX2Jhc2UoDQogICAgdGl0dWxvICAgID0gIk9uZGUgY2FkYSBjYXRlZ29yaWEgcGVzYSBtYWlzIG5vIG9yw6dhbWVudG8iLA0KICAgIHN1YnRpdHVsbyA9ICJBbGltZW50YcOnw6NvIGUgSGFiaXRhw6fDo28gcGVzYW0gbWFpcyBuYSBiYWl4YSByZW5kYTsgVHJhbnNwb3J0ZSBpbnZlcnRlIGUgcGVzYSBtYWlzIG5hIGFsdGEgcmVuZGEiLA0KICAgIGZvbnRlICAgICA9ICJGb250ZTogSUJHRSwgUGVzcXVpc2EgZGUgT3LDp2FtZW50b3MgRmFtaWxpYXJlcyAoUE9GKSINCiAgKQ0KDQpwYWluZWxfcG9mX2NhdGVnb3JpYXMNCmBgYA0KDQojIyAzLjUgTyBoaWF0byBkZSBpbmZsYcOnw6NvIGVudHJlIGZhaXhhcyBkZSByZW5kYQ0KDQpFc3NhIG1lc21hIGzDs2dpY2Egc2UgY29uZmlybWEsIGRlIGZvcm1hIGFpbmRhIG1haXMgZGlyZXRhLCBxdWFuZG8gc2Ugb2xoYSBwYXJhIHVtIGdhcCBkZSBpbmZsYcOnw6NvIGVudHJlIGZhaXhhcyBkZSByZW5kYSBtZWRpZGFzIHBlbG8gSW5kaWNhZG9yIElwZWEgZGUgSW5mbGHDp8OjbyBwb3IgRmFpeGEgZGUgUmVuZGEsIHF1ZSDDqSBvIGFjaGFkbyBtYWlzIGZvcnRlIGRlIHRvZGEgZXN0YSBwYXJ0ZS4gQXNzaW0gY29tbyBubyBjYXNvIGRhIGFsaW1lbnRhw6fDo28gZGlzY3V0aWRvIGFjaW1hLCBvIG7DrXZlbCBuw6NvIHNlIHJlbGFjaW9uYSBjb20gbyBjw6JtYmlvLCBtYXMgYSB2YXJpYcOnw6NvIGFubyBhIGFubyBkbyBoaWF0byBlbnRyZSBhIGluZmxhw6fDo28gZGEgUmVuZGEgTXVpdG8gQmFpeGEgZSBkYSBSZW5kYSBBbHRhIHRlbSBjb3JyZWxhw6fDo28gZm9ydGUgZSBzaWduaWZpY2F0aXZhIGNvbSBhIHZhcmlhw6fDo28gZG8gY8OibWJpbywgZGUgciA9IDAsNzMgKHAgPSAwLDAwNSk6IHF1YW5kbyBvIGPDom1iaW8gYWNlbGVyYSwgYSBpbmZsYcOnw6NvIGRvcyBtYWlzIHBvYnJlcyBhY2VsZXJhIG1haXMgZG8gcXVlIGEgZG9zIG1haXMgcmljb3MsIGUgbyBnYXAgZW50cmUgb3MgZG9pcyBhdW1lbnRhIHJlZm9yw6dhbmRvLCBjb20gdW0gZGFkbyBhaW5kYSBtYWlzIGRpcmV0bywgbyBtZXNtbyBjYW5hbCBkZSBwcmXDp29zIGrDoSBpZGVudGlmaWNhZG8gYXRyYXbDqXMgZG8gSVBDQSBkZSBhbGltZW50YcOnw6NvLg0KDQoqKkdyw6FmaWNvIDMuMTAg4oCUIEhpYXRvIGRlIGluZmxhw6fDo28gZW50cmUgYSBSZW5kYSBNdWl0byBCYWl4YSBlIGEgUmVuZGEgQWx0YSDDlyBjw6JtYmlvKioNCg0KYGBge3IgcDMtaGlhdG99DQojIEluZmxhw6fDo28gYWN1bXVsYWRhIGVtIDEyIG1lc2VzLCB2YWxvciBkZSBkZXplbWJybyBkZSBjYWRhIGFubywNCiMgMjAxMi0yMDI1LCBwYXJhIFJlbmRhIE11aXRvIEJhaXhhIGUgUmVuZGEgQWx0YS4gRm9udGU6IElwZWEsIEdydXBvDQojIGRlIENvbmp1bnR1cmEvRGltYWMg4oCUIEluZGljYWRvciBJcGVhIGRlIEluZmxhw6fDo28gcG9yIEZhaXhhIGRlIFJlbmRhDQojIChwbGFuaWxoYSBtZW5zYWwgIkFjdW11bGFkbyAxMiBtZXNlcyIsIGVkacOnw6NvIGZldi8yMDI2KS4NCnJlbmRhX211aXRvX2JhaXhhIDwtIGMoNy4wNCwgNS42OSwgNi41NiwgMTIuMDcsIDcuMDEsIDIuMTYsIDMuMzcsIDQuNDIsIDYuMjIsIDEwLjA4LCA2LjM1LCAzLjI3LCA0LjkxLCAzLjgxKQ0KcmVuZGFfYWx0YSAgICAgICAgPC0gYyg0LjkwLCA1Ljk5LCA1Ljk2LCAxMC4xOSwgNi4yMSwgMy42OSwgMy45MCwgNC4xOCwgMi43NCwgOS41NCwgNi44MywgNi4yMiwgNC40MywgNC43MikNCmhpYXRvX3JlbmRhICAgICAgICA8LSByZW5kYV9tdWl0b19iYWl4YSAtIHJlbmRhX2FsdGENCg0KZF9jYW1iaW9faGlhdG8gPC0gZGlmZihjYW1iaW8pDQpkX2hpYXRvICAgICAgICA8LSBkaWZmKGhpYXRvX3JlbmRhKQ0KYW5vc19kZWx0YV9oaWF0byA8LSBhbm9zX2dpbmlbLTFdDQpjYW1iaW9fYWx0b19oaWF0byA8LSBjYW1iaW9bLTFdID49IDUuMDANCg0KbW9kZWxvX2hpYXRvIDwtIGxtKGRfaGlhdG8gfiBkX2NhbWJpb19oaWF0bykNCnJfaGlhdG8gIDwtIGNvcihkX2NhbWJpb19oaWF0bywgZF9oaWF0bykNCnIyX2hpYXRvIDwtIHN1bW1hcnkobW9kZWxvX2hpYXRvKSRyLnNxdWFyZWQNCnBfaGlhdG8gIDwtIHN1bW1hcnkobW9kZWxvX2hpYXRvKSRjb2VmZmljaWVudHNbMiwgNF0NCg0KcG9udG9zX2hpYXRvIDwtIG1hcChzZXFfYWxvbmcoYW5vc19kZWx0YV9oaWF0byksIGZ1bmN0aW9uKGkpIHsNCiAgbGlzdCgNCiAgICB4ID0gZF9jYW1iaW9faGlhdG9baV0sIHkgPSBkX2hpYXRvW2ldLCBuYW1lID0gYXMuY2hhcmFjdGVyKGFub3NfZGVsdGFfaGlhdG9baV0pLA0KICAgIG1hcmtlciA9IGlmIChjYW1iaW9fYWx0b19oaWF0b1tpXSkgew0KICAgICAgbGlzdChmaWxsQ29sb3IgPSBJQl9BTUFSRUxPLCByYWRpdXMgPSA3LCBzeW1ib2wgPSAiZGlhbW9uZCIsIGxpbmVXaWR0aCA9IDApDQogICAgfSBlbHNlIHsNCiAgICAgIGxpc3QoZmlsbENvbG9yID0gSUJfQVpVTF9CQVNFLCByYWRpdXMgPSA1LCBzeW1ib2wgPSAiY2lyY2xlIikNCiAgICB9DQogICkNCn0pDQoNCmxpbmhhX2hpYXRvIDwtIGxpc3QoDQogIGxpc3QoeCA9IG1pbihkX2NhbWJpb19oaWF0byksIHkgPSBwcmVkaWN0KG1vZGVsb19oaWF0bywgZGF0YS5mcmFtZShkX2NhbWJpb19oaWF0byA9IG1pbihkX2NhbWJpb19oaWF0bykpKSksDQogIGxpc3QoeCA9IG1heChkX2NhbWJpb19oaWF0byksIHkgPSBwcmVkaWN0KG1vZGVsb19oaWF0bywgZGF0YS5mcmFtZShkX2NhbWJpb19oaWF0byA9IG1heChkX2NhbWJpb19oaWF0bykpKSkNCikNCg0KcGFpbmVsX2hpYXRvIDwtIGhpZ2hjaGFydCgpICU+JQ0KICBoY19jaGFydCh0eXBlID0gInNjYXR0ZXIiLCBhbmltYXRpb24gPSBGQUxTRSkgJT4lDQogIGhjX2FkZF9zZXJpZXMoDQogICAgbmFtZSA9ICJBbm8iLCBkYXRhID0gcG9udG9zX2hpYXRvLCBjb2xvciA9IElCX0FaVUxfQkFTRSwNCiAgICBkYXRhTGFiZWxzID0gbGlzdChlbmFibGVkID0gVFJVRSwgZm9ybWF0ID0gIntwb2ludC5uYW1lfSIsDQogICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICI5cHgiLCBjb2xvciA9IElCX0NJTlpBX0VTQ1VSTywgdGV4dE91dGxpbmUgPSAibm9uZSIpKQ0KICApICU+JQ0KICBoY19hZGRfc2VyaWVzKA0KICAgIG5hbWUgPSAiVGVuZMOqbmNpYSBsaW5lYXIiLCB0eXBlID0gImxpbmUiLCBkYXRhID0gbGluaGFfaGlhdG8sDQogICAgY29sb3IgPSBJQl9DSU5aQV9DTEFSTywgZGFzaFN0eWxlID0gIkRhc2giLCBsaW5lV2lkdGggPSAxLjUsDQogICAgbWFya2VyID0gbGlzdChlbmFibGVkID0gRkFMU0UpLCBlbmFibGVNb3VzZVRyYWNraW5nID0gRkFMU0UNCiAgKSAlPiUNCiAgaGNfeEF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAizpQgQ8OibWJpbyAoYW5vIGEgYW5vLCBSJCkiLCBzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8pKSwNCiAgICAgICAgICAgcGxvdExpbmVzID0gbGlzdChsaXN0KHZhbHVlID0gMCwgY29sb3IgPSBJQl9DSU5aQV9DTEFSTywgd2lkdGggPSAxKSkpICU+JQ0KICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICLOlCBHYXAgZGUgaW5mbGHDp8OjbywgbXVpdG8gYmFpeGEg4oiSIGFsdGEgKHAucC4pIiwgc3R5bGUgPSBsaXN0KGNvbG9yID0gSUJfQ0lOWkFfRVNDVVJPKSksDQogICAgICAgICAgIHBsb3RMaW5lcyA9IGxpc3QobGlzdCh2YWx1ZSA9IDAsIGNvbG9yID0gSUJfQ0lOWkFfQ0xBUk8sIHdpZHRoID0gMSkpKSAlPiUNCiAgaGNfbGVnZW5kKGVuYWJsZWQgPSBGQUxTRSkgJT4lDQogIGhjX3Rvb2x0aXAocG9pbnRGb3JtYXQgPSAiQW5vOiA8Yj57cG9pbnQubmFtZX08L2I+PGJyLz7OlEPDom1iaW86IDxiPntwb2ludC54Oi4yZn08L2I+PGJyLz7OlEhpYXRvOiA8Yj57cG9pbnQueTouMmZ9IHAucC48L2I+IikgJT4lDQogIGhjX2Zvcm1hdGFyX2Jhc2UoDQogICAgdGl0dWxvICAgID0gIk8gZ2FwIGRlIGluZmxhw6fDo28iLA0KICAgIHN1YnRpdHVsbyA9IHNwcmludGYoDQogICAgICAiciA9ICUuMmYgfCBSwrIgPSAlLjJmIHwgcCA9ICUuM2YuIExvc2FuZ29zIGFtYXJlbG9zOiBhbm9zIGNvbSBjw6JtYmlvIGFjaW1hIGRlIFIkIDUiLA0KICAgICAgcl9oaWF0bywgcjJfaGlhdG8sIHBfaGlhdG8NCiAgICApLA0KICAgIGZvbnRlICAgICA9ICJGb250ZTogSXBlYSwgR3J1cG8gZGUgQ29uanVudHVyYS9EaW1hYyDigJQgSW5kaWNhZG9yIElwZWEgZGUgSW5mbGHDp8OjbyBwb3IgRmFpeGEgZGUgUmVuZGE7IEJhY2VuIChTR1MgMSksIGZhcm1uZXdzLCBBbnXDoXJpbyBJQkdFIChjw6JtYmlvKS4gRWxhYm9yYcOnw6NvIHByw7NwcmlhIEliTWFjcm8gQkguIg0KICApDQoNCnBhaW5lbF90cmFqZXRvcmlhc19oaWF0byA8LSBoaWdoY2hhcnQoKSAlPiUNCiAgaGNfY2hhcnQodHlwZSA9ICJsaW5lIiwgYW5pbWF0aW9uID0gRkFMU0UpICU+JQ0KICBoY194QXhpcyhjYXRlZ29yaWVzID0gYXMuY2hhcmFjdGVyKGFub3NfZ2luaSksIHRpdGxlID0gbGlzdCh0ZXh0ID0gTlVMTCkpICU+JQ0KICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJJbmZsYcOnw6NvIGFjdW11bGFkYSAxMiBtZXNlcyAoJSkiLCBzdHlsZSA9IGxpc3QoY29sb3IgPSBJQl9DSU5aQV9FU0NVUk8pKSkgJT4lDQogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJSZW5kYSBtdWl0byBiYWl4YSIsIGRhdGEgPSByZW5kYV9tdWl0b19iYWl4YSwgY29sb3IgPSBJQl9BWlVMX0JBU0UsDQogICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IDIuNSwgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gMykpICU+JQ0KICBoY19hZGRfc2VyaWVzKG5hbWUgPSAiUmVuZGEgYWx0YSIsIGRhdGEgPSByZW5kYV9hbHRhLCBjb2xvciA9IElCX0FNQVJFTE8sDQogICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IDIuNSwgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gMykpICU+JQ0KICBoY19sZWdlbmQoZW5hYmxlZCA9IFRSVUUpICU+JQ0KICBoY190b29sdGlwKHNoYXJlZCA9IFRSVUUsIHZhbHVlU3VmZml4ID0gIiBwLnAuIikgJT4lDQogIGhjX2Zvcm1hdGFyX2Jhc2UoDQogICAgdGl0dWxvICAgID0gIkFzIGR1YXMgdHJhamV0w7NyaWFzIiwNCiAgICBzdWJ0aXR1bG8gPSAiSW5mbGHDp8OjbyBhY3VtdWxhZGEgZW0gMTIgbWVzZXMgKGRlemVtYnJvIGRlIGNhZGEgYW5vKSDigJQgb25kZSBhcyBsaW5oYXMgbWFpcyBzZSBhZmFzdGFtIMOpIG9uZGUgbyBoaWF0byBtYWlzIGF1bWVudG91IiwNCiAgICBmb250ZSAgICAgPSAiRm9udGU6IElwZWEsIEdydXBvIGRlIENvbmp1bnR1cmEvRGltYWMg4oCUIEluZGljYWRvciBJcGVhIGRlIEluZmxhw6fDo28gcG9yIEZhaXhhIGRlIFJlbmRhLiINCiAgKQ0KDQpncmFmaWNvX2Vyb3Nhb19yZWFsIDwtIGh3X2dyaWQocGFpbmVsX2hpYXRvLCBwYWluZWxfdHJhamV0b3JpYXNfaGlhdG8sIG5jb2wgPSAxLCByb3doZWlnaHQgPSAzODApDQpncmFmaWNvX2Vyb3Nhb19yZWFsDQpgYGANCg0KIyBDb25jbHVzw6NvDQoNCkEgYW7DoWxpc2UgY29uZHV6aWRhIGFvIGxvbmdvIGRlc3RlIHRyYWJhbGhvIHBlcm1pdGUgZGlzY3V0aXIgYSByZWxhw6fDo28gZW50cmUgY8OibWJpbyBlIGRlc2lndWFsZGFkZSBhIHBhcnRpciBkZSBtZWNhbmlzbW9zIGRlIHRyYW5zbWlzc8OjbywgZSBuw6NvIGRlIHVtYSBhc3NvY2lhw6fDo28gZGlyZXRhIGVudHJlIGFzIGR1YXMgdmFyacOhdmVpcy4gRG8gcG9udG8gZGUgdmlzdGEgdGXDs3JpY28sIG8gY8OibWJpbyBhZmV0YSBhIGRpc3RyaWJ1acOnw6NvIGRlIHJlbmRhIHBvciBjYW5haXMgaW5kaXJldG9zLCBjdWphIGludGVuc2lkYWRlIGRlcGVuZGUgZGEgZXN0cnV0dXJhIHByb2R1dGl2YSwgZGEgY29tcG9zacOnw6NvIGRvIGNvbnN1bW8gZSBkbyBncmF1IGRlIGV4cG9zacOnw6NvIGRlIGNhZGEgZ3J1cG8gw6AgdmFyaWHDp8OjbyBkZSBwcmXDp29zLg0KDQpFbSB1bWEgZWNvbm9taWEgcGVxdWVuYSwgYWJlcnRhIGUgY29tIHJlZ2ltZSBkZSBjw6JtYmlvIGZsdXR1YW50ZSwgY29tbyBvIEJyYXNpbCwgYSB0YXhhIGRlIGPDom1iaW8gZnVuY2lvbmEgY29tbyB1bSBwcmXDp28gcmVsYXRpdm8gY2VudHJhbDogZWxhIGFsdGVyYSBhIHJlbGHDp8OjbyBlbnRyZSBiZW5zIHRyYW5zYWNpb27DoXZlaXMgKGNvbWVyY2lhbGl6w6F2ZWlzIGludGVybmFjaW9uYWxtZW50ZSkgZSBuw6NvIHRyYW5zYWNpb27DoXZlaXMuIFVtYSBkZXByZWNpYcOnw6NvIGVuY2FyZWNlIG9zIGJlbnMgaW1wb3J0YWRvcyBlIG9zIGJlbnMgY3Vqb3MgcHJlw6dvcyBzw6NvIGZvcm1hZG9zIGNvbSByZWZlcsOqbmNpYSBpbnRlcm5hY2lvbmFsLCBhbyBtZXNtbyB0ZW1wbyBxdWUgYXVtZW50YSBhIHJlY2VpdGEgZW0gbW9lZGEgbG9jYWwgZG9zIGV4cG9ydGFkb3Jlcy4NCg0KTyBlZmVpdG8gbMOtcXVpZG8gc29icmUgYSBlY29ub21pYSDDqSwgcG9ydGFudG8sIHJlZGlzdHJpYnV0aXZvIHBvciBuYXR1cmV6YSwgcG9pcyBow6EgZ2FuaGFkb3JlcyBlIHBlcmRlZG9yZXMgZGVudHJvIGRhIHByw7NwcmlhIGVzdHJ1dHVyYSBwcm9kdXRpdmEuDQoNCiMgUmVmZXLDqm5jaWFzDQoNCltGR1YgRUFFU1Ag4oCUIE8gaW1wYWN0byBjYW1iaWFsIG5vIGNvbnN1bW8gZG9zIGJyYXNpbGVpcm9zXShodHRwczovL2VhZXNwLmZndi5ici9zaXRlcy9lYWVzcC5mZ3YuYnIvZmlsZXMvdTc4NC9pbXBhY3RvX2RvX2NhbWJpb19ub19jb25zdW1vX2RvX2JyYXNpbGVpcm8ucGRmKQ0KDQpbQWfDqm5jaWEgUMO6YmxpY2Eg4oCUIEluZmxhw6fDo28gZGUgYWxpbWVudG9zOiBwb3IgcXVlIGNvbWVyIG5vIEJyYXNpbCBmaWNvdSB0w6NvIGNhcm9dKGh0dHBzOi8vYXB1YmxpY2Eub3JnLzIwMjYvMDQvaW5mbGFjYW8tZGUtYWxpbWVudG9zLXBvci1xdWUtY29tZXItbm8tYnJhc2lsLWZpY291LXRhby1jYXJvLykNCg0KW0Fnw6puY2lhIEJyYXNpbCDigJQgRMOzbGFyIGZlY2hhIGFjaW1hIGRlIFIkIDUsOTAgcGVsYSBwcmltZWlyYSB2ZXogbmEgaGlzdMOzcmlhXShodHRwczovL2FnZW5jaWFicmFzaWwuZWJjLmNvbS5ici9lY29ub21pYS9ub3RpY2lhLzIwMjAtMDUvZG9sYXItZmVjaGEtYWNpbWEtZGUtci01OTAtcGVsYS1wcmltZWlyYS12ZXotbmEtaGlzdG9yaWEpDQoNCltSZXZpc3RhIEbDs3J1bSDigJQgQ8OibWJpbyBlIGVtcHJlZ29dKGh0dHBzOi8vcmV2aXN0YWZvcnVtLmNvbS5ici9yZXZpc3RhLWZvcnVtL2NhbWJpby1lLWVtcHJlZ28vKQ0KDQpbVW5pY2FtcCAoSUUpIOKAlCBBIGVjb25vbWlhIHBvbMOtdGljYSBkYSBhcHJlY2lhw6fDo28gY2FtYmlhbCBubyBCcmFzaWwgKFREIDI2OCldKGh0dHBzOi8vd3d3LmVjby51bmljYW1wLmJyL2ltYWdlcy9hcnF1aXZvcy9hcnRpZ29zLzM0NjMvVEQyNjgucGRmKQ0KDQpbTURQSSDigJQgVGhlIEVmZmVjdCBvZiBDdXJyZW5jeSBNaXNhbGlnbm1lbnQgb24gSW5jb21lIEluZXF1YWxpdHldKGh0dHBzOi8vd3d3Lm1kcGkuY29tLzE5MTEtODA3NC8xOC85LzUwNCkNCg0KW1RyZW5kc0NFIOKAlCBDTkkgdsOqIHJpc2NvIGRlIGRlc2luZHVzdHJpYWxpemHDp8OjbyAoc2V0LzIwMjYpXShodHRwczovL3d3dy50cmVuZHNjZS5jb20uYnIvMjAyNi8wOS8wMi9jbmktdmUtcmlzY28tZGUtZGVzaW5kdXN0cmlhbGl6YWNhby1jb20tcXVlZGEtbmEtaW5kdXN0cmlhLWRlLXRyYW5zZm9ybWFjYW8vKQ0KDQpbSm9ybmFsIGRhIFVuaWNhbXAg4oCUIEEgZXNjYW5kYWxvc2EgZGlzdHJpYnVpw6fDo28gZGEgcmlxdWV6YSBubyBCcmFzaWwgKGRhZG9zIFdJRC9ESVJQRildKGh0dHBzOi8vam9ybmFsLnVuaWNhbXAuYnIvZW4vYXJ0aWdvLzIwMjUvMDUvMjkvdW0tcGFpcy1lY29ub21pY2FtZW50ZS1kZXNpZ3VhbC1lLWluanVzdG8tYS1lc2NhbmRhbG9zYS1kaXN0cmlidWljYW8tZGEtcmlxdWV6YS1uby1icmFzaWwvKQ0KDQpbQmxvZyBkbyBJQlJFL0ZHViDigJQgRGlzdHJpYnVpw6fDo28gZGUgcmVuZGEgbm8gQnJhc2lsIGUgbyBwYXBlbCBkb3MgcmVuZGltZW50b3MgYWzDqW0gZG8gdHJhYmFsaG9dKGh0dHBzOi8vYmxvZ2RvaWJyZS5mZ3YuYnIvcG9zdHMvZGlzdHJpYnVpY2FvLWRlLXJlbmRhLW5vLWJyYXNpbC1lLW8tcGFwZWwtZG9zLXJlbmRpbWVudG9zLWFsZW0tZG8tdHJhYmFsaG8tcGFyYS1kZXNpZ3VhbGRhZGUpDQoNCltFeGFtZSDigJQgUmVhbCBlbnRyZSBhcyBtb2VkYXMgbWFpcyB2YWxvcml6YWRhcyBlbSAyMDI2XShodHRwczovL2V4YW1lLmNvbS9pbnZlc3QvbWVyY2Fkb3MvY29tLWRvbGFyLWVtLXF1ZWRhLXJlYWwtZS11bWEtZGFzLW1vZWRhcy1tYWlzLXZhbG9yaXphZGFzLWVtLTIwMjYvKQ0KDQpbQ05OIEJyYXNpbCDigJQgUmVuZGEgcGVyIGNhcGl0YSBlIGRlc2lndWFsZGFkZSBlbSAyMDI0IChJQkdFKV0oaHR0cHM6Ly93d3cuY25uYnJhc2lsLmNvbS5ici9lY29ub21pYS9tb25leS9tYWNyb2Vjb25vbWlhL2liZ2UtcmVuZGEtcGVyLWNhcGl0YS10ZW0tcmVjb3JkZS1kZS1yLTItMDIwLWVtLTIwMjQtZGVzaWd1YWxkYWRlLWNhaS1hLXBpc28taGlzdG9yaWNvLykNCg0KW0NOTiBCcmFzaWwg4oCUIERlc2lndWFsZGFkZTogQnJhc2lsIG1lbGhvcmEgZW0gw61uZGljZXMsIG1hcyBjb25jZW50cmHDp8OjbyBkZSByZW5kYSBhdW1lbnRhXShodHRwczovL3d3dy5jbm5icmFzaWwuY29tLmJyL25hY2lvbmFsL2JyYXNpbC9kZXNpZ3VhbGRhZGUtYnJhc2lsLW1lbGhvcmEtZW0taW5kaWNlcy1tYXMtY29uY2VudHJhY2FvLWRlLXJlbmRhLWF1bWVudGEvKQ0KDQpbSUJHRS9TSURSQSDigJQgSVBDQSBwb3IgZ3J1cG8sIHRhYmVsYSAxNDE5ICgyMDEy4oCTMjAxOSldKGh0dHBzOi8vc2lkcmEuaWJnZS5nb3YuYnIvdGFiZWxhLzE0MTkpDQoNCltJQkdFL1NJRFJBIOKAlCBJUENBIHBvciBncnVwbywgdGFiZWxhIDcwNjAgKDIwMjAgZW0gZGlhbnRlKV0oaHR0cHM6Ly9zaWRyYS5pYmdlLmdvdi5ici90YWJlbGEvNzA2MCkNCg0KW0lCR0Ug4oCUIFNpc3RlbWEgZGUgQ29udGFzIE5hY2lvbmFpcywgVGFiZWxhIDUgKHRhYjA1LnhscyldKGh0dHBzOi8vZnRwLmliZ2UuZ292LmJyL0NvbnRhc19OYWNpb25haXMvU2lzdGVtYV9kZV9Db250YXNfTmFjaW9uYWlzLzIwMjMvdGFiZWxhc194bHMvc2lub3RpY2FzL3RhYjA1LnhscykNCg0KQ0FNUEEsIEpvc8OpIE1hbnVlbDsgR09MREJFUkcsIExpbmRhIFMuIFtFbXBsb3ltZW50IHZlcnN1cyBXYWdlIEFkanVzdG1lbnQgYW5kIHRoZSBVLlMuIERvbGxhcl0oaHR0cHM6Ly9kaXJlY3QubWl0LmVkdS9yZXN0L2FydGljbGUvODMvMy80NzcvNTcyNzMvRW1wbG95bWVudC12ZXJzdXMtV2FnZS1BZGp1c3RtZW50LWFuZC10aGUtVS1TKS4gKlRoZSBSZXZpZXcgb2YgRWNvbm9taWNzIGFuZCBTdGF0aXN0aWNzKiwgdi4gODMsIG4uIDMsIHAuIDQ3N+KAkzQ4OSwgMjAwMS4NCg0KRElYLUNBUk5FSVJPLCBSYWZhZWwuIFtUcmFkZSBMaWJlcmFsaXphdGlvbiBhbmQgTGFib3IgTWFya2V0IER5bmFtaWNzXShodHRwczovL29ubGluZWxpYnJhcnkud2lsZXkuY29tL2RvaS9hYnMvMTAuMzk4Mi9FQ1RBMTA0NTcpLiAqRWNvbm9tZXRyaWNhKiwgdi4gODIsIG4uIDMsIHAuIDgyNeKAkzg4NSwgMjAxNC4NCg0KRElYLUNBUk5FSVJPLCBSYWZhZWw7IEtPVkFLLCBCcmlhbiBLLiBbVHJhZGUgTGliZXJhbGl6YXRpb24gYW5kIFJlZ2lvbmFsIER5bmFtaWNzXShodHRwczovL3d3dy5hZWF3ZWIub3JnL2FydGljbGVzP2lkPTEwLjEyNTclMkZhZXIuMjAxNjEyMTQpLiAqQW1lcmljYW4gRWNvbm9taWMgUmV2aWV3Kiwgdi4gMTA3LCBuLiAxMCwgcC4gMjkwOOKAkzI5NDYsIDIwMTcuDQoNCktMRUlOLCBNaWNoYWVsIFcuOyBTQ0hVSCwgU2NvdHQ7IFRSSUVTVCwgUm9iZXJ0IEsuIFtKb2IgQ3JlYXRpb24sIEpvYiBEZXN0cnVjdGlvbiwgYW5kIHRoZSBSZWFsIEV4Y2hhbmdlIFJhdGVdKGh0dHBzOi8vd3d3LmJvc3RvbmZlZC5vcmcvcHVibGljYXRpb25zL3Jlc2VhcmNoLWRlcGFydG1lbnQtd29ya2luZy1wYXBlci8xOTk5L2pvYi1jcmVhdGlvbi1qb2ItZGVzdHJ1Y3Rpb24tYW5kLXRoZS1yZWFsLWV4Y2hhbmdlLXJhdGUuYXNweCkuICpKb3VybmFsIG9mIEludGVybmF0aW9uYWwgRWNvbm9taWNzKiwgdi4gNTksIG4uIDIsIHAuIDIzOeKAkzI2NSwgMjAwMy4NCg0KTkFLQUJBU0hJLCBMdWNpYW5vOyBDUlVaLCBNw6FyY2lvIEpvc8OpIFZhcmdhcyBkYTsgU0NBVE9MSU4sIEbDoWJpbyBEw7NyaWEuIFtFZmVpdG9zIGRvIGPDom1iaW8gZSBqdXJvcyBzb2JyZSBhcyBleHBvcnRhw6fDtWVzIGRhIGluZMO6c3RyaWEgYnJhc2lsZWlyYV0oaHR0cHM6Ly93d3cuc2NpZWxvLmJyL2ovcmVjL2EvYmdmYzhIUW5XREdSM1Jmckt2blNkck0vP2xhbmc9cHQpLiAqUmV2aXN0YSBkZSBFY29ub21pYSBDb250ZW1wb3LDom5lYSosIHYuIDEyLCBuLiAzLCAyMDA4Lg0K