O pentatlo para mulheres foi realizado pela primeira vez na Alemanha, em 1928. Inicialmente isto consistia do arremesso de peso, salto em distância, 100m, salto em altura e eventos de lançamento de dardo realizaram durante dois dias. O pentatlo foi introduzido pela primeira vez em Jogos Olímpicos em 1964, em que ele consistia os 80 m com barreiras, tiros, salto em altura, salto em comprimento e 200 m. Em 1977, a 200 m foi substituído pelos 800 m e em 1981 a IAAF trouxe o heptatlo sete-eventos no lugar do pentatlo. Um sistema de pontuação é utilizado para atribuir pontos aos resultados de cada evento, e o vencedor é a mulher que acumula mais pontos durante os dois dias. O evento fez sua primeira aparição olímpica em 1984. Nos Jogos Olímpicos de 1988, em Seul, o heptatlo foi vencido por uma das estrelas do atletismo feminino, nos EUA, Jackie Joyner-Kersee. Os resultados para todas as 25 concorrentes são dadas aqui. O pacote “HSAUR”contém os dados de 25 competidoras do heptatlo com 8 variáveis.

Variáveis:

  1. hurdles: resultados de 100 m com barreiras 2 highjump: resultados de salto em altura
  2. shot: resultados de arremesso de peso
  3. run200m: resultados de 200 m rasos
  4. longjump: resultados de salto em distância
  5. javelin: resultados de lançamento de dardos
  6. run800m: resultados de 800 m rasos
  7. score: pontuação total

Será aplicado a Análise de Componentes Principais visando a exploração da estrutura dos dados e avaliar como os escores dos componentes principais se relacionam com os escores do sistema oficial de pontuação.

Em algumas aplicações, as componentes principais pode ser um fim em si e podem ser passíveis de interpretação de uma forma similar como os fatores de uma análise fatorial (exploratória).

Observe as variáveis hurdles, run200m e run800m.

Para estas variáveis, são bons os resultados menores, e,para as demais variáveis, são bons resultados maiores.

Será feita uma transformação na escala das variáveis hurdles, run200m e run800m

obtendo o máximo valor e subtraindo dele os resultados finais das competidoras para ter a mesma direção das demais variáveis.

         vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis   se
hurdles     1 25  2.58 0.74   2.67    2.65 0.47  0.00  3.73  3.73 -1.55     3.65 0.15
highjump    2 25  1.78 0.08   1.80    1.79 0.04  1.50  1.86  0.36 -1.87     4.25 0.02
shot        3 25 13.12 1.49  12.88   13.10 1.63 10.00 16.23  6.23  0.17    -0.44 0.30
run200m     4 25  1.96 0.97   1.78    1.95 0.99  0.00  4.05  4.05  0.16    -0.59 0.19
longjump    5 25  6.15 0.47   6.25    6.17 0.22  4.88  7.27  2.39 -0.45     0.94 0.09
javelin     6 25 41.48 3.55  40.28   41.46 3.71 35.68 47.50 11.82  0.15    -1.26 0.71
run800m     7 25 27.38 8.29  28.69   28.13 4.86  0.00 39.23 39.23 -1.31     2.43 1.66

correlações

         hurdles highjump shot run200m longjump javelin run800m
hurdles     1.00     0.81 0.65    0.77     0.91    0.01    0.78
highjump    0.81     1.00 0.44    0.49     0.78    0.00    0.59
shot        0.65     0.44 1.00    0.68     0.74    0.27    0.42
run200m     0.77     0.49 0.68    1.00     0.82    0.33    0.62
longjump    0.91     0.78 0.74    0.82     1.00    0.07    0.70
javelin     0.01     0.00 0.27    0.33     0.07    1.00   -0.02
run800m     0.78     0.59 0.42    0.62     0.70   -0.02    1.00

teste de Bartlett

Bartlett.sphericity.test


    Bartlett's test of sphericity

data:  dados
X-squared = 141.69, df = 21, p-value < 2.2e-16

PCA

A análise de componentes principais será baseada na matriz de correlações amostral

         hurdles highjump   shot run200m longjump javelin run800m
hurdles   1.0000   0.8114 0.6513  0.7737   0.9121  0.0078  0.7793
highjump  0.8114   1.0000 0.4408  0.4877   0.7824  0.0022  0.5912
shot      0.6513   0.4408 1.0000  0.6827   0.7431  0.2690  0.4196
run200m   0.7737   0.4877 0.6827  1.0000   0.8172  0.3330  0.6168
longjump  0.9121   0.7824 0.7431  0.8172   1.0000  0.0671  0.6995
javelin   0.0078   0.0022 0.2690  0.3330   0.0671  1.0000 -0.0200
run800m   0.7793   0.5912 0.4196  0.6168   0.6995 -0.0200  1.0000
      [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]
[1,] 0.453 -0.158  0.045  0.027 -0.095 -0.783 -0.380
[2,] 0.377 -0.248  0.368  0.680  0.019  0.099  0.434
[3,] 0.363  0.289 -0.676  0.124  0.512 -0.051  0.218
[4,] 0.408  0.260 -0.084 -0.361 -0.650  0.025  0.453
[5,] 0.456 -0.056 -0.139  0.111 -0.184  0.590 -0.612
[6,] 0.075  0.842  0.472  0.121  0.135 -0.027 -0.173
[7,] 0.375 -0.224  0.396 -0.603  0.504  0.156  0.098

          Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
hurdles  0.9564 -0.1726  0.0326  0.0179 -0.0470 -0.2116 -0.0842
highjump 0.7966 -0.2711  0.2655  0.4598  0.0093  0.0268  0.0961
shot     0.7668  0.3163 -0.4881  0.0841  0.2534 -0.0137  0.0482
run200m  0.8614  0.2846 -0.0603 -0.2441 -0.3218  0.0067  0.1004
longjump 0.9635 -0.0611 -0.1006  0.0752 -0.0913  0.1594 -0.1355
javelin  0.1593  0.9198  0.3404  0.0817  0.0669 -0.0074 -0.0383
run800m  0.7919 -0.2453  0.2857 -0.4080  0.2498  0.0420  0.0218

O quadrado da correlação entre a variável e a CP representa a porcentagem de variância de uma das variáveis originais explicada por uma das CP

Conceito de Comunalidade

a comunalidade é a soma dos quadrados das correlações entre cada variável i e a componente principal j (ou o mesmo que o índice cos2). A soma limite-se ao número do componenentes retidos. Em nosso exemplo ilustrativo retemos todos os componentes que é igual ao número de variáveis.

          Dim.1  Dim.2  Dim.3  Dim.4  Dim.5  Dim.6  Dim.7
hurdles  0.9148 0.0298 0.0011 0.0003 0.0022 0.0448 0.0071
highjump 0.6346 0.0735 0.0705 0.2114 0.0001 0.0007 0.0092
shot     0.5880 0.1000 0.2382 0.0071 0.0642 0.0002 0.0023
run200m  0.7421 0.0810 0.0036 0.0596 0.1036 0.0000 0.0101
longjump 0.9284 0.0037 0.0101 0.0057 0.0083 0.0254 0.0184
javelin  0.0254 0.8461 0.1159 0.0067 0.0045 0.0001 0.0015
run800m  0.6271 0.0602 0.0816 0.1665 0.0624 0.0018 0.0005

Mapa Fatorial

Quando um subespaço projetivo bidimensional determinado por duas direções principais escolhidas (CP), sua imagem geométrica plana com os pontos projetados e o círculo de correlações é denominada MAPA FATORIAL

         Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
hurdles   0.96 -0.17  0.03  0.02 -0.05 -0.21 -0.08
highjump  0.80 -0.27  0.27  0.46  0.01  0.03  0.10
shot      0.77  0.32 -0.49  0.08  0.25 -0.01  0.05
run200m   0.86  0.28 -0.06 -0.24 -0.32  0.01  0.10
longjump  0.96 -0.06 -0.10  0.08 -0.09  0.16 -0.14
javelin   0.16  0.92  0.34  0.08  0.07 -0.01 -0.04
run800m   0.79 -0.25  0.29 -0.41  0.25  0.04  0.02
         Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
hurdles   0.91  0.03  0.00  0.00  0.00  0.04  0.01
highjump  0.63  0.07  0.07  0.21  0.00  0.00  0.01
shot      0.59  0.10  0.24  0.01  0.06  0.00  0.00
run200m   0.74  0.08  0.00  0.06  0.10  0.00  0.01
longjump  0.93  0.00  0.01  0.01  0.01  0.03  0.02
javelin   0.03  0.85  0.12  0.01  0.00  0.00  0.00
run800m   0.63  0.06  0.08  0.17  0.06  0.00  0.00

Contribuições das variáveis para os componentes principais

As variáveis que são correlacionadas com PC1 e PC2 são as mais importantes para explicar a variabilidade no conjunto de dados. Variáveis que não se correlacionam com nenhum PC ou correlacionadas com as últimas dimensões são variáveis com baixa contribuição e podem ser removidas para simplificar a análise geral. As contribuições das variáveis na contabilização da variabilidade em uma determinada componente principal são (em porcentagem): (variável.cos2 * 100) / (cos2 total da componente)

         Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
hurdles  20.51  2.49  0.20  0.07  0.90 61.36 14.46
highjump 14.23  6.15 13.53 46.24  0.04  0.99 18.83
shot     13.18  8.38 45.72  1.55 26.18  0.26  4.74
run200m  16.64  6.78  0.70 13.04 42.23  0.06 20.56
longjump 20.81  0.31  1.94  1.24  3.40 34.83 37.46
javelin   0.57 70.84 22.24  1.46  1.83  0.07  2.99
run800m  14.06  5.04 15.67 36.41 25.43  2.42  0.97
[1] 100

A função dimdesc () [em FactoMineR] pode ser usada para identificar as variáveis mais correlacionadas com uma determinada componente principal.

$quanti
         correlation      p.value
longjump   0.9635326 1.156112e-14
hurdles    0.9564348 8.630823e-14
run200m    0.8614484 3.214339e-08
highjump   0.7966208 1.893903e-06
run800m    0.7918903 2.406103e-06
shot       0.7667860 7.798313e-06

$quanti
        correlation      p.value
javelin    0.919843 7.987602e-11

NULL

Análise de pontos (escores, objetos, indivíduos)

                    Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Joyner-Kersee (USA)  4.21  1.27 -0.38  0.02 -0.43  0.35 -0.36
John (GDR)           2.94  0.53 -0.92 -0.49  0.72 -0.24 -0.15
Behmer (GDR)         2.70  0.69  0.47 -0.69 -0.11  0.24  0.13
Sablovskaite (URS)   1.37  0.71 -0.61 -0.14  0.46 -0.09  0.50
Choubenkova (URS)    1.39  1.79  0.15 -0.85  0.70 -0.13 -0.24
Schulz (GDR)         1.07 -0.08  0.69 -0.21  0.75  0.36  0.11
Fleming (AUS)        1.12 -0.33  0.07 -0.50 -0.78 -0.09  0.15
Greiner (USA)        0.94 -0.82 -0.83 -0.03  0.09  0.15 -0.03
Lajbnerova (CZE)     0.54  0.15 -0.16  0.63  0.58 -0.27  0.25
Bouraga (URS)        0.78 -0.54 -0.19 -0.68 -1.04 -0.40  0.02
Wijnsma (HOL)        0.57 -1.43  0.14  0.41  0.30  0.35  0.19
Dimitrova (BUL)      1.21 -0.36  0.08 -0.49 -0.80 -0.24  0.07
Scheider (SWI)      -0.02  0.82  2.01  0.75 -0.02  0.00 -0.04
Braun (FRG)          0.00  0.73  0.33  1.09 -0.19 -0.28 -0.05
Ruotsalainen (FIN)  -0.09  0.78  0.97  0.27 -0.19 -0.14 -0.14
Yuping (CHN)         0.14 -0.55 -1.09  1.67 -0.22  0.29  0.17
Hagger (GB)         -0.17 -1.78 -0.60  0.48 -0.06 -0.15 -0.53
Brown (USA)         -0.53  0.74  0.32  1.32 -0.51  0.07  0.01
Mulliner (GB)       -1.15 -0.65 -0.74 -0.59 -0.16  0.44 -0.08
Hautenauve (BEL)    -1.11 -1.89 -0.01 -0.26  0.20  0.10 -0.09
Kytola (FIN)        -1.48 -0.94  0.66 -0.22  0.51  0.07  0.13
Geremias (BRA)      -2.06 -0.09 -0.66  0.03  0.25 -0.65  0.22
Hui-Ing (TAI)       -2.94 -0.68  0.76 -1.14 -0.48  0.18  0.21
Jeong-Mi (KOR)      -3.03 -0.98  0.58 -0.12  0.59 -0.19 -0.39
Launa (PNG)         -6.40  2.90 -1.06 -0.25 -0.17  0.26 -0.06

                    Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Joyner-Kersee (USA) 0.890 0.081 0.007 0.000 0.010 0.006 0.006
John (GDR)          0.816 0.027 0.079 0.022 0.049 0.006 0.002
Behmer (GDR)        0.852 0.056 0.026 0.056 0.001 0.007 0.002
Sablovskaite (URS)  0.580 0.154 0.114 0.006 0.066 0.003 0.076
Choubenkova (URS)   0.298 0.497 0.004 0.113 0.076 0.003 0.009
Schulz (GDR)        0.479 0.003 0.200 0.019 0.239 0.056 0.005
Fleming (AUS)       0.559 0.048 0.002 0.109 0.269 0.003 0.009
Greiner (USA)       0.388 0.296 0.300 0.000 0.004 0.010 0.001
Lajbnerova (CZE)    0.242 0.018 0.022 0.326 0.278 0.061 0.054
Bouraga (URS)       0.228 0.109 0.013 0.176 0.412 0.062 0.000
Wijnsma (HOL)       0.115 0.728 0.007 0.061 0.032 0.044 0.012
Dimitrova (BUL)     0.577 0.051 0.003 0.095 0.250 0.022 0.002
Scheider (SWI)      0.000 0.128 0.765 0.106 0.000 0.000 0.000
Braun (FRG)         0.000 0.274 0.057 0.610 0.018 0.040 0.001
Ruotsalainen (FIN)  0.005 0.357 0.549 0.044 0.021 0.012 0.011
Yuping (CHN)        0.004 0.068 0.267 0.625 0.011 0.018 0.007
Hagger (GB)         0.007 0.773 0.088 0.056 0.001 0.006 0.069
Brown (USA)         0.096 0.188 0.035 0.591 0.088 0.002 0.000
Mulliner (GB)       0.461 0.147 0.192 0.122 0.009 0.067 0.002
Hautenauve (BEL)    0.250 0.724 0.000 0.014 0.008 0.002 0.002
Kytola (FIN)        0.569 0.232 0.113 0.013 0.068 0.001 0.004
Geremias (BRA)      0.811 0.002 0.084 0.000 0.012 0.082 0.009
Hui-Ing (TAI)       0.765 0.040 0.052 0.115 0.021 0.003 0.004
Jeong-Mi (KOR)      0.832 0.087 0.031 0.001 0.032 0.003 0.014
Launa (PNG)         0.809 0.166 0.022 0.001 0.001 0.001 0.000

                    Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Joyner-Kersee (USA) 15.87  5.39  1.09  0.00  3.08  6.58 10.29
John (GDR)           7.76  0.96  6.44  2.06  8.40  3.24  1.76
Behmer (GDR)         6.56  1.61  1.69  4.21  0.19  3.27  1.43
Sablovskaite (URS)   1.69  1.67  2.83  0.18  3.50  0.48 20.13
Choubenkova (URS)    1.73 10.72  0.18  6.37  8.02  0.91  4.88
Schulz (GDR)         1.02  0.02  3.64  0.39  9.25  7.23  0.91
Fleming (AUS)        1.13  0.37  0.04  2.16  9.89  0.41  1.74
Greiner (USA)        0.80  2.27  5.28  0.01  0.14  1.31  0.10
Lajbnerova (CZE)     0.26  0.07  0.21  3.46  5.49  4.02  5.30
Bouraga (URS)        0.54  0.97  0.27  4.06 17.73  8.97  0.04
Wijnsma (HOL)        0.29  6.80  0.15  1.50  1.45  6.78  2.84
Dimitrova (BUL)      1.32  0.44  0.05  2.11 10.36  3.12  0.42
Scheider (SWI)       0.00  2.27 30.96  4.90  0.01  0.00  0.11
Braun (FRG)          0.00  1.78  0.84 10.36  0.57  4.25  0.17
Ruotsalainen (FIN)   0.01  2.03  7.15  0.66  0.58  1.14  1.55
Yuping (CHN)         0.02  1.01  9.08 24.26  0.76  4.48  2.49
Hagger (GB)          0.03 10.60  2.76  2.02  0.06  1.24 22.99
Brown (USA)          0.25  1.84  0.78 15.15  4.21  0.29  0.00
Mulliner (GB)        1.18  1.41  4.21  3.06  0.41 10.44  0.57
Hautenauve (BEL)     1.10 11.90  0.00  0.60  0.62  0.57  0.62
Kytola (FIN)         1.96  2.98  3.34  0.42  4.25  0.30  1.34
Geremias (BRA)       3.79  0.03  3.36  0.01  1.02 23.44  3.95
Hui-Ing (TAI)        7.75  1.53  4.49 11.41  3.82  1.86  3.66
Jeong-Mi (KOR)       8.24  3.21  2.61  0.12  5.73  1.93 12.39
Launa (PNG)         36.73 28.12  8.55  0.53  0.47  3.73  0.32

O gráfico de dispersão dos escores dos dois primeiros componentes baseados na matriz de correlações juntamente com os respectivos autovetores

Este gráfico é chamado de biplot. É uma representação bidimensional de dados multivariados.

sumário

Extra

simulação para reter o número de CP

Parallel analysis (see Hayton, Allen, and Scarpello, 2004 for more details)

Rotação varimax

A rotação pode facilitar a interpretação dos componentes

Parallel analysis suggests that the number of factors =  NA  and the number of components =  1 


Loadings:
         PC1    PC2   
hurdles   0.956 -0.173
highjump  0.797 -0.271
shot      0.767  0.316
run200m   0.861  0.285
longjump  0.964       
javelin   0.159  0.920
run800m   0.792 -0.245

                 PC1   PC2
SS loadings    4.460 1.194
Proportion Var 0.637 0.171
Cumulative Var 0.637 0.808

Loadings:
         RC1    RC2   
hurdles   0.970       
highjump  0.839       
shot      0.668  0.492
run200m   0.767  0.484
longjump  0.950  0.174
javelin          0.931
run800m   0.828       

                 RC1   RC2
SS loadings    4.269 1.385
Proportion Var 0.610 0.198
Cumulative Var 0.610 0.808

Alguns comentários

Os resultados das 25 competidoras nos 7 eventos indicam que a maioria dos pares são correlacionados com exceção do evento dardo (javelin) Análise de Componentes Principais. Para obter os escores das componentes principais é necessário deixar os dados numa escala apropriada, pois estamos utilizando a matriz de correlação. os autovalores são entendidos como variâncias explicadas pelas componentes. A primeira componente principal representa 81% da variância.

As primeiras componentes principais são concordantes com os escores obtidos dos atletas pelas regras Olímpicas, veja os seguintes gráficos:

LS0tDQp0aXRsZTogIkhlcHRhdGxvIE9sw61tcGljbyBkZSBTZXVsICgxOTg4KSAtIFBDQSINCmF1dGhvcjogIkxlb25pLCBSLiBDLiBQcm9mZXNzb3IgRHIuIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCioqKg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRikNCmBgYA0KDQo+IE8gcGVudGF0bG8gcGFyYSBtdWxoZXJlcyBmb2kgcmVhbGl6YWRvIHBlbGEgcHJpbWVpcmEgdmV6IG5hIEFsZW1hbmhhLCBlbSAxOTI4LiBJbmljaWFsbWVudGUgaXN0byBjb25zaXN0aWEgZG8gYXJyZW1lc3NvIGRlIHBlc28sIHNhbHRvIGVtIGRpc3TDom5jaWEsIDEwMG0sIHNhbHRvIGVtIGFsdHVyYSBlIGV2ZW50b3MgZGUgbGFuw6dhbWVudG8gZGUgZGFyZG8gcmVhbGl6YXJhbSBkdXJhbnRlIGRvaXMgZGlhcy4NCj4gTyBwZW50YXRsbyBmb2kgaW50cm9kdXppZG8gcGVsYSBwcmltZWlyYSB2ZXogZW0gSm9nb3MgT2zDrW1waWNvcyBlbSAxOTY0LCBlbSBxdWUgZWxlIGNvbnNpc3RpYSBvcyA4MCBtIGNvbSBiYXJyZWlyYXMsIHRpcm9zLCBzYWx0byBlbSBhbHR1cmEsIHNhbHRvIGVtIGNvbXByaW1lbnRvIGUgMjAwIG0uDQo+IEVtIDE5NzcsIGEgMjAwIG0gZm9pIHN1YnN0aXR1w61kbyBwZWxvcyA4MDAgbSBlIGVtIDE5ODEgYSBJQUFGIHRyb3V4ZSBvIGhlcHRhdGxvIHNldGUtZXZlbnRvcyBubyBsdWdhciBkbyBwZW50YXRsby4gDQo+IFVtIHNpc3RlbWEgZGUgcG9udHVhw6fDo28gw6kgdXRpbGl6YWRvIHBhcmEgYXRyaWJ1aXIgcG9udG9zIGFvcyByZXN1bHRhZG9zIGRlIGNhZGEgZXZlbnRvLCBlIG8gdmVuY2Vkb3Igw6kgYSBtdWxoZXIgcXVlIGFjdW11bGEgbWFpcyBwb250b3MgZHVyYW50ZSBvcyBkb2lzIGRpYXMuIE8gZXZlbnRvIGZleiBzdWEgcHJpbWVpcmEgYXBhcmnDp8OjbyBvbMOtbXBpY2EgZW0gMTk4NC4NCj4gTm9zIEpvZ29zIE9sw61tcGljb3MgZGUgMTk4OCwgZW0gU2V1bCwgbyBoZXB0YXRsbyBmb2kgdmVuY2lkbyBwb3IgdW1hIGRhcyBlc3RyZWxhcyBkbyBhdGxldGlzbW8gZmVtaW5pbm8sIG5vcyBFVUEsIEphY2tpZSBKb3luZXItS2Vyc2VlLiBPcyByZXN1bHRhZG9zIHBhcmEgdG9kYXMgYXMgMjUgY29uY29ycmVudGVzIHPDo28gZGFkYXMgYXF1aS4gDQo+IE8gcGFjb3RlICJIU0FVUiJjb250w6ltIG9zIGRhZG9zIGRlIDI1IGNvbXBldGlkb3JhcyBkbyBoZXB0YXRsbyBjb20gOCB2YXJpw6F2ZWlzLg0KDQo+IFZhcmnDoXZlaXM6DQoNCjEuIGh1cmRsZXM6IHJlc3VsdGFkb3MgZGUgMTAwIG0gY29tIGJhcnJlaXJhcw0KMiAgaGlnaGp1bXA6IHJlc3VsdGFkb3MgZGUgc2FsdG8gZW0gYWx0dXJhDQozLiBzaG90OiByZXN1bHRhZG9zIGRlIGFycmVtZXNzbyBkZSBwZXNvDQo0LiBydW4yMDBtOiByZXN1bHRhZG9zIGRlIDIwMCBtIHJhc29zDQo1LiBsb25nanVtcDogcmVzdWx0YWRvcyBkZSBzYWx0byBlbSBkaXN0w6JuY2lhDQo2LiBqYXZlbGluOiByZXN1bHRhZG9zIGRlIGxhbsOnYW1lbnRvIGRlIGRhcmRvcw0KNy4gcnVuODAwbTogcmVzdWx0YWRvcyBkZSA4MDAgbSByYXNvcw0KOC4gc2NvcmU6IHBvbnR1YcOnw6NvIHRvdGFsDQoNCj4gIFNlcsOhIGFwbGljYWRvIGEgQW7DoWxpc2UgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFpcyB2aXNhbmRvIGEgZXhwbG9yYcOnw6NvIGRhIGVzdHJ1dHVyYSBkb3MgZGFkb3MgZSBhdmFsaWFyIGNvbW8gb3MgZXNjb3JlcyBkb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcyBzZSByZWxhY2lvbmFtIGNvbSBvcyBlc2NvcmVzIGRvIHNpc3RlbWEgb2ZpY2lhbCBkZSBwb250dWHDp8Ojby4NCg0KYGBge3J9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYpDQojYXBhZ2FyIHRvZG9zIG9zIG9iamV0b3MgZGEgbWVtw7NyaWEgDQpybShsaXN0ID0gbHMoKSkNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2djb3JycGxvdCkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KEhTQVVSKQ0KaGVwdGF0aGxvbg0KIyhkYXRhKCJoZXB0YXRobG9uIiwgcGFja2FnZSA9ICJIU0FVUiIpKQ0KYGBgDQoNCg0KPiAgRW0gYWxndW1hcyBhcGxpY2HDp8O1ZXMsIGFzIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgcG9kZSBzZXIgdW0gZmltIGVtIHNpIGUgcG9kZW0gc2VyIHBhc3PDrXZlaXMgZGUgaW50ZXJwcmV0YcOnw6NvIGRlIHVtYSBmb3JtYSBzaW1pbGFyIGNvbW8gb3MgZmF0b3JlcyBkZSB1bWEgYW7DoWxpc2UgZmF0b3JpYWwgKGV4cGxvcmF0w7NyaWEpLg0KDQo+IE9ic2VydmUgYXMgdmFyacOhdmVpcyBodXJkbGVzLCBydW4yMDBtIGUgcnVuODAwbS4gDQoNCj4gIyMgUGFyYSBlc3RhcyB2YXJpw6F2ZWlzLCBzw6NvIGJvbnMgb3MgcmVzdWx0YWRvcyBtZW5vcmVzLCBlLHBhcmEgYXMgZGVtYWlzIHZhcmnDoXZlaXMsIHPDo28gYm9ucyByZXN1bHRhZG9zIG1haW9yZXMuIA0KDQo+IFNlcsOhIGZlaXRhIHVtYSB0cmFuc2Zvcm1hw6fDo28gbmEgZXNjYWxhIGRhcyB2YXJpw6F2ZWlzIGh1cmRsZXMsIHJ1bjIwMG0gZSBydW44MDBtDQoNCj4gb2J0ZW5kbyBvIG3DoXhpbW8gdmFsb3IgZSBzdWJ0cmFpbmRvIGRlbGUgb3MgcmVzdWx0YWRvcyBmaW5haXMgZGFzIGNvbXBldGlkb3JhcyBwYXJhIHRlciBhIG1lc21hIGRpcmXDp8OjbyBkYXMgZGVtYWlzIHZhcmnDoXZlaXMuDQoNCmBgYHtyfQ0KaGVwdGF0aGxvbiRodXJkbGVzIDwtIG1heChoZXB0YXRobG9uJGh1cmRsZXMpLWhlcHRhdGhsb24kaHVyZGxlcw0KaGVwdGF0aGxvbiRydW4yMDBtIDwtIG1heChoZXB0YXRobG9uJHJ1bjIwMG0pLWhlcHRhdGhsb24kcnVuMjAwbQ0KaGVwdGF0aGxvbiRydW44MDBtIDwtIG1heChoZXB0YXRobG9uJHJ1bjgwMG0pLWhlcHRhdGhsb24kcnVuODAwbQ0KaGVhZChoZXB0YXRobG9uKQ0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MjJ9DQpkYWRvcyA8LWhlcHRhdGhsb25bLC04XSAgIyByZXRpcmFyIG9zIGVzY29yZXMgDQojIHN1bcOhcmlvIGVzdGF0w61zdGljbyANCmRlc2NyaWJlKGRhZG9zKQ0KIyBncsOhZmljbyBib3hwbG90IA0KYm94cGxvdChkYWRvcykNCmJveHBsb3Qoc2NhbGUoZGFkb3MpKQ0KYGBgDQoNCg0KIyMjIGNvcnJlbGHDp8O1ZXMNCmBgYHtyfQ0KIyBDb3JyZWxhdGlvbiBtYXRyaXgNCm1hdGNvciA8LSByb3VuZChjb3IoZGFkb3MpLCAyKQ0KbWF0Y29yDQoNCiMgUGxvdA0KZ2djb3JycGxvdChtYXRjb3IsIGhjLm9yZGVyID0gVFJVRSwgDQogICAgICAgICAgIHR5cGUgPSAibG93ZXIiLCANCiAgICAgICAgICAgbGFiID0gVFJVRSwgDQogICAgICAgICAgIGxhYl9zaXplID0gMywgDQogICAgICAgICAgIG1ldGhvZD0iY2lyY2xlIiwgDQogICAgICAgICAgIGNvbG9ycyA9IGMoInRvbWF0bzIiLCAid2hpdGUiLCAic3ByaW5nZ3JlZW4zIiksIA0KICAgICAgICAgICB0aXRsZT0iQ29ycmVsb2dyYW1hIiwgDQogICAgICAgICAgIGdndGhlbWU9dGhlbWVfYncpDQpgYGANCg0KDQojIyMgdGVzdGUgZGUgQmFydGxldHQNCiMjIyBCYXJ0bGV0dC5zcGhlcmljaXR5LnRlc3QNCg0KYGBge3J9DQpCYXJ0bGV0dC5zcGhlcmljaXR5LnRlc3QgPC0gZnVuY3Rpb24oeCkNCnsNCiAgbWV0aG9kIDwtICJCYXJ0bGV0dCdzIHRlc3Qgb2Ygc3BoZXJpY2l0eSINCiAgZGF0YS5uYW1lIDwtIGRlcGFyc2Uoc3Vic3RpdHV0ZSh4KSkNCiAgeCA8LSBzdWJzZXQoeCwgY29tcGxldGUuY2FzZXMoeCkpICMgT21pdCBtaXNzaW5nIHZhbHVlcw0KICBuIDwtIG5yb3coeCkNCiAgcCA8LSBuY29sKHgpDQogIGNoaXNxIDwtICgxLW4rKDIqcCs1KS82KSpsb2coZGV0KGNvcih4KSkpDQogIGRmIDwtIHAqKHAtMSkvMg0KICBwLnZhbHVlIDwtIHBjaGlzcShjaGlzcSwgZGYsIGxvd2VyLnRhaWw9RkFMU0UpDQogIG5hbWVzKGNoaXNxKSA8LSAiWC1zcXVhcmVkIg0KICBuYW1lcyhkZikgPC0gImRmIg0KICByZXR1cm4oc3RydWN0dXJlKGxpc3Qoc3RhdGlzdGljPWNoaXNxLCBwYXJhbWV0ZXI9ZGYsIHAudmFsdWU9cC52YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD1tZXRob2QsIGRhdGEubmFtZT1kYXRhLm5hbWUpLCBjbGFzcz0iaHRlc3QiKSkNCn0NCg0KQmFydGxldHQuc3BoZXJpY2l0eS50ZXN0KGRhZG9zKQ0KYGBgDQoNCg0KIyMjIFBDQQ0KPiBBIGFuw6FsaXNlIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgc2Vyw6EgYmFzZWFkYSBuYSBtYXRyaXogZGUgY29ycmVsYcOnw7VlcyBhbW9zdHJhbA0KDQoNCmBgYHtyfQ0KIyBQQ0EgY29tIGEgbWF0cml6IGRlIGNvcg0KcmVzLnBjYS5jb3IgPC0gUENBKGRhZG9zLCBzY2FsZS51bml0ID0gVCwgZ3JhcGggPSBGQUxTRSwgbmNwID0gSW5mKQ0KIyBtYXRyaXogZGUgY292YXJpw6JuY2lhDQpyb3VuZChjb3IoZGFkb3MpLDQpDQojIGF1dG92YWxvcmVzDQpyb3VuZChyZXMucGNhLmNvciRlaWcsMykNCiMgYXV0b3ZldG9yZXMNCnJvdW5kKHJlcy5wY2EuY29yJHN2ZCRWLDMpDQojIEEgcHJvcG9yw6fDo28gZGUgdmFyaWHDp8OjbyByZXRpZGEgcGVsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcyAoQ1ApIHBvZGUgc2VyIGV4dHJhw61kYSBkYSBzZWd1aW50ZSBmb3JtYQ0KcmVzLnBjYS5jb3IkZWlnDQojIEEgaW1wb3J0w6JuY2lhIGRvcyBDUCBwb2RlIHNlciB2aXN1YWxpemFkYSB1c2FuZG8gbyBzY3JlZSBwbG90IDoNCmZ2aXpfc2NyZWVwbG90KHJlcy5wY2EuY29yLCBuY3A9NCkrIHRoZW1lX21pbmltYWwoKQ0KIyBBIGNvcnJlbGHDp8OjbyBlbnRyZSB1bWEgdmFyacOhdmVsIGUgdW0gQ1Agw6kgY2hhbWFkYSBkZSBjYXJnYSAobG9hZGluZ3MpLiANCnJvdW5kKHJlcy5wY2EuY29yJHZhciRjb3IsNCkNCmBgYA0KDQojIyMgTyBxdWFkcmFkbyBkYSBjb3JyZWxhw6fDo28gZW50cmUgYSB2YXJpw6F2ZWwgZSBhIENQIHJlcHJlc2VudGEgYSBwb3JjZW50YWdlbSBkZSB2YXJpw6JuY2lhIGRlIHVtYSBkYXMgdmFyacOhdmVpcyBvcmlnaW5haXMgZXhwbGljYWRhIHBvciB1bWEgZGFzIENQDQoNCiMjIENvbmNlaXRvIGRlIENvbXVuYWxpZGFkZQ0KPiBhIGNvbXVuYWxpZGFkZSDDqSBhIHNvbWEgZG9zIHF1YWRyYWRvcyBkYXMgY29ycmVsYcOnw7VlcyBlbnRyZSBjYWRhIHZhcmnDoXZlbCBpIGUgYSBjb21wb25lbnRlIHByaW5jaXBhbCBqIChvdSBvIG1lc21vIHF1ZSBvIMOtbmRpY2UgY29zMikuIEEgc29tYSBsaW1pdGUtc2UgYW8gbsO6bWVybyBkbyBjb21wb25lbmVudGVzIHJldGlkb3MuIEVtIG5vc3NvIGV4ZW1wbG8gaWx1c3RyYXRpdm8gcmV0ZW1vcyB0b2RvcyBvcyBjb21wb25lbnRlcyBxdWUgw6kgaWd1YWwgYW8gbsO6bWVybyBkZSB2YXJpw6F2ZWlzLiANCg0KDQpgYGB7cn0NCiMgYmFuc2VhbmRvLXNlIG5hIG1hdHJpeiBkZSBjb3INCnJvdW5kKHJlcy5wY2EuY29yJHZhciRjb3JeMiw0KQ0KIyBvdSAgcm91bmQocmVzLnBjYS5jb3IkdmFyJGNvczIsNCkNCmBgYA0KDQojIyMgTWFwYSBGYXRvcmlhbCANCg0KPiBRdWFuZG8gdW0gc3ViZXNwYcOnbyBwcm9qZXRpdm8gYmlkaW1lbnNpb25hbCBkZXRlcm1pbmFkbyBwb3IgZHVhcyBkaXJlw6fDtWVzIHByaW5jaXBhaXMgZXNjb2xoaWRhcyAoQ1ApLCBzdWEgaW1hZ2VtIGdlb23DqXRyaWNhIHBsYW5hIGNvbSBvcyBwb250b3MgcHJvamV0YWRvcyBlIG8gY8OtcmN1bG8gZGUgY29ycmVsYcOnw7VlcyDDqSBkZW5vbWluYWRhIE1BUEEgRkFUT1JJQUwgICANCg0KYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTl9DQojIFF1YW50byBtYWlzIHByw7N4aW1hIHVtYSB2YXJpw6F2ZWwgZm9yIGRvIGPDrXJjdWxvIGRlIGNvcnJlbGHDp8O1ZXMsIG1lbGhvciBzdWEgcmVwcmVzZW50YcOnw6NvIG5vIG1hcGEgZmF0b3JpYWwgKGUgbWFpcyBpbXBvcnRhbnRlIMOpIGEgdmFyacOhdmVsIHBhcmEgYSBpbnRlcnByZXRhw6fDo28gZGVzc2VzIGNvbXBvbmVudGVzKQ0KIyBBcyB2YXJpw6F2ZWlzIHByw7N4aW1hcyBhbyBjZW50cm8gZG8gZ3LDoWZpY28gc8OjbyBtZW5vcyBpbXBvcnRhbnRlcyBwYXJhIG9zIHByaW1laXJvcyBjb21wb25lbnRlcy4NCiMgTm8gZ3LDoWZpY28gYWJhaXhvIG9zIGNvbXBvbmVudGVzIHPDo28gY29sb3JpZGFzIGRlIGFjb3JkbyBjb20gb3MgdmFsb3JlcyBkbyBjb3Nlbm8gcXVhZHJhZG86DQoNCmZ2aXpfcGNhX3ZhcihyZXMucGNhLmNvciwgY29sLnZhcj0iY29zMiIpICsNCnNjYWxlX2NvbG9yX2dyYWRpZW50Mihsb3c9IndoaXRlIiwgbWlkPSJibHVlIiwgDQogICAgICAgICAgICAgICAgICAgIGhpZ2g9InJlZCIsIG1pZHBvaW50PTAuNSkgKyB0aGVtZV9taW5pbWFsKCkNCg0KIyBDb29yZGVuYWRhcyBkZSB2YXJpw6F2ZWlzDQpyb3VuZChyZXMucGNhLmNvciR2YXIkY29vcmQsMikNCg0KIyBDb3MyOiDDqSB1bWEgbWVkaWRhIHF1ZSBpbmRpY2EgYSBxdWFsaWRhZGUgZGEgcmVwcmVzZW50YcOnw6NvIHBhcmEgdmFyacOhdmVpcyBubyBtYXBhIGZhdG9yaWFsDQpyb3VuZChyZXMucGNhLmNvciR2YXIkY29zMiwyKQ0KYGBgDQoNCiMjIyBDb250cmlidWnDp8O1ZXMgZGFzIHZhcmnDoXZlaXMgcGFyYSBvcyBjb21wb25lbnRlcyBwcmluY2lwYWlzDQoNCj4gQXMgdmFyacOhdmVpcyBxdWUgc8OjbyBjb3JyZWxhY2lvbmFkYXMgY29tIFBDMSBlIFBDMiBzw6NvIGFzIG1haXMgaW1wb3J0YW50ZXMgcGFyYSBleHBsaWNhciBhIHZhcmlhYmlsaWRhZGUgbm8gY29uanVudG8gZGUgZGFkb3MuIFZhcmnDoXZlaXMgcXVlIG7Do28gc2UgY29ycmVsYWNpb25hbSBjb20gbmVuaHVtIFBDIG91IGNvcnJlbGFjaW9uYWRhcyBjb20gYXMgw7psdGltYXMgZGltZW5zw7VlcyBzw6NvIHZhcmnDoXZlaXMgY29tIGJhaXhhIGNvbnRyaWJ1acOnw6NvIGUgcG9kZW0gc2VyIHJlbW92aWRhcyBwYXJhIHNpbXBsaWZpY2FyIGEgYW7DoWxpc2UgZ2VyYWwuIEFzIGNvbnRyaWJ1acOnw7VlcyBkYXMgdmFyacOhdmVpcyBuYSBjb250YWJpbGl6YcOnw6NvIGRhIHZhcmlhYmlsaWRhZGUgZW0gdW1hIGRldGVybWluYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsIHPDo28gKGVtIHBvcmNlbnRhZ2VtKTogKHZhcmnDoXZlbC5jb3MyICogMTAwKSAvIChjb3MyIHRvdGFsIGRhIGNvbXBvbmVudGUpDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD05fQ0KIyBBIGNvbnRyaWJ1acOnw6NvIGRhcyB2YXJpw6F2ZWlzIHBvZGUgc2VyIGV4dHJhw61kYSBkYSBzZWd1aW50ZSBmb3JtYToNCnJvdW5kKHJlcy5wY2EuY29yJHZhciRjb250cmliLDIpDQojIHZlamEgcXVlIGEgc29tYSDDqSBpZ3VhbCBhIDEwMCUNCnN1bSAocmVzLnBjYS5jb3IkdmFyJGNvbnRyaWJbLDFdKSAgDQoNCiMgUXVhbnRvIG1haW9yIG8gdmFsb3IgZGEgY29udHJpYnVpw6fDo28sIG1haXMgYSB2YXJpw6F2ZWwgY29udHJpYnVpIHBhcmEgbyBjb21wb25lbnRlLg0KIyBBcyB2YXJpw6F2ZWlzIG1haXMgaW1wb3J0YW50ZXMgYXNzb2NpYWRhcyBhIHVtIGRldGVybWluYWRvIFBDIHBvZGVtIHNlciB2aXN1YWxpemFkYXMsIHVzYW5kbyBhIGZ1bsOnw6NvIGZ2aXpfY29udHJpYiAoKSBbZmFjdG9leHRyYSBwYWNrYWdlXSwgZGEgc2VndWludGUgZm9ybWE6DQoNCiMgQ29udHJpYnVpw6fDtWVzIGRlIHZhcmnDoXZlaXMgbm8gUEMxDQpmdml6X2NvbnRyaWIocmVzLnBjYS5jb3IsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMSkrIHRoZW1lX21pbmltYWwoKQ0KDQojIENvbnRyaWJ1acOnw7VlcyBkZSB2YXJpw6F2ZWlzIG5vIFBDMg0KZnZpel9jb250cmliKHJlcy5wY2EuY29yLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIpKyB0aGVtZV9taW5pbWFsKCkNCg0KIyBDb250cmlidWnDp8OjbyB0b3RhbCBub3MgUEMxIGUgUEMyDQpmdml6X2NvbnRyaWIocmVzLnBjYS5jb3IsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMToyKSsgdGhlbWVfbWluaW1hbCgpDQoNCiMgQ29udHJvbGUgYXMgY29yZXMgZGFzIHZhcmnDoXZlaXMgdXNhbmRvIHN1YXMgY29udHJpYnVpw6fDtWVzDQojIGEgY29yIHJlcHJlc2VudGEgYSBjb250cmlidWnDp8OjbyBjb25qdW50YSBkaW0xLWRpbTINCmZ2aXpfcGNhX3ZhcihyZXMucGNhLmNvciwgY29sLnZhcj0iY29udHJpYiIpKyB0aGVtZV9taW5pbWFsKCkNCg0KIyBBbHRlcmFyIGEgY29yIA0KZnZpel9wY2FfdmFyKHJlcy5wY2EuY29yLCBjb2wudmFyPSJjb250cmliIikgKw0Kc2NhbGVfY29sb3JfZ3JhZGllbnQyKGxvdz0id2hpdGUiLCBtaWQ9ImJsdWUiLCANCiAgICAgICAgICAgICAgICAgIGhpZ2g9InJlZCIsIG1pZHBvaW50PTUwKSArIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyBBIGZ1bsOnw6NvIGRpbWRlc2MgKCkgW2VtIEZhY3RvTWluZVJdIHBvZGUgc2VyIHVzYWRhIHBhcmEgaWRlbnRpZmljYXIgYXMgdmFyacOhdmVpcyBtYWlzIGNvcnJlbGFjaW9uYWRhcyBjb20gdW1hIGRldGVybWluYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsLg0KYGBge3J9DQoNCnJlcy5kZXNjIDwtIGRpbWRlc2MocmVzLnBjYS5jb3IsIGF4ZXMgPSBjKDEsMikpDQojIERlc2NyacOnw6NvIGRhIGRpbWVuc8OjbyAxDQpyZXMuZGVzYyREaW0uMQ0KIyBEZXNjcmnDp8OjbyBkYSBkaW1lbnPDo28gMg0KcmVzLmRlc2MkRGltLjINCiMgRGVzY3Jpw6fDo28gZGEgZGltZW5zw6NvIDMNCnJlcy5kZXNjJERpbS4zDQpgYGANCg0KIyMjIEFuw6FsaXNlIGRlIHBvbnRvcyAoZXNjb3Jlcywgb2JqZXRvcywgaW5kaXbDrWR1b3MpDQoNCg0KYGBge3J9DQojIEdyw6FmaWNvIGRlIGVzY29yZXMgKGluZGl2w61kdW9zIG91IHBvbnRvcyBvYmpldG9zKQ0KIyBBcyBjb29yZGVuYWRhcyBkb3MgZXNjb3JlcyBub3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcyBzw6NvOg0Kcm91bmQocmVzLnBjYS5jb3IkaW5kJGNvb3JkLDIpDQpmdml6X3BjYV9pbmQocmVzLnBjYS5jb3IpKyB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCiNDb3MyOiBxdWFsaWRhZGUgZGEgcmVwcmVzZW50YcOnw6NvIHBhcmEgZXNjb3JlcyBub3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcw0KIyBPIGNvc2VubyBxdWFkcmFkbyBtb3N0cmEgYSBpbXBvcnTDom5jaWEgZGUgdW0gY29tcG9uZW50ZSBwYXJhIHVtYSBkZXRlcm1pbmFkYSBvYnNlcnZhw6fDo28uDQpyb3VuZChyZXMucGNhLmNvciRpbmQkY29zMiwzKQ0KDQpmdml6X3BjYV9pbmQocmVzLnBjYS5jb3IsIGNvbC5pbmQ9ImNvczIiKSArDQpzY2FsZV9jb2xvcl9ncmFkaWVudDIobG93PSJ3aGl0ZSIsIG1pZD0iYmx1ZSIsIA0KICAgaGlnaD0icmVkIiwgbWlkcG9pbnQ9MC41MCkgKyB0aGVtZV9taW5pbWFsKCkNCg0KIyBDb250cmlidWnDp8OjbyBkb3MgZXNjb3JlcyBwYXJhIG9zIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgDQpyb3VuZChyZXMucGNhLmNvciRpbmQkY29udHJpYiwyKQ0KIyBDb250cmlidWnDp8O1ZXMgZGUgZXNjb3JlcyBwYXJhIFBDMQ0KZnZpel9jb250cmliKHJlcy5wY2EuY29yLCBjaG9pY2UgPSAiaW5kIiwgYXhlcyA9IDEpKyB0aGVtZV9taW5pbWFsKCkNCiMgQ29udHJpYnVpw6fDtWVzIGRlIGVzY29yZXMgcGFyYSBQQzINCmZ2aXpfY29udHJpYihyZXMucGNhLmNvciwgY2hvaWNlID0gImluZCIsIGF4ZXMgPSAyKSsgdGhlbWVfbWluaW1hbCgpDQojIENvbnRyaWJ1acOnw6NvIHRvdGFsIGVtIFBDMSBlIFBDMg0KZnZpel9jb250cmliKHJlcy5wY2EuY29yLCBjaG9pY2UgPSAiaW5kIiwgYXhlcyA9IDE6MikrIHRoZW1lX21pbmltYWwoKQ0KIyBDb250cmlidWnDp8O1ZXMgZG9zIGVzY29yZXMgcGFyYSBQQzEgIChhcGVuYXMgb3MgInRvcCIpDQpmdml6X2NvbnRyaWIocmVzLnBjYS5jb3IsIGNob2ljZSA9ICJpbmQiLCBheGVzID0gMToyLCB0b3AgPSA1KSsgdGhlbWVfbWluaW1hbCgpDQojIE11bmRhbmRvIGEgY29yDQpmdml6X3BjYV9pbmQocmVzLnBjYS5jb3IsIGNvbC5pbmQ9ImNvbnRyaWIiKSArDQpzY2FsZV9jb2xvcl9ncmFkaWVudDIobG93PSJ3aGl0ZSIsIG1pZD0iYmx1ZSIsIA0KICAgICAgICAgICAgICAgICAgaGlnaD0icmVkIiwgbWlkcG9pbnQ9NTApICsgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMjIE8gZ3LDoWZpY28gZGUgZGlzcGVyc8OjbyBkb3MgZXNjb3JlcyBkb3MgZG9pcyBwcmltZWlyb3MgY29tcG9uZW50ZXMgYmFzZWFkb3MgbmEgbWF0cml6IGRlIGNvcnJlbGHDp8O1ZXMganVudGFtZW50ZSBjb20gb3MgcmVzcGVjdGl2b3MgYXV0b3ZldG9yZXMgDQojIyMgRXN0ZSBncsOhZmljbyDDqSBjaGFtYWRvIGRlIGJpcGxvdC4gw4kgdW1hIHJlcHJlc2VudGHDp8OjbyBiaWRpbWVuc2lvbmFsIGRlIGRhZG9zIG11bHRpdmFyaWFkb3MuDQoNCmBgYHtyfQ0KZnZpel9wY2FfYmlwbG90KHJlcy5wY2EuY29yKSArIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KIyMjIHN1bcOhcmlvDQpgYGB7cn0NCiMgc3Vtw6FyaW8NCmZhY3RvX3N1bW1hcml6ZShyZXMucGNhLmNvciwgInZhciIpICMgcGFyYSB2YXJpw6F2ZWlzDQpmYWN0b19zdW1tYXJpemUocmVzLnBjYS5jb3IsICJpbmQiKSAjIHBhcmEgZXNjb3Jlcw0KYGBgDQoNCg0KIyMgRXh0cmENCg0KIyMjIHNpbXVsYcOnw6NvIHBhcmEgcmV0ZXIgbyBuw7ptZXJvIGRlIENQDQo+IFBhcmFsbGVsIGFuYWx5c2lzIChzZWUgSGF5dG9uLCBBbGxlbiwgYW5kIFNjYXJwZWxsbywgMjAwNCBmb3IgbW9yZSBkZXRhaWxzKQ0KDQojIyMgUm90YcOnw6NvIHZhcmltYXgNCj4gQSByb3Rhw6fDo28gcG9kZSBmYWNpbGl0YXIgYSBpbnRlcnByZXRhw6fDo28gZG9zIGNvbXBvbmVudGVzDQoNCmBgYHtyfQ0KZmEucGFyYWxsZWwoZGFkb3MsIGZhPSJwYyIsIHNob3cubGVnZW5kPUZBTFNFLA0KICAgICAgICAgICAgbWFpbj0iU2NyZWUgcGxvdCB3aXRoIHBhcmFsbGVsIGFuYWx5c2lzIikNCiMgc3VnZXJlIGR1YXMgQ1ANCg0KcGMgPC0gcHJpbmNpcGFsKHI9ZGFkb3MsIG5mYWN0b3JzPTIsIHJvdGF0ZT0ibm9uZSIsIHNjb3Jlcz1UKQ0KcGMkbG9hZGluZ3MNCg0KcGMgPC0gcHJpbmNpcGFsKHI9ZGFkb3MsIG5mYWN0b3JzPTIsIHJvdGF0ZT0idmFyaW1heCIsIHNjb3Jlcz1UKQ0KcGMkbG9hZGluZ3MNCmBgYA0KDQoNCg0KIyMjIEFsZ3VucyBjb21lbnTDoXJpb3MNCg0KPiBPcyByZXN1bHRhZG9zIGRhcyAyNSBjb21wZXRpZG9yYXMgbm9zIDcgZXZlbnRvcyBpbmRpY2FtIHF1ZSBhIG1haW9yaWEgZG9zIHBhcmVzIHPDo28gY29ycmVsYWNpb25hZG9zIGNvbSBleGNlw6fDo28gZG8gZXZlbnRvIGRhcmRvIChqYXZlbGluKQ0KPiBBbsOhbGlzZSBkZSBDb21wb25lbnRlcyBQcmluY2lwYWlzLg0KPiBQYXJhIG9idGVyIG9zIGVzY29yZXMgZGFzIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgw6kgbmVjZXNzw6FyaW8gZGVpeGFyIG9zIGRhZG9zIG51bWEgZXNjYWxhIGFwcm9wcmlhZGEsIHBvaXMgZXN0YW1vcyB1dGlsaXphbmRvIGEgbWF0cml6IGRlIGNvcnJlbGHDp8Ojby4gDQo+IG9zIGF1dG92YWxvcmVzIHPDo28gZW50ZW5kaWRvcyBjb21vIHZhcmnDom5jaWFzIGV4cGxpY2FkYXMgcGVsYXMgY29tcG9uZW50ZXMuDQo+IEEgcHJpbWVpcmEgY29tcG9uZW50ZSBwcmluY2lwYWwgcmVwcmVzZW50YSA4MSUgZGEgdmFyacOibmNpYS4gDQoNCiMjIyAgQXMgcHJpbWVpcmFzIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgc8OjbyBjb25jb3JkYW50ZXMgY29tIG9zIGVzY29yZXMgb2J0aWRvcyBkb3MgYXRsZXRhcyBwZWxhcyByZWdyYXMgT2zDrW1waWNhcywgdmVqYSBvcyBzZWd1aW50ZXMgZ3LDoWZpY29zOg0KDQpgYGB7cn0NCnBsb3QoaGVwdGF0aGxvbiRzY29yZSwgcmVzLnBjYS5jb3IkaW5kJGNvb3JkWywxXSkNCnBsb3QoaGVwdGF0aGxvbiRzY29yZSwgcmVzLnBjYS5jb3IkaW5kJGNvb3JkWywyXSkNCmBgYA0KDQo=