diff --git a/glmmFAQ.html b/glmmFAQ.html index 59e42a2..22f89c9 100644 --- a/glmmFAQ.html +++ b/glmmFAQ.html @@ -11,7 +11,7 @@ - + GLMM FAQ @@ -353,7 +353,6 @@ div.csl-bib-body { } div.csl-entry { clear: both; -margin-bottom: 0em; } .hanging div.csl-entry { margin-left:2em; @@ -480,7 +479,7 @@

GLMM FAQ

Ben Bolker and others

-

01 Oct 2023

+

08 Oct 2023

@@ -546,6 +545,8 @@

01 Oct 2023

  • Troubleshooting @@ -2334,12 +2338,6 @@

    What methods are available to fit (estimate) GLMMs?

    -

    These approaches (PQL, Laplace approximation, GHQ, MCMC) are most -common. Other less-common methods include Monte Carlo EM (Booth and Hobert 1999; Knudson et al. 2021) -(glmm package), hierarchical GLMs (which use an entirely -different inference framework: (Jin and Lee 2021; -Meng 2009, 2011)). Also see the Mixed -Models Task View.

    Troubleshooting

    @@ -2384,14 +2382,12 @@

    Convergence warnings

    \exp(\textrm{effort})\) instead; exp(effort) is often a huge (and model-destabilizing) number.
  • -

    []{singular-fit} []{zero-variance} +

    -[]{singular-models-random-effect-variances-estimated-as-zero-or-correlations-estimated-as—1} -

    -

    https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#singular-models-random-effect-variances-estimated-as-zero-or-correlations-estimated-as---1 -### Singular models: random effect variances estimated as zero, or -correlations estimated as +/- 1

    +

    + +
    +

    Singular fits

    It is very common for overfitted mixed models to result in singular fits. Technically, singularity means that the random effects variance-covariance matrix is of less than full rank. There are @@ -2408,9 +2404,17 @@

    Convergence warnings

    of the major axes are proportional to the eigenvalues; the ellipsoid is “flat” in some directions, e.g. an ellipse has collapsed to a line segment

    -
  • In the case of a scalar random effect such as a random intercept, -this is easy to understand - the random effects variance is zero or near -zero

  • +
  • In simple cases where a random effect term is represented by a +single variance (scalar random effects), this is reflected in a +variance estimate that is zero or near zero. Functions such as +nlme::lme() or glmmTMB() that estimate +variances on the log scale will often not report a singular +fit, but will instead return a very small value (1e-6 or less) for the +random-effects variance; on the log scale, this will correspond to a +parameter estimate that is a large negative number — and, usually, +warnings about non-positive-definite Hessians or (in the case of +lme()) ridiculously large Wald confidence intervals +returned by intervals().

  • In the case of a two-dimensional random effect (such as a random-slopes model), this typically corresponds to a perfect (+/- 1) correlation between the slope and intercept

  • @@ -2435,22 +2439,34 @@

    Convergence warnings

    (f|g) where f is a categorical variable with a relatively large number of levels, or models with several different random-slopes terms.

    -
  • In MCMCglmm, singular or near-singular models will +

  • In MCMCglmm, singular or near-singular fits will provoke an error and a requirement to specify a stronger prior.

  • At present there are a variety of strong opinions about how to -resolve such problems. Briefly:

    +resolve such problems, which are sometimes conflated with the general +problem of how to decide on the appropriate complexity of the +random-effects component of a model. Briefly:

    -
  • If a variance component is zero, dropping it from the model will -have no effect on any of the estimated quantities (although it will -affect the AIC, as the variance parameter is counted even though it has -no effect). Pasch, Bolker, and Phelps -(2013) gives one example where random effects were dropped -because the variance components were consistently estimated as zero. -Conversely, if one chooses for philosophical grounds to retain these -parameters, it won’t change any of the answers.
  • @@ -2518,7 +2526,10 @@

    Setting residual variances to a fixed value (zero or other)

    control=list(sigma=1e-8))
    (pb <- pbkrtest::PBmodcomp(m2,m1,seed=101))
    -
    ## Bootstrap test; time: 14.15 sec; samples: 1000; extremes: 0;
    +
    ## Bootstrap test; time: 15.32 sec; samples: 1000; extremes: 0;
     ## Requested samples: 1000 Used samples: 501 Extremes: 0
     ## large : Reaction ~ Days + (1 | Subject) + (0 + Days | Subject)
     ## Reaction ~ Days + (1 | Subject)
    @@ -3709,13 +3720,12 @@ 

    Commercial:

    Package versions used

    sessionInfo()
    -
    ## R Under development (unstable) (2023-10-01 r85245)
    +
    ## R Under development (unstable) (2023-09-20 r85179)
     ## Platform: x86_64-pc-linux-gnu
     ## Running under: Pop!_OS 22.04 LTS
     ## 
     ## Matrix products: default
    -## BLAS:   /usr/local/lib/R/lib/libRblas.so 
    -## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3;  LAPACK version 3.10.0
    +## BLAS/LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0
     ## 
     ## locale:
     ##  [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C              
    @@ -3729,41 +3739,40 @@ 

    Package versions used

    ## tzcode source: system (glibc) ## ## attached base packages: -## [1] stats graphics grDevices datasets utils methods base +## [1] stats graphics grDevices utils datasets methods base ## ## other attached packages: -## [1] ggplot2_3.4.2 RLRsim_3.1-8 nlme_3.1-163 -## [4] dplyr_1.1.2 broom.mixed_0.2.9.5 glmmTMB_1.1.8 -## [7] equatiomatic_0.3.1 lme4_1.1-34.9000 Matrix_1.6-1.1 -## [10] Cairo_1.6-0 pander_0.6.5 knitr_1.43 +## [1] ggplot2_3.4.3 RLRsim_3.1-8 nlme_3.1-163 +## [4] dplyr_1.1.3 broom.mixed_0.2.9.5 glmmTMB_1.1.8-9000 +## [7] equatiomatic_0.3.1 lme4_1.1-34 Matrix_1.6-1.1 +## [10] Cairo_1.6-1 pander_0.6.5 knitr_1.44 ## ## loaded via a namespace (and not attached): -## [1] gtable_0.3.3 TMB_1.9.6 xfun_0.39 -## [4] bslib_0.5.0 lattice_0.21-8 bspm_0.5.3 -## [7] numDeriv_2016.8-1.1 vctrs_0.6.3 tools_4.4.0 -## [10] generics_0.1.3 sandwich_3.0-2 parallel_4.4.0 -## [13] tibble_3.2.1 fansi_1.0.4 highr_0.10 -## [16] pkgconfig_2.0.3 lifecycle_1.0.3 farver_2.1.1 -## [19] compiler_4.4.0 munsell_0.5.0 codetools_0.2-19 -## [22] httpuv_1.6.11 htmltools_0.5.5 sass_0.4.7 -## [25] yaml_2.3.7 crayon_1.5.2 later_1.3.1 -## [28] pillar_1.9.0 furrr_0.3.1 nloptr_2.0.3 -## [31] jquerylib_0.1.4 tidyr_1.3.0 MASS_7.3-60.1 -## [34] ellipsis_0.3.2 cachem_1.0.8 boot_1.3-28.1 -## [37] multcomp_1.4-25 mime_0.12 parallelly_1.36.0 -## [40] tidyselect_1.2.0 digest_0.6.33 mvtnorm_1.2-3 -## [43] future_1.33.0 purrr_1.0.1 listenv_0.9.0 -## [46] labeling_0.4.2 forcats_1.0.0 splines_4.4.0 -## [49] fastmap_1.1.1 grid_4.4.0 colorspace_2.1-0 -## [52] cli_3.6.1 magrittr_2.0.3 survival_3.5-7 -## [55] utf8_1.2.3 TH.data_1.1-2 broom_1.0.5 -## [58] withr_2.5.0 scales_1.2.1 promises_1.2.1 -## [61] backports_1.4.1 estimability_1.4.1 rmarkdown_2.23 -## [64] emmeans_1.8.8 globals_0.16.2 zoo_1.8-12 -## [67] coda_0.19-4 shiny_1.7.5 evaluate_0.18 -## [70] mgcv_1.9-0 rlang_1.1.1 Rcpp_1.0.11 -## [73] xtable_1.8-4 glue_1.6.2 minqa_1.2.6 -## [76] jsonlite_1.8.7 R6_2.5.1
    +## [1] gtable_0.3.4 TMB_1.9.6 xfun_0.40 +## [4] bslib_0.5.1 lattice_0.21-9 numDeriv_2016.8-1.1 +## [7] vctrs_0.6.3 tools_4.4.0 generics_0.1.3 +## [10] parallel_4.4.0 sandwich_3.0-2 tibble_3.2.1 +## [13] fansi_1.0.4 pkgconfig_2.0.3 lifecycle_1.0.3 +## [16] farver_2.1.1 compiler_4.4.0 munsell_0.5.0 +## [19] codetools_0.2-19 httpuv_1.6.11 htmltools_0.5.6 +## [22] sass_0.4.7 yaml_2.3.7 crayon_1.5.2 +## [25] later_1.3.1 pillar_1.9.0 furrr_0.3.1 +## [28] nloptr_2.0.3 jquerylib_0.1.4 tidyr_1.3.0 +## [31] MASS_7.3-60.1 ellipsis_0.3.2 cachem_1.0.8 +## [34] boot_1.3-28.1 multcomp_1.4-25 mime_0.12 +## [37] parallelly_1.36.0 tidyselect_1.2.0 digest_0.6.33 +## [40] mvtnorm_1.2-3 future_1.33.0 purrr_1.0.2 +## [43] listenv_0.9.0 labeling_0.4.3 forcats_1.0.0 +## [46] splines_4.4.0 fastmap_1.1.1 grid_4.4.0 +## [49] colorspace_2.1-0 cli_3.6.1 magrittr_2.0.3 +## [52] survival_3.5-7 utf8_1.2.3 TH.data_1.1-2 +## [55] broom_1.0.5 withr_2.5.1 scales_1.2.1 +## [58] promises_1.2.1 backports_1.4.1 estimability_1.4.1 +## [61] rmarkdown_2.25 emmeans_1.8.8 globals_0.16.2 +## [64] zoo_1.8-12 coda_0.19-4 shiny_1.7.5 +## [67] evaluate_0.22 mgcv_1.9-0 rlang_1.1.1 +## [70] Rcpp_1.0.11 xtable_1.8-4 glue_1.6.2 +## [73] minqa_1.2.6 jsonlite_1.8.7 R6_2.5.1

    To do

    @@ -3781,7 +3790,7 @@

    To do

    Bibliography

    -
    +
    Agresti, Alan. 2002. Categorical Data Analysis. 2d ed. Hoboken, NJ: Wiley. @@ -3823,13 +3832,6 @@

    Bibliography

    Likelihood Methods for Eliminating Nuisance Parameters.” Statistical Science 14 (1): 1–22. http://projecteuclid.org/download/pdf_1/euclid.ss/1009211804.
    -
    -Booth, James G., and James P. Hobert. 1999. “Maximizing -Generalized Linear Mixed Model Likelihoods with an Automated -Monte Carlo EM Algorithm.” -Journal of the Royal Statistical Society. Series B 61 (1): -265–85. https://doi.org/10.1111/1467-9868.00176. -
    Breslow, N. E. 1984. “Extra-Poisson Variation in Log-Linear Models.” Journal of the Royal Statistical Society @@ -3941,11 +3943,6 @@

    Bibliography

    Modelling Overdispersion in Binomial Data in Ecology and Evolution.” PeerJ 3 (July): e1114. https://doi.org/10.7717/peerj.1114.
    -
    -He, Hua, Hui Zhang, Peng Ye, and Wan Tang. 2019. “A Test of -Inflated Zeros for Poisson Regression Models.” -Statistical Methods in Medical Research 28 (4): 1157–69. https://doi.org/10.1177/0962280217749991. -
    Heisterkamp, Simon H., Engelbertus van Willigen, Paul-Matthias Diderichsen, and John Maringwa. 2017. “Update of the Nlme @@ -3979,11 +3976,6 @@

    Bibliography

    Linear Mixed Model.”
    Journal of Applied Statistics 44 (6): 1086–1105. https://doi.org/10.1080/02664763.2016.1193725.
    -
    -Jin, Shaobo, and Youngjo Lee. 2021. “A Review of h-Likelihood and -Hierarchical Generalized Linear Model.” WIREs Computational -Statistics 13 (5): e1527. https://doi.org/10.1002/wics.1527. -
    Johnson, Paul C. D. 2014. “Extension of Nakagawa & Schielzeth’s R2GLMM to Random Slopes @@ -4002,11 +3994,6 @@

    Bibliography

    Among Treatment Variation in Random Effects.”
    PeerJ 3 (September): e1226. https://doi.org/10.7717/peerj.1226.
    -
    -Knudson, Christina, Sydney Benson, Charles Geyer, and Galin Jones. 2021. -“Likelihood-Based Inference for Generalized Linear Mixed Models: -Inference with the R Package glmm.” Stat 10 (1): e339. https://doi.org/10.1002/sta4.339. -
    Lawson, A., A. Biggeri, D. Bohning, E. LeSaffre, J. F. Viel, and R. Bertollini, eds. 1999. Disease Mapping and Risk Assessment for @@ -4060,18 +4047,6 @@

    Bibliography

    Matter.” Statistical Science 26 (3): 388–402. https://doi.org/10.1214/11-STS361.
    -
    -Meng, Xiao-Li. 2009. “Decoding the H-likelihood.” Statistical Science -24 (3). https://doi.org/10.1214/09-STS277C. -
    -
    -———. 2011. “What’s the H in -H-Likelihood: A Holy Grail or an -AchillesHeel?” In Bayesian -Statistics 9, edited by José M. Bernardo, M. J. -Bayarri, James O. Berger, A. P. Dawid, David Heckerman, Adrian F. M. -Smith, and Mike West, 0. Oxford University Press. https://doi.org/10.1093/acprof:oso/9780199694587.003.0016. -
    Millar, Russell B. 2011. Maximum Likelihood Estimation and Inference: With Examples in r, SAS and @@ -4181,21 +4156,11 @@

    Bibliography

    Venables, W., and Brian D. Ripley. 2002. Modern Applied Statistics with s. 4th ed. New York: Springer.
    -
    -Vuong, Quang H. 1989. “Likelihood Ratio Tests for -Model Selection and Non-Nested -Hypotheses.” Econometrica 57 (2): 307–33. https://doi.org/10.2307/1912557. -
    Warton, David I. 2005. “Many Zeros Does Not Mean Zero Inflation: Comparing the Goodness-of-Fit of Parametric Models to Multivariate Abundance Data.” Environmetrics 16 (3): 275–89. https://doi.org/10.1002/env.702.
    -
    -Wilson, Paul. 2015. “The Misuse of the Vuong Test for -Non-Nested Models to Test for Zero-Inflation.” Economics -Letters 127 (February): 51–53. https://doi.org/10.1016/j.econlet.2014.12.029. -
    Wolfinger, Russ, and Michael O’Connell. 1993. “Generalized Linear Mixed Models a Pseudo-Likelihood Approach.” Journal of @@ -4230,7 +4195,7 @@

    Bibliography

    -
    LS0tCmF1dGhvcjogQmVuIEJvbGtlciBhbmQgb3RoZXJzCnRpdGxlOiBHTE1NIEZBUQpiaWJsaW9ncmFwaHk6IGdsbW0uYmliCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlYiAlWScpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICB0b2M6IHRydWUKLS0tCgo8IS0tIEdvb2dsZSB0YWcgKGd0YWcuanMpIC0tPgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1HLUtZMUpZMEM1M1MiPjwvc2NyaXB0Pgo8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwoKICBndGFnKCdjb25maWcnLCAnRy1LWTFKWTBDNTNTJyk7Cjwvc2NyaXB0PgoKYGBge3Igc2V0dXAsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2LmFyZ3MgPSBsaXN0KHBuZyA9IGxpc3QodHlwZSA9ICJjYWlybyIpKSkKbGlicmFyeShwYW5kZXIpCmxpYnJhcnkoQ2Fpcm8pCmBgYAoKYGBge3IgcGtncywgZXZhbD1GQUxTRSxlY2hvPUZBTFNFfQpwa2dzIDwtIGMoImxtZTQiLCJnbG1tQURNQiIsInNvcyIsImJsbWUiLCJSTFJzaW0iLCJnZ3Bsb3QyIiwgIk1FTVNTIikKaTEgPC0gaW5zdGFsbGVkLnBhY2thZ2VzKCkKcGtncyA8LSBzZXRkaWZmKHBrZ3MsIHJvd25hbWVzKGkxKSkKcmVwb3MgPC0gYygiaHR0cDovL2dsbW1hZG1iLnItZm9yZ2Uuci1wcm9qZWN0Lm9yZy9yZXBvcyIsCiAgICAgICAgICAgIGdldE9wdGlvbigicmVwb3MiKSkKaWYgKGxlbmd0aChwa2dzKT4wKSAKICAgIGluc3RhbGwucGFja2FnZXMocGtncyxyZXBvcz1yZXBvcywgdHlwZT0ic291cmNlIikKYGBgCgojIEludHJvZHVjdGlvbgoKVGhpcyBpcyBhbiBpbmZvcm1hbCBGQVEgbGlzdCBmb3IgdGhlIGByLXNpZy1taXhlZC1tb2RlbHNgIG1haWxpbmcgbGlzdC4KClRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25zIGZvciBtaXhlZCBtb2RlbGluZyBpbiBSIGFyZSAKCi0gKmxpbmVhciBtaXhlZCBtb2RlbHMqOiBgYW92KClgLCBgbmxtZTo6bG1lYFteMV0sIGBsbWU0OjpsbWVyYDsgYGJybXM6OmJybWAKLSAqZ2VuZXJhbGl6ZWQgbGluZWFyIG1peGVkIG1vZGVscyogKEdMTU1zKQogICAgLSBmcmVxdWVudGlzdDogYE1BU1M6OmdsbW1QUUxgLCBgbG1lNDo6Z2xtZXJgOyBgZ2xtbVRNQmAKICAgIC0gQmF5ZXNpYW46IGBNQ01DZ2xtbTo6TUNNQ2dsbW1gOyBgYnJtczo6YnJtYAotICpub25saW5lYXIgbWl4ZWQgbW9kZWxzKjogYG5sbWU6Om5sbWVgLCBgbG1lNDo6bmxtZXJgOyBgYnJtczo6YnJtYAotICpHTkxNTXMqOiBgYnJtczo6YnJtYAkKClteMV06IGluIFIsIGBmb286OmJhcmAgKG9yIGBmb286OmJhcigpYCkgZGVub3RlcyAiZnVuY3Rpb24gYGJhcmAgaW4gcGFja2FnZSBgZm9vYCIpLgoKQW5vdGhlciBxdWljay1hbmQtZGlydHkgd2F5IHRvIHNlYXJjaCBmb3IgbWl4ZWQtbW9kZWwgcmVsYXRlZCBwYWNrYWdlcyBvbiBDUkFOOgoKYGBge3IgYXZhaWwsY2FjaGU9VFJVRX0KZ3JlcCgibC4/bVttZV1bXnRdIixyb3duYW1lcyhhdmFpbGFibGUucGFja2FnZXMoKSksdmFsdWU9VFJVRSkKYGBgCgpUaGVyZSBhcmUgc29tZSBmYWxzZSBwb3NpdGl2ZXMgaGVyZSAoZS5nLiBgcGFsbWVycGVuZ3VpbnNgKTsgc2VlIFtoZXJlXShodHRwczovL3hrY2QuY29tLzEzMTMvKSBpZiB5b3UncmUgaW50ZXJlc3RlZCBpbiAicmVnZXggZ29sZiIuCgojIyBPdGhlciBzb3VyY2VzIG9mIGhlbHAKCi0gdGhlIG1haWxpbmcgbGlzdCBpcyBgci1zaWctbWl4ZWQtbW9kZWxzQHItcHJvamVjdC5vcmdgCiAgICAtIHNpZ24gdXAgW2hlcmVdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL21haWxtYW4vbGlzdGluZm8vci1zaWctbWl4ZWQtbW9kZWxzKQoJLSBhcmNoaXZlcyBbaGVyZV0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvcGlwZXJtYWlsL3Itc2lnLW1peGVkLW1vZGVscy8pCgktIG9yIEdvb2dsZSBzZWFyY2ggd2l0aCB0aGUgdGFnIGBzaXRlOmh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLXNpZy1taXhlZC1tb2RlbHMvYAotIFRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBbb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vYmJvbGtlci9taXhlZG1vZGVscy1taXNjL2Jsb2IvbWFzdGVyL2dsbW1GQVEucm1kKTsgdGhlIHJlbmRlcmVkIChIVE1MKSB2ZXJzaW9uIGxpdmVzIG9uIFtHaXRIdWIgcGFnZXNdKGh0dHA6Ly9iYm9sa2VyLmdpdGh1Yi5pby9taXhlZG1vZGVscy1taXNjL2dsbW1GQVEuaHRtbCkuCi0gU2VhcmNoaW5nIG9uIFN0YWNrT3ZlcmZsb3cgd2l0aCB0aGUgW1tyXSBbbWl4ZWQtbW9kZWxzXSB0YWdzXShodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zL3RhZ2dlZC9yJTIwbWl4ZWQtbW9kZWxzP21vZGU9YWxsKSwgb3Igb24gQ3Jvc3NWYWxpZGF0ZWQgd2l0aCB0aGUgW1ttaXhlZC1tb2RlbF0gdGFnXShodHRwOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zL3RhZ2dlZC9taXhlZC1tb2RlbCkgbWF5IGJlIGhlbHBmdWwgKHRoZXNlIHNpdGVzIGFsc28gaGF2ZSBhbiBgW2xtZTRdYCB0YWcpLgoKCioqRElTQ0xBSU1FUlM6KioKCi0gKEcpTE1NcyBhcmUgaGFyZCAtIGhhcmRlciB0aGFuIHlvdSBtYXkgdGhpbmsgYmFzZWQgb24gd2hhdCB5b3UgbWF5IGhhdmUgbGVhcm5lZCBpbiB5b3VyIHNlY29uZCBzdGF0aXN0aWNzIGNsYXNzLCB3aGljaCBwcm9iYWJseSBmb2N1c2VkIG9uIHBpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIHN1bXMgb2Ygc3F1YXJlcyB0ZXJtcyBhbmQgZGVncmVlcyBvZiBmcmVlZG9tIGZvciB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBvZiBhbiAkRiQgdGVzdC4gJ01vZGVybicgbWl4ZWQgbW9kZWwgYXBwcm9hY2hlcywgYWx0aG91Z2ggbW9yZSBwb3dlcmZ1bCAodGhleSBjYW4gaGFuZGxlIG1vcmUgY29tcGxleCBkZXNpZ25zLCBsYWNrIG9mIGJhbGFuY2UsIGNyb3NzZWQgcmFuZG9tIGZhY3RvcnMsIHNvbWUga2luZHMgb2Ygbm9uLU5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJlc3BvbnNlcywgZXRjLiksIGFsc28gcmVxdWlyZSBhIG5ldyBzZXQgb2YgY29uY2VwdHVhbCB0b29scy4gSW4gb3JkZXIgdG8gdXNlIHRoZXNlIHRvb2xzIHlvdSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBhIGdlbmVyYWwgYWNxdWFpbnRhbmNlIHdpdGggY2xhc3NpY2FsIG1peGVkLW1vZGVsIGV4cGVyaW1lbnRhbCBkZXNpZ25zIGJ1dCB5b3Ugc2hvdWxkIGFsc28sIHByb2JhYmx5LCByZWFkIHNvbWV0aGluZyBhYm91dCBtb2Rlcm4gbWl4ZWQgbW9kZWwgYXBwcm9hY2hlcy4gQGxpdHRlbGxfc2FzXzIwMDYgYW5kIEBwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDAgYXJlIHR3byBwbGFjZXMgdG8gc3RhcnQsIGFsdGhvdWdoIFBpbmhlaXJvIGFuZCBCYXRlcyBpcyBwcm9iYWJseSBtb3JlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgUi4gT3RoZXIgdXNlZnVsIHJlZmVyZW5jZXMgaW5jbHVkZSBAZ2VsbWFuX2RhdGFfMjAwNiAoZm9jdXNlZCBvbiBCYXllc2lhbiBtZXRob2RzKSBhbmQgQHp1dXJfbWl4ZWRfMjAwOS4gSWYgeW91IGFyZSBnb2luZyB0byB1c2UgZ2VuZXJhbGl6ZWQgbGluZWFyIG1peGVkIG1vZGVscywgeW91IHNob3VsZCB1bmRlcnN0YW5kIGdlbmVyYWxpemVkIGxpbmVhciBtb2RlbHMgKEBkb2Jzb25faW50cm9kdWN0aW9uXzIwMDgsIEBmYXJhd2F5X2V4dGVuZGluZ18yMDA2LCBhbmQgQE1jQ3VsbGFnaE5lbGRlcjE5ODkgYXJlIHN0YW5kYXJkIHJlZmVyZW5jZXM7IHRoZSBsYXN0IGlzIHRoZSBjYW5vbmljYWwgcmVmZXJlbmNlLCBidXQgYWxzbyB0aGUgbW9zdCBjaGFsbGVuZ2luZykuCi0gQWxsIG9mIHRoZSBpc3N1ZXMgdGhhdCBhcmlzZSB3aXRoIHJlZ3VsYXIgbGluZWFyIG9yIGdlbmVyYWxpemVkLWxpbmVhciBtb2RlbGluZyAoZS5nLjogaW5hZGVxdWFjeSBvZiBwLXZhbHVlcyBhbG9uZSBmb3IgdGhvcm91Z2ggc3RhdGlzdGljYWwgYW5hbHlzaXM7IG5lZWQgdG8gIHVuZGVyc3RhbmQgaG93IG1vZGVscyBhcmUgcGFyYW1ldGVyaXplZDsgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwcmluY2lwbGUgb2YgbWFyZ2luYWxpdHkgYW5kIGhvdyBpbnRlcmFjdGlvbnMgY2FuIGJlIHRyZWF0ZWQ7IGRhbmdlcnMgb2Ygb3ZlcmZpdHRpbmcsIHdoaWNoIGFyZSBub3QgbWl0aWdhdGVkIGJ5IHN0ZXB3aXNlIHByb2NlZHVyZXM7IHRoZSBub24tZXhpc3RlbmNlIG9mIGZyZWUgbHVuY2hlcykgYWxzbyBhcHBseSwgYW5kIGNhbiBhcHBseSBtb3JlIHNldmVyZWx5LCB0byBtaXhlZCBtb2RlbHMuCiogV2hlbiBTQVMgKG9yIFN0YXRhLCBvciBHZW5zdGF0L0FTLVJFTUwgb3IgLi4uKSBhbmQgUiBkaWZmZXIgaW4gdGhlaXIgYW5zd2VycywgUiBtYXkgbm90IGJlIHdyb25nLiBCb3RoIFNBUyBhbmQgUiBtYXkgYmUgYHJpZ2h0JyBidXQgcHJvY2VlZGluZyBpbiBhIGRpZmZlcmVudCB3YXkvYW5zd2VyaW5nIGRpZmZlcmVudCBxdWVzdGlvbnMvdXNpbmcgYSBkaWZmZXJlbnQgcGhpbG9zb3BoaWNhbCBhcHByb2FjaCAob3IgYm90aCBtYXkgYmUgd3JvbmcgLi4uKQotIFRoZSBhZHZpY2UgaW4gdGhpcyBGQVEgY29tZXMgd2l0aCAqKmFic29sdXRlbHkgbm8gd2FycmFudHkgb2YgYW55IHNvcnQqKi4KCiMgUmVmZXJlbmNlcwoKIyMgbGluZWFyIG1peGVkIG1vZGVscwoKIyMjIHdlYi9vcGVuCgotIFtVQ0xBIElEUkUgc3RhdGlzdGljYWwgY29uc3VsdGluZ10oaHR0cHM6Ly9zdGF0cy5pZHJlLnVjbGEuZWR1L290aGVyL211bHQtcGtnL2ludHJvZHVjdGlvbi10by1saW5lYXItbWl4ZWQtbW9kZWxzLykKLSBAYmFycl9sZWFybmluZ18yMDIwIENoYXB0ZXJzIDUtOAoKIyMjIGJvb2tzIChkZWFkLXRyZWUvY2xvc2VkKQoKLSBwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDA6IExNTSBvbmx5LgotIEB6dXVyX21peGVkXzIwMDk6IEZvY3VzZWQgb24gZWNvbG9neS4KLSBAZ2VsbWFuX2RhdGFfMjAwNjogTE1NIGFuZCBHTE1NOyBCYXllc2lhbjsgZXhhbXBsZXMgZnJvbSBzb2NpYWwgc2NpZW5jZS4gSW50ZXJtZWRpYXRlIG1hdGhlbWF0aWNzLgotIChSZXRoaW5raW5nKQoKIyBNb2RlbCBkZWZpbml0aW9uCgojIyBNb2RlbCBzcGVjaWZpY2F0aW9uCgpUaGUgZm9sbG93aW5nIGZvcm11bGEgZXh0ZW5zaW9ucyBmb3Igc3BlY2lmeWluZyByYW5kb20tZWZmZWN0cyBzdHJ1Y3R1cmVzIGluIFIgYXJlIHVzZWQgYnkgCgotIGBsbWU0YAotIGBubG1lYCAobmVzdGVkIGVmZmVjdHMgb25seSwgYWx0aG91Z2ggY3Jvc3NlZCBlZmZlY3RzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBtb3JlIHdvcmspCi0gYGdsbW1BRE1CYCBhbmQgYGdsbW1UTUJgIAoKYE1DTUNnbG1tYCB1c2VzIGEgZGlmZmVyZW50IHNwZWNpZmljYXRpb24sIGluaGVyaXRlZCBmcm9tIEFTLVJFTUwuCgooTW9kaWZpZWQgZnJvbSBSb2JpbiBKZWZmcmllcywgVUNMQTopCgpgYGB7ciBnbG1tX3N5bnRheCxlY2hvPUZBTFNFfQpzcGVjdGFiIDwtIHJlYWQudGFibGUoc2VwPSImIixoZWFkZXI9VFJVRSx0ZXh0PSIKZm9ybXVsYSAgICAgJiBtZWFuaW5nCmAoMXxncm91cClgICYgIHJhbmRvbSBncm91cCBpbnRlcmNlcHQKYCh4fGdyb3VwKWAgPSBgKDEreHxncm91cClgICYgcmFuZG9tIHNsb3BlIG9mIHggd2l0aGluIGdyb3VwIHdpdGggY29ycmVsYXRlZCBpbnRlcmNlcHQKYCgwK3h8Z3JvdXApYCA9IGAoLTEreHxncm91cClgICYgcmFuZG9tIHNsb3BlIG9mIHggd2l0aGluIGdyb3VwOiBubyB2YXJpYXRpb24gaW4gaW50ZXJjZXB0CmAoMXxncm91cCkgKyAoMCt4fGdyb3VwKWAgICYgdW5jb3JyZWxhdGVkIHJhbmRvbSBpbnRlcmNlcHQgYW5kIHJhbmRvbSBzbG9wZSB3aXRoaW4gZ3JvdXAKYCgxfHNpdGUvYmxvY2spYCA9IGAoMXxzaXRlKSsoMXxzaXRlOmJsb2NrKWAgJiBpbnRlcmNlcHQgdmFyeWluZyBhbW9uZyBzaXRlcyBhbmQgYW1vbmcgYmxvY2tzIHdpdGhpbiBzaXRlcyAobmVzdGVkIHJhbmRvbSBlZmZlY3RzKQpgc2l0ZSsoMXxzaXRlOmJsb2NrKWAgJiAqZml4ZWQqIGVmZmVjdCBvZiBzaXRlcyBwbHVzIHJhbmRvbSB2YXJpYXRpb24gaW4gaW50ZXJjZXB0IGFtb25nIGJsb2NrcyB3aXRoaW4gc2l0ZXMKYCh4fHNpdGUvYmxvY2spYCA9IGAoeHxzaXRlKSsoeHxzaXRlOmJsb2NrKWAgPSBgKDEgKyB4fHNpdGUpKygxK3h8c2l0ZTpibG9jaylgICYgc2xvcGUgYW5kIGludGVyY2VwdCB2YXJ5aW5nIGFtb25nIHNpdGVzIGFuZCBhbW9uZyBibG9ja3Mgd2l0aGluIHNpdGVzCmAoeDF8c2l0ZSkrKHgyfGJsb2NrKWAgJiB0d28gZGlmZmVyZW50IGVmZmVjdHMsIHZhcnlpbmcgYXQgZGlmZmVyZW50IGxldmVscwpgeCpzaXRlKyh4fHNpdGU6YmxvY2spYCAmIGZpeGVkIGVmZmVjdCB2YXJpYXRpb24gb2Ygc2xvcGUgYW5kIGludGVyY2VwdCB2YXJ5aW5nIGFtb25nIHNpdGVzIGFuZCByYW5kb20gdmFyaWF0aW9uIG9mIHNsb3BlIGFuZCBpbnRlcmNlcHQgYW1vbmcgYmxvY2tzIHdpdGhpbiBzaXRlcwpgKDF8Z3JvdXAxKSsoMXxncm91cDIpYCAmIGludGVyY2VwdCB2YXJ5aW5nIGFtb25nIGNyb3NzZWQgcmFuZG9tIGVmZmVjdHMgKGUuZy4gc2l0ZSwgeWVhcikiKQpzZXQuYWxpZ25tZW50KGRlZmF1bHQ9YygiY2VudHJlIiwibGVmdCIpKQpwYW5kZXIoc3BlY3RhYikKYGBgCgpPciBpbiBhIGxpdHRsZSBtb3JlIGRldGFpbDoKCmBgYHtyIGZ0YWIsZWNobz1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KZnRhYiA8LSBtYXRyaXgoYygizrJfMCArIM6yX3sxfVhfe2l9ICsgZV97c2l9IiwKICAgICAgICAgICAgICAgICAibi9hIChOb3QgYSBtaXhlZC1lZmZlY3RzIG1vZGVsKSIsCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97Uywwc30pICsgzrJfezF9WF9pICsgZV97c2l9IiwKICAgICAgICAgICAgICAgICAi4oi8IFggKyAoMeKIo1N1YmplY3QpIiwKICAgICAgICAgICAgICAgICAiKM6yXzAgKyBiX3tTLDBzfSkgKyAgKM6yX3sxfSArIGJfe1MsMXN9KSBYX2kgKyBlX3tzaX0iLAogICAgICAgICAgICAgICAgICJ+IFggKyAoMSArIFjiiKNTdWJqZWN0KSIsCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97Uywwc30gKyBiX3tJLDBpfSkgKyAozrJfezF9ICsgYl97Uywxc30pIFhfaSArIGVfe3NpfSIsCiAgICAgICAgICAgICAgICAgIuKIvCBYICsgKDEgKyBY4oijU3ViamVjdCkgKyAoMeKIo0l0ZW0pIiwKICAgICAgICAgICAgICAgICAiQXMgYWJvdmUsIGJ1dCAkU197MHN9JCwgJFNfezFzfSQgaW5kZXBlbmRlbnQiLAogICAgICAgICAgICAgICAgICLiiLwgWCArICgx4oijU3ViamVjdCkgKyAoMCArIFjiiKMgU3ViamVjdCkgKyAoMeKIo0l0ZW0pIiwgCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97Uywwc30gKyBiX3tJLDBpfSkgKyDOsl97MX1YX2kgKyBlX3tzaX0iLAogICAgICAgICAgICAgICAgICLiiLwgWCArICgx4oijU3ViamVjdCkgKyAoMeKIo0l0ZW0pIiwgCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97SSwwaX0pICsgICjOsl97MX0gKyBiX3tTLDFzfSlYX2kgKyBlX3tzaX0iLAogICAgICAgICAgICAgICAgICLiiLwgWCArICgwICsgWOKIo1N1YmplY3QpICsgKDHiiKNJdGVtKSIpLAogICAgICAgICAgICAgICBieXJvdz1UUlVFLG5jb2w9MiwKICAgICAgICAgICAgICAgZGltbmFtZXM9bGlzdChOVUxMLGMoImVxdWF0aW9uIiwiZm9ybXVsYSIpKSkKZnRhYiA8LSBkYXRhLmZyYW1lKGZ0YWIsc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKZmYgPC0gIWdyZXBsKCJBcyBhYm92ZSIsZnRhYiRlcXVhdGlvbikKZnRhYiRlcXVhdGlvbltmZl0gPC0gc3ByaW50ZigiJCVzJCIsZnRhYiRlcXVhdGlvbltmZl0pCmZmIDwtICFncmVwbCgibi9hIixmdGFiJGZvcm11bGEpCmZ0YWIkZm9ybXVsYVtmZl0gPC0gc3ByaW50ZigiYCVzYCIsZnRhYiRmb3JtdWxhW2ZmXSkKcGFuZGVyOjpwYW5kZXIoZnRhYixqdXN0aWZ5PSJsZWZ0IikKYGBgCgpNb2RpZmllZCBmcm9tOiBodHRwOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEzMTY2L3JzLWxtZXItY2hlYXQtc2hlZXQ/bHE9MSAoTGl2aXVzKQoKClRoZSAqKm1hZ2ljKiogZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiB0aGUgW2VxdWF0aW9tYXRpYyBwYWNrYWdlXShodHRwczovL2dpdGh1Yi5jb20vZGF0YWxvcmF4L2VxdWF0aW9tYXRpYykgY2FuIGhhbmRsZSBtaXhlZCBtb2RlbHMgKGByZW1vdGVzOjppbnN0YWxsX2dpdGh1YigiZGF0YWxvcmF4L2VxdWF0aW9tYXRpYyIpYCksIGUuZy4KCmBgYHtyIGVxdWF0aW9tYXRpYywgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iYXNpcyJ9CmxpYnJhcnkobG1lNCkKbGlicmFyeShlcXVhdGlvbWF0aWMpCmZtMSA8LSBsbWVyKFJlYWN0aW9uIH4gRGF5cyArIChEYXlzfFN1YmplY3QpLCBzbGVlcHN0dWR5KQplcXVhdGlvbWF0aWM6OmV4dHJhY3RfZXEoZm0xKQpgYGAKCkl0IGRvZXNuJ3QgaGFuZGxlIEdMTU1zICh5ZXQpLCBidXQgeW91IGNvdWxkIGZpdCB0d28gZmFrZSBtb2RlbHMgJm1kYXNoOyBvbmUgTE1NIGxpa2UgeW91ciBHTE1NIGJ1dCB3aXRoIGEgR2F1c3NpYW4gcmVzcG9uc2UsIGFuZCBvbmUgR0xNIHdpdGggdGhlIHNhbWUgZmFtaWx5L2xpbmsgZnVuY3Rpb24gYXMgeW91ciBHTE1NIGJ1dCB3aXRob3V0IHRoZSByYW5kb20gZWZmZWN0cyAmbWRhc2g7IGFuZCBwdXQgdGhlIHBpZWNlcyB0b2dldGhlci4KCk1vcmUgcG9zc2libHkgdXNlZnVsIGxpbmtzOgoKLSBSZW5zZSBOaWV1d2VuaHVpcydzIFtibG9ncG9zdC9sZXNzb24gb24gbG1lNCBtb2RlbCBzcGVjaWZpY2F0aW9uXShodHRwOi8vd3d3LnJlbnNlbmlldXdlbmh1aXMubmwvci1zZXNzaW9ucy0xNi1tdWx0aWxldmVsLW1vZGVsLXNwZWNpZmljYXRpb24tbG1lNC8pCi0gQ3Jvc3NWYWxpZGF0ZWQncyBbbG1lciBjaGVhdCBzaGVldF0oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTMxNjYvcnMtbG1lci1jaGVhdC1zaGVldCkKLSBLcmlzdG9mZmVyIE1hZ251c3NvbidzIFtVc2luZyBSIGFuZCBsbWUvbG1lciB0byBmaXQgZGlmZmVyZW50IHR3by0gYW5kIHRocmVlLWxldmVsIGxvbmdpdHVkaW5hbCBtb2RlbHNdKGh0dHBzOi8vcnBzeWNob2xvZ2lzdC5jb20vci1ndWlkZS1sb25naXR1ZGluYWwtbG1lLWxtZXIpCgojIyBTaG91bGQgSSB0cmVhdCBmYWN0b3IgeHh4IGFzIGZpeGVkIG9yIHJhbmRvbT8KClRoaXMgaXMgaW4gZ2VuZXJhbCBhIGZhciBtb3JlIGRpZmZpY3VsdCBxdWVzdGlvbiB0aGFuIGl0IHNlZW1zIG9uIHRoZSBzdXJmYWNlLiBUaGVyZSBhcmUgbWFueSBjb21wZXRpbmcgcGhpbG9zb3BoaWVzIGFuZCBkZWZpbml0aW9ucy4gRm9yIGV4YW1wbGUsIGZyb20gQGdlbG1hbl9hbmFseXNpc18yMDA1OgoKPiBCZWZvcmUgZGlzY3Vzc2luZyB0aGUgdGVjaG5pY2FsIGlzc3Vlcywgd2UgYnJpZWZseSByZXZpZXcgd2hhdCBpcyBtZWFudCBieSBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdHMuIEl0IHR1cm5zIG91dCB0aGF0IGRpZmZlcmVudOKAlGluIGZhY3QsIGluY29tcGF0aWJsZeKAlGRlZmluaXRpb25zIGFyZSB1c2VkIGluIGRpZmZlcmVudCBjb250ZXh0cy4gW1NlZSBhbHNvIEtyZWZ0IGFuZCBkZSBMZWV1dyAoMTk5OCksIFNlY3Rpb24gMS4zLjMsIGZvciBhIGRpc2N1c3Npb24gb2YgdGhlIG11bHRpcGxpY2l0eSBvZiBkZWZpbml0aW9ucyBvZiBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdHMgYW5kIGNvZWZmaWNpZW50cywgYW5kIFJvYmluc29uICgxOTk4KSBmb3IgYSBoaXN0b3JpY2FsIG92ZXJ2aWV3Ll0gSGVyZSB3ZSBvdXRsaW5lIGZpdmUgZGVmaW5pdGlvbnMgdGhhdCB3ZSBoYXZlIHNlZW46IDEuIEZpeGVkIGVmZmVjdHMgYXJlIGNvbnN0YW50IGFjcm9zcyBpbmRpdmlkdWFscywgYW5kIHJhbmRvbSBlZmZlY3RzIHZhcnkuIEZvciBleGFtcGxlLCBpbiBhIGdyb3d0aCBzdHVkeSwgYSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIM6xaSBhbmQgZml4ZWQgc2xvcGUgzrIgY29ycmVzcG9uZHMgdG8gcGFyYWxsZWwgbGluZXMgZm9yIGRpZmZlcmVudCBpbmRpdmlkdWFscyBpLCBvciB0aGUgbW9kZWwgeWl0ID0gzrFpICsgzrJ0LiBLcmVmdCBhbmQgZGUgTGVldXcgWygxOTk4KSwgcGFnZSAxMl0gdGh1cyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZpeGVkIGFuZCByYW5kb20gY29lZmZpY2llbnRzLiAyLiBFZmZlY3RzIGFyZSBmaXhlZCBpZiB0aGV5IGFyZSBpbnRlcmVzdGluZyBpbiB0aGVtc2VsdmVzIG9yIHJhbmRvbSBpZiB0aGVyZSBpcyBpbnRlcmVzdCBpbiB0aGUgdW5kZXJseWluZyBwb3B1bGF0aW9uLiBTZWFybGUsIENhc2VsbGEgYW5kIE1jQ3VsbG9jaCBbKDE5OTIpLCBTZWN0aW9uIDEuNF0gZXhwbG9yZSB0aGlzIGRpc3RpbmN0aW9uIGluIGRlcHRoLiAzLiDigJxXaGVuIGEgc2FtcGxlIGV4aGF1c3RzIHRoZSBwb3B1bGF0aW9uLCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBpcyBmaXhlZDsgd2hlbiB0aGUgc2FtcGxlIGlzIGEgc21hbGwgKGkuZS4sIG5lZ2xpZ2libGUpIHBhcnQgb2YgdGhlIHBvcHVsYXRpb24gdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgaXMgcmFuZG9t4oCdIFtHcmVlbiBhbmQgVHVrZXkgKDE5NjApXS4gNC4g4oCcSWYgYW4gZWZmZWN0IGlzIGFzc3VtZWQgdG8gYmUgYSByZWFsaXplZCB2YWx1ZSBvZiBhIHJhbmRvbSB2YXJpYWJsZSwgaXQgaXMgY2FsbGVkIGEgcmFuZG9tIGVmZmVjdOKAnSBbTGFNb3R0ZSAoMTk4MyldLiA1LiBGaXhlZCBlZmZlY3RzIGFyZSBlc3RpbWF0ZWQgdXNpbmcgbGVhc3Qgc3F1YXJlcyAob3IsIG1vcmUgZ2VuZXJhbGx5LCBtYXhpbXVtIGxpa2VsaWhvb2QpIGFuZCByYW5kb20gZWZmZWN0cyBhcmUgZXN0aW1hdGVkIHdpdGggc2hyaW5rYWdlIFvigJxsaW5lYXIgdW5iaWFzZWQgcHJlZGljdGlvbuKAnSBpbiB0aGUgdGVybWlub2xvZ3kgb2YgUm9iaW5zb24gKDE5OTEpXS4gVGhpcyBkZWZpbml0aW9uIGlzIHN0YW5kYXJkIGluIHRoZSBtdWx0aWxldmVsIG1vZGVsaW5nIGxpdGVyYXR1cmUgW3NlZSwgZS5nLiwgU25pamRlcnMgYW5kIEJvc2tlciAoMTk5OSksIFNlY3Rpb24gNC4yXSBhbmQgaW4gZWNvbm9tZXRyaWNzLgoKQW5vdGhlciB1c2VmdWwgY29tbWVudCAodmlhIEtldmluIFdyaWdodCkgcmVpbmZvcmNpbmcgdGhlIGlkZWEgdGhhdCAicmFuZG9tIHZzLiBmaXhlZCIgaXMgbm90IGEgc2ltcGxlLCBjdXQtYW5kLWRyaWVkIGRlY2lzaW9uOiBmcm9tIEBzY2hhYmVuYmVyZ2VyX2NvbnRlbXBvcmFyeV8yMDAxLCBwLiA2Mjc6Cgo+IEJlZm9yZSBwcm9jZWVkaW5nIGZ1cnRoZXIgd2l0aCByYW5kb20gZmllbGQgbGluZWFyIG1vZGVscyB3ZSBuZWVkIHRvIHJlbWluZCB0aGUgcmVhZGVyIG9mIHRoZSBhZGFnZSB0aGF0IG9uZSBtb2RlbGVyJ3MgcmFuZG9tIGVmZmVjdCBpcyBhbm90aGVyIG1vZGVsZXIncyBmaXhlZCBlZmZlY3QuCgpAY2xhcmsyMDE1c2hvdWxkIGFkZHJlc3MgdGhpcyBxdWVzdGlvbiBmcm9tIGEgbW9zdGx5IGVjb25vbWV0cmljIHBlcnNwZWN0aXZlLCBmb2N1c2luZyBtb3N0bHkgb24gcHJhY3RpY2FsIHZhcmlhbmNlL2JpYXMvUk1TRSBjcml0ZXJpYS4KCk9uZSBwb2ludCBvZiBwYXJ0aWN1bGFyIHJlbGV2YW5jZSB0byAnbW9kZXJuJyBtaXhlZCBtb2RlbCBlc3RpbWF0aW9uIChyYXRoZXIgdGhhbiAnY2xhc3NpY2FsJyBtZXRob2Qtb2YtbW9tZW50cyBlc3RpbWF0aW9uKSBpcyB0aGF0LCBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGVyZSBtdXN0IGJlIGEgcmVhc29uYWJsZSBudW1iZXIgb2YgcmFuZG9tLWVmZmVjdHMgbGV2ZWxzIChlLmcuIGJsb2NrcykgLS0gbW9yZSB0aGFuIDUgb3IgNiBhdCBhIG1pbmltdW0uIFRoaXMgaXMgbm90IHN1cnByaXNpbmcgaWYgeW91IGNvbnNpZGVyIHRoYXQgcmFuZG9tIGVmZmVjdHMgZXN0aW1hdGlvbiBpcyB0cnlpbmcgdG8gZXN0aW1hdGUgYW4gYW1vbmctYmxvY2sgdmFyaWFuY2UuIEZvciBleGFtcGxlLCBmcm9tIEBDcmF3bGV5MjAwMiBwLiA2NzA6IAoKPiBBcmUgdGhlcmUgZW5vdWdoIGxldmVscyBvZiB0aGUgZmFjdG9yIGluIHRoZSBkYXRhIG9uIHdoaWNoIHRvIGJhc2UgYW4gZXN0aW1hdGUgb2YgdGhlIHZhcmlhbmNlIG9mIHRoZSBwb3B1bGF0aW9uIG9mIGVmZmVjdHM/IE5vLCBtZWFucyBbeW91IHNob3VsZCBwcm9iYWJseSB0cmVhdCB0aGUgdmFyaWFibGUgYXNdIGZpeGVkIGVmZmVjdHMuCgpTb21lIHJlc2VhcmNoZXJzICh3aG8gdHJlYXQgZml4ZWQgdnMgcmFuZG9tIGFzIGEgcGhpbG9zb3BoaWNhbCByYXRoZXIgdGhhbiBhIHByYWdtYXRpYyBkZWNpc2lvbikgb2JqZWN0IHRvIHRoaXMgYXBwcm9hY2guCgpBbHNvIHNlZSBhIHZlcnkgdGhvdWdodGZ1bCBjaGFwdGVyIGluIEBob2RnZXNfcmljaGx5XzIwMTYuCgpUcmVhdGluZyBmYWN0b3JzIHdpdGggc21hbGwgbnVtYmVycyBvZiBsZXZlbHMgYXMgcmFuZG9tIHdpbGwgaW4gdGhlIGJlc3QgY2FzZSAgbGVhZCB0byB2ZXJ5IHNtYWxsIGFuZC9vciBpbXByZWNpc2UgZXN0aW1hdGVzIG9mIHJhbmRvbSBlZmZlY3RzOyBpbiB0aGUgd29yc3QgY2FzZSBpdCB3aWxsIGxlYWQgdG8gdmFyaW91cyBudW1lcmljYWwgZGlmZmljdWx0aWVzIHN1Y2ggYXMgbGFjayBvZiBjb252ZXJnZW5jZSwgemVybyB2YXJpYW5jZSBlc3RpbWF0ZXMsIGV0Yy4uIChBIHNtYWxsIFtzaW11bGF0aW9uIGV4ZXJjaXNlXShodHRwczovcnB1YnMuY29tL2Jib2xrZXIvNDE4Nykgc2hvd3MgdGhhdCBhdCBsZWFzdCB0aGUgZXN0aW1hdGVzIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gYXJlIGRvd253YXJkbHkgYmlhc2VkIGluIHRoaXMgY2FzZTsgaXQncyBub3QgY2xlYXIgd2hldGhlci9ob3cgdGhpcyBiaWFzIHdvdWxkIGFmZmVjdCB0aGUgcG9pbnQgZXN0aW1hdGVzIG9mICBmaXhlZCBlZmZlY3RzIG9yIHRoZWlyIGVzdGltYXRlZCBjb25maWRlbmNlIGludGVydmFscy4pIEluIHRoZSBjbGFzc2ljYWwgbWV0aG9kLW9mLW1vbWVudHMgYXBwcm9hY2ggdGhlc2UgcHJvYmxlbXMgbWF5IG5vdCBhcmlzZSAoYmVjYXVzZSB0aGUgc3VtcyBvZiBzcXVhcmVzIGFyZSBhbHdheXMgd2VsbCBkZWZpbmVkIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byB1bml0cyksIGJ1dCB0aGUgdW5kZXJseWluZyBwcm9ibGVtcyBvZiBsYWNrIG9mIHBvd2VyIGFyZSB0aGVyZSBuZXZlcnRoZWxlc3MuCgoKVGhpZXJyeSBPbmtlbGlueCBoYXMgW2EgYmxvZyBwb3N0XShodHRwczovL3d3dy5tdXNjYXJkaW51cy5iZS8yMDE4LzA5L251bWJlci1yYW5kb20tZWZmZWN0LWxldmVscy8pIHdpdGggc29tZSBzaW11bGF0aW9ucyBvbiB0aGUgaW1wYWN0IG9mIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGFuZCBjb25jbHVkZXMgd2l0aCBhIGZldyByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBudW1iZXIgb2YgbGV2ZWxzIG9mIHRoZSBncm91cGluZyB2YXJpYWJsZSAkbl9zJDoKPiAtIGdldCAkbl9zID4gMTAwMCQgbGV2ZWxzIHdoZW4gYW4gYWNjdXJhdGUgZXN0aW1hdGUgb2YgdGhlIHJhbmRvbSBlZmZlY3QgdmFyaWFuY2UgaXMgY3J1Y2lhbC4gRS5nLiB3aGVuIGEgc2luZ2xlIG51bWJlciB3aWxsIGJlIHVzZSBmb3IgcG93ZXIgY2FsY3VsYXRpb25zLgo+IC0gZ2V0ICRuX3MgPiAxMDAkIGxldmVscyB3aGVuIGEgcmVhc29uYWJsZSBlc3RpbWF0ZSBvZiB0aGUgcmFuZG9tIGVmZmVjdCB2YXJpYW5jZSBpcyBzdWZmaWNpZW50LiBFLmcuIHBvd2VyIGNhbGN1bGF0aW9ucyB3aXRoIHNlbnNpdGl2aXR5IGFuYWx5c2lzIG9mIHRoZSByYW5kb20gZWZmZWN0IHZhcmlhbmNlLgo+IC0gZ2V0ICRuX3MgPiAyMCQgbGV2ZWxzIGZvciBhbiBleHBlcmltZW50YWwgc3R1ZHkKPiAtIGluIGNhc2UgJDEwIDwgbl9zIDwyMCQgeW91IHNob3VsZCB2YWxpZGF0ZSB0aGUgbW9kZWwgdmVyeSBjYXV0aW91cyBiZWZvcmUgdXNpbmcgdGhlIG91dHB1dAo+IC0gaW4gY2FzZSAkbl9zIDwgMTAkIGl0IGlzIHNhZmVyIHRvIHVzZSB0aGUgdmFyaWFibGUgYXMgYSBmaXhlZCBlZmZlY3QuCgpAb2JlcnByaWxsZXJfZml4ZWRfMjAyMSBhbHNvIHBlcmZvcm1lZCBhIHNpbXVsYXRpb24gc3R1ZHkgYW5kIGZvdW5kIHRoYXQgd2hpbGUgdGhlIGVzdGltYXRlcyBhcmUgc2ltaWxhciBmb3IgdHJlYXRpbmcgYSB2YXJpYWJsZSB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIGxldmVscyBhcyBmaXhlZCBvciByYW5kb20gYXJlIHNpbWlsYXIsIHRoZXJlIHdhcyBhbiBpbXBhY3Qgb24gVHlwZSAxIGFuZCBUeXBlIDIgZXJyb3IgcmF0ZXMuIFRoZXkgYWxzbyBmb3VuZCB0aGF0IHRoZSBwcmVjaXNlIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZSAoZS5nLiwgaW5jbHVzaW9uIG9mIHJhbmRvbSBzbG9wZXMpIGhhZCBhIGxhcmdlIGltcGFjdCBvbiB0aGVzZSBwcm9wZXJ0aWVzLgoKQWxzbyBzZWUgW3RoaXMgdGhyZWFkXShodHRwczovL3N0YXQuZXRoei5jaC9waXBlcm1haWwvci1zaWctbWl4ZWQtbW9kZWxzLzIwMTBxMi8wMDM3MDkuaHRtbCkgb24gdGhlIHItc2lnLW1peGVkLW1vZGVscyBtYWlsaW5nIGxpc3QgYW5kIFt0aGlzIHF1ZXN0aW9uXShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNzY0Ny93aGF0LWlzLXRoZS1taW5pbXVtLXJlY29tbWVuZGVkLW51bWJlci1vZi1ncm91cHMtZm9yLWEtcmFuZG9tLWVmZmVjdHMtZmFjdG9yKSBvbiBDcm9zc1ZhbGlkYXRlZC4KCiMjIE5lc3RlZCBvciBjcm9zc2VkPwoKPGEgaWQ9Im5lc3RlZF9vcl9jcm9zc2VkIj48L2E+CgotIFJlbGF0aXZlbHkgZmV3IG1peGVkIGVmZmVjdCBtb2RlbGluZyBwYWNrYWdlcyBjYW4gaGFuZGxlIGNyb3NzZWQgcmFuZG9tIGVmZmVjdHMsIGkuZS4gdGhvc2Ugd2hlcmUgb25lIGxldmVsIG9mIGEgcmFuZG9tIGVmZmVjdCBjYW4gYXBwZWFyIGluIGNvbmp1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBsZXZlbCBvZiBhbm90aGVyIGVmZmVjdC4gIChUaGlzIGRlZmluaXRpb24gaXMgY29uZnVzaW5nLCBhbmQgSSB3b3VsZCBoYXBwaWx5IGFjY2VwdCBhIGJldHRlciBvbmUuKSAgQSBjbGFzc2ljIGV4YW1wbGUgaXMgY3Jvc3NlZCB0ZW1wb3JhbCBhbmQgc3BhdGlhbCBlZmZlY3RzLiBJZiB0aGVyZSBpcyByYW5kb20gdmFyaWF0aW9uIGFtb25nIHRlbXBvcmFsIGJsb2NrcyAoZS5nLiB5ZWFycykgJydhbmQnJyByYW5kb20gdmFyaWF0aW9uIGFtb25nIHNwYXRpYWwgYmxvY2tzIChlLmcuIHNpdGVzKSwgJydhbmQnJyBpZiB0aGVyZSBpcyBhIGNvbnNpc3RlbnQgeWVhciBlZmZlY3QgYWNyb3NzIHNpdGVzIGFuZCAnJ3ZpY2UgdmVyc2EnJywgdGhlbiB0aGUgcmFuZG9tIGVmZmVjdHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgY3Jvc3NlZC4KLSBgbG1lNGAgZG9lcyBoYW5kbGVkIGNyb3NzZWQgZWZmZWN0cywgZWZmaWNpZW50bHkKLSBpZiB5b3UgbmVlZCB0byBkZWFsIHdpdGggY3Jvc3NlZCBSRXMgaW4gY29uanVuY3Rpb24gd2l0aCBzb21lIG9mIHRoZSBmZWF0dXJlcyB0aGF0IGBubG1lYCBvZmZlcnMgKGUuZy4gaGV0ZXJvc2NlZGFzdGljaXR5IG9mIHJlc2lkdWFscyB2aWEgYHdlaWdodHNgL2B2YXJTdHJ1Y3RgLCBjb3JyZWxhdGlvbiBvZiByZXNpZHVhbHMgdmlhIGBjb3JyZWxhdGlvbmAvYGNvclN0cnVjdGAsICBvciBpZiB5b3Ugd2FudCB0byB1c2VkIGNyb3NzZWQgUkVzIHdpdGggdGhlIGBnYW1sc3NgIHBhY2thZ2UsIHNlZSBwLiAxNjNmZiBvZiBAcGluaGVpcm9fbWl4ZWQtZWZmZWN0c18yMDAwIChzZWN0aW9uIDQuMi4yOiAgW0dvb2dsZSBib29rcyBsaW5rXShodHRwOi8vdGlueXVybC5jb20vY3Jvc3NlZFJFKSkuIEkgZ2l2ZSBhIHdvcmtlZCBleGFtcGxlIFtoZXJlXShodHRwczovL2dpc3QuZ2l0aHViLmNvbS9iYm9sa2VyLzgzYzFmZjAzNmQ0ODUwZDdkYzRjYTgzMmUzNTRmNmE4KS4gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIGEgY291cGxlIG9mIGhhY2tzIGFyZSBuZWNlc3NhcnkgdG8gZ2V0IHRoaXMgdG8gd29yazogKDEpIHRoZSBkYXRhIG11c3QgYmUgZXhwcmVzc2VkIGFzIGEgYGdyb3VwZWREYXRhYCBvYmplY3QgKGF0IGxlYXN0LCBJIGhhdmVuJ3QgbWFuYWdlZCB0byBnZXQgaXQgdG8gd29yayBpbiBhbnkgb3RoZXIgd2F5KTsgKDIpIHRoZSBjcm9zc2VkIGVmZmVjdHMgbXVzdCBiZSAqbmVzdGVkIHdpdGhpbiBhbm90aGVyIGdyb3VwaW5nIGZhY3RvciogLSBpbiB0aGUgZXhhbXBsZSBoZXJlIEkgZGVmaW5lIGEgZHVtbXkgZ3JvdXAsIHdoaWNoIGlzIGF3a3dhcmQgKGl0IG1ha2VzIHRoZSB2YXJpYW5jZSBjb21wb25lbnQgZm9yIHRoaXMgZ3JvdXAgYW5kIHRoZSByZXNpZHVhbCB2YXJpYW5jZSBqb2ludGx5IHVuaWRlbnRpZmlhYmxlKSwgYnV0IG90aGVyd2lzZSBzZWVtcyB0byB3b3JrIE9LLgotIEkgcmFyZWx5IGZpbmQgaXQgdXNlZnVsIHRvIHRoaW5rIG9mIGZpeGVkIGVmZmVjdHMgYXMgIm5lc3RlZCIgKGFsdGhvdWdoIG90aGVycyBkaXNhZ3JlZSk7IGlmIGZvciBleGFtcGxlIHRyZWF0bWVudHMgQSBhbmQgQiBhcmUgb25seSBtZWFzdXJlZCBpbiBibG9jayAxLCBhbmQgdHJlYXRtZW50cyBDIGFuZCBEIGFyZSBvbmx5IG1lYXN1cmVkIGluIGJsb2NrIDIsIG9uZSBzdGlsbCBhc3N1bWVzIChiZWNhdXNlIHRoZXkgYXJlIGZpeGVkIGVmZmVjdHMpIHRoYXQgZWFjaCB0cmVhdG1lbnQgd291bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgaWYgYXBwbGllZCBpbiB0aGUgb3RoZXIgYmxvY2suIChPbmUgbWlnaHQgbGlrZSB0byBlc3RpbWF0ZSB0cmVhdG1lbnQtYnktYmxvY2sgaW50ZXJhY3Rpb25zLCBidXQgaW4gdGhpcyBjYXNlIHRoZSBleHBlcmltZW50YWwgZGVzaWduIGRvZXNuJ3QgYWxsb3cgaXQ7IG9uZSB3b3VsZCBoYXZlIHRvIGhhdmUgbXVsdGlwbGUgdHJlYXRtZW50cyBtZWFzdXJlZCB3aXRoaW4gZWFjaCBibG9jaywgYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IGFsbCB0cmVhdG1lbnRzIGluIGV2ZXJ5IGJsb2NrLikgIE9uZSB3b3VsZCBjb2RlIHRoaXMgYW5hbHlzaXMgYXMgYHJlc3BvbnNlfnRyZWF0bWVudCsoMXxibG9jaylgIGluIGBsbWU0YC4gQWxzbywgaW4gdGhlIGNhc2Ugb2YgZml4ZWQgZWZmZWN0cywgY3Jvc3NlZCBhbmQgbmVzdGVkIHNwZWNpZmljYXRpb25zIGNoYW5nZSB0aGUgcGFyYW1ldGVyaXphdGlvbiBvZiB0aGUgbW9kZWwsIGJ1dCBub3QgYW55dGhpbmcgZWxzZSAoZS5nLiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXN0aW1hdGVkLCBsb2ctbGlrZWxpaG9vZCwgbW9kZWwgcHJlZGljdGlvbnMgYXJlIGFsbCBpZGVudGljYWwpLiAgVGhhdCBpcywgaW4gUidzIGBtb2RlbC5tYXRyaXhgIGZ1bmN0aW9uICh3aGljaCBpbXBsZW1lbnRzIGEgdmVyc2lvbiBvZiBXaWxraW5zb24tUm9nZXJzIG5vdGF0aW9uKSBgYSpiYCBhbmQgYGEvYmAgKHdoaWNoIGV4cGFuZCB0byBgMSthK2IrYTpiYCBhbmQgYDErYSthOmJgIHJlc3BlY3RpdmVseSkgZ2l2ZSBtb2RlbCBtYXRyaWNlcyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zLgotIFdoZXRoZXIgeW91IGV4cGxpY2l0bHkgc3BlY2lmeSBhIHJhbmRvbSBlZmZlY3QgYXMgbmVzdGVkIG9yIG5vdCBkZXBlbmRzIChpbiBwYXJ0KSBvbiB0aGUgd2F5IHRoZSBsZXZlbHMgb2YgdGhlIHJhbmRvbSBlZmZlY3RzIGFyZSBjb2RlZC4gSWYgdGhlICdsb3dlci1sZXZlbCcgcmFuZG9tIGVmZmVjdCBpcyBjb2RlZCB3aXRoIHVuaXF1ZSBsZXZlbHMsIHRoZW4gdGhlIHR3byBzeW50YXhlcyBgKDF8YS9iKWAgKG9yIGAoMXxhKSsoMXxhOmIpYCkgYW5kIGAoMXxhKSsoMXxiKWAgYXJlIGVxdWl2YWxlbnQuIElmIHRoZSBsb3dlci1sZXZlbCByYW5kb20gZWZmZWN0IGhhcyB0aGUgc2FtZSBsYWJlbHMgd2l0aGluIGVhY2ggbGFyZ2VyIGdyb3VwIChlLmcuIGJsb2NrcyAxLCAyLCAzLCA0IHdpdGhpbiBzaXRlcyBBLCBCLCBhbmQgQykgdGhlbiB0aGUgZXhwbGljaXQgbmVzdGluZyBgKDF8YS9iKWAgaXMgcmVxdWlyZWQuIEl0IHNlZW1zIHRvIGJlIGNvbnNpZGVyZWQgYmVzdCBwcmFjdGljZSB0byBjb2RlIHRoZSBuZXN0ZWQgbGV2ZWwgdW5pcXVlbHkgKGUuZy4gQTEsIEEyLCAuLi4sIEIxLCBCMiwgLi4uKSBzbyB0aGF0IGNvbmZ1c2lvbiBiZXR3ZWVuIG5lc3RlZCBhbmQgY3Jvc3NlZCBlZmZlY3RzIGlzIGxlc3MgbGlrZWx5LgoKIyMgKFdoZW4pIGNhbiBJIGluY2x1ZGUgYSBwcmVkaWN0b3IgYXMgYm90aCBmaXhlZCBhbmQgcmFuZG9tPwoKU2VlIFtibG9nIHBvc3QgYnkgVGhpZXJyeSBPbmtlbGlueF0oaHR0cHM6Ly93d3cubXVzY2FyZGludXMuYmUvMjAxNy8wOC9maXhlZC1hbmQtcmFuZG9tLykKCiMgTW9kZWwgZXh0ZW5zaW9ucwoKIyMgT3ZlcmRpc3BlcnNpb24KCjxhIGlkPSJvdmVyZGlzcGVyc2lvbiI+PC9hPgoKIyMjIFRlc3RpbmcgZm9yIG92ZXJkaXNwZXJzaW9uL2NvbXB1dGluZyBvdmVyZGlzcGVyc2lvbiBmYWN0b3IKCi0gd2l0aCB0aGUgdXN1YWwgY2F2ZWF0cywgcGx1cyBhIGZldyBleHRyYXMgLS0gY291bnRpbmcgZGVncmVlcyBvZiBmcmVlZG9tLCBldGMuIC0tIHRoZSB1c3VhbCBwcm9jZWR1cmUgb2YgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBzcXVhcmVkIFBlYXJzb24gcmVzaWR1YWxzIGFuZCBjb21wYXJpbmcgaXQgdG8gdGhlIHJlc2lkdWFsIGRlZ3JlZXMgb2YgZnJlZWRvbSBzaG91bGQgZ2l2ZSBhdCBsZWFzdCBhIGNydWRlIGlkZWEgb2Ygb3ZlcmRpc3BlcnNpb24uICBUaGUgZm9sbG93aW5nIGF0dGVtcHQgY291bnRzIGVhY2ggdmFyaWFuY2Ugb3IgY292YXJpYW5jZSBwYXJhbWV0ZXIgYXMgb25lIG1vZGVsIGRlZ3JlZSBvZiBmcmVlZG9tIGFuZCBwcmVzZW50cyB0aGUgc3VtIG9mIHNxdWFyZWQgUGVhcnNvbiByZXNpZHVhbHMsIHRoZSByYXRpbyBvZiAoU1NRIHJlc2lkdWFscy9yZGYpLCB0aGUgcmVzaWR1YWwgZGYsIGFuZCB0aGUgJHAkLXZhbHVlIGJhc2VkIG9uIHRoZSAoYXBwcm94aW1hdGVseSEhKSBhcHByb3ByaWF0ZSAkXGNoaV4yJCBkaXN0cmlidXRpb24uICoqRG8gUExFQVNFIG5vdGUgdGhlIHVzdWFsLCBhbmQgZXh0cmEsIGNhdmVhdHMgbm90ZWQgaGVyZTogdGhpcyBpcyBhbiBBUFBST1hJTUFURSBlc3RpbWF0ZSBvZiBhbiBvdmVyZGlzcGVyc2lvbiBwYXJhbWV0ZXIqKi4gRXZlbiBpbiB0aGUgR0xNIGNhc2UsIHRoZSBleHBlY3RlZCBkZXZpYW5jZSBwZXIgcG9pbnQgZXF1YWxpbmcgMSBpcyBvbmx5IHRydWUgYXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBpbmRpdmlkdWFsIGRldmlhdGVzIGFwcHJvYWNoZXMgbm9ybWFsaXR5LCBpLmUuIHRoZSB1c3VhbCAkXGxhbWJkYT41JCBydWxlcyBvZiB0aHVtYiBmb3IgUG9pc3NvbiB2YWx1ZXMgYW5kICRcdGV4dHJte21pbn0oTnAsIE4oMS1wKSkgPiA1JCBmb3IgYmlub21pYWwgdmFsdWVzIChlLmcuIHNlZSBAdmVuYWJsZXNfbW9kZXJuXzIwMDIsIFtwLiAyMDgtMjA5XShodHRwOi8vYm9va3MuZ29vZ2xlLmNvbS9ib29rcz9pZD05NzRjNHZLdXJOa0MmcGc9UEEyMDkpKS4gKEFuZCB0aGF0J3Mgd2l0aG91dCB0aGUgZXh0cmEgY29tcGxleGl0aWVzIGR1ZSB0byBHTE1NLCBpLmUuIHRoZSAiZWZmZWN0aXZlIiByZXNpZHVhbCBkZiBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIG1ha2UgdGhlIHN1bXMgb2Ygc3F1YXJlcyBjb252ZXJnZSBvbiBhICRcY2hpXjIkIGRpc3RyaWJ1dGlvbiAuLi4pCi0gUmVtZW1iZXIgdGhhdCAoMSkgb3ZlcmRpc3BlcnNpb24gaXMgaXJyZWxldmFudCBmb3IgbW9kZWxzIHRoYXQgZXN0aW1hdGUgYSBzY2FsZSBwYXJhbWV0ZXIgKGkuZS4gYWxtb3N0IGFueXRoaW5nIGJ1dCBQb2lzc29uIG9yIGJpbm9taWFsOiBHYXVzc2lhbiwgR2FtbWEsIG5lZ2F0aXZlIGJpbm9taWFsIC4uLikgYW5kICgyKSBvdmVyZGlzcGVyc2lvbiBpcyBub3QgZXN0aW1hYmxlIChhbmQgaGVuY2UgcHJhY3RpY2FsbHkgaXJyZWxldmFudCkgZm9yIEJlcm5vdWxsaSBtb2RlbHMgKD0gYmluYXJ5IGRhdGEgPSBiaW5vbWlhbCB3aXRoICROPTEkKS4KLSBUaGUgcmVjaXBlcyBiZWxvdyBtYXkgbmVlZCBhZGp1c3RtZW50IGZvciBzb21lIG9mIHRoZSBtb3JlIGNvbXBsZXggbW9kZWwgdHlwZXMgYWxsb3dlZCBieSBgZ2xtbVRNQmAgKGUuZy4gemVyby1pbmZsYXRpb24vdmFyaWFibGUgZGlzcGVyc2lvbiksIHdoZXJlIGl0J3MgbGVzcyBjbGVhciB3aGF0IHRvIG1lYXN1cmUgdG8gZXN0aW1hdGUgb3ZlcmRpc3BlcnNpb24uCgpUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHNob3VsZCB3b3JrIGZvciBhIHZhcmlldHkgb2YgbW9kZWwgdHlwZXMKKGF0IGxlYXN0IGBnbG1tQURNQmAsIGBnbG1tVE1CYCwgYGxtZTRgLCAuLi4pLgoKYGBge3Igb3ZlcmRpc3BfZnVufQpvdmVyZGlzcF9mdW4gPC0gZnVuY3Rpb24obW9kZWwpIHsKICAgIHJkZiA8LSBkZi5yZXNpZHVhbChtb2RlbCkKICAgIHJwIDwtIHJlc2lkdWFscyhtb2RlbCx0eXBlPSJwZWFyc29uIikKICAgIFBlYXJzb24uY2hpc3EgPC0gc3VtKHJwXjIpCiAgICBwcmF0IDwtIFBlYXJzb24uY2hpc3EvcmRmCiAgICBwdmFsIDwtIHBjaGlzcShQZWFyc29uLmNoaXNxLCBkZj1yZGYsIGxvd2VyLnRhaWw9RkFMU0UpCiAgICBjKGNoaXNxPVBlYXJzb24uY2hpc3EscmF0aW89cHJhdCxyZGY9cmRmLHA9cHZhbCkKfQpgYGAKCkV4YW1wbGU6CmBgYHtyIGxtZTQsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShsbWU0KQpsaWJyYXJ5KGdsbW1UTUIpCmBgYAoKYGBge3Igb3ZlcmRpc3BfZXgsY2FjaGU9VFJVRSxtZXNzYWdlPUZBTFNFfQpzZXQuc2VlZCgxMDEpICAKZCA8LSBkYXRhLmZyYW1lKHg9cnVuaWYoMTAwMCksCiAgICAgICAgICAgICAgICBmPWZhY3RvcihzYW1wbGUoMToxMCxzaXplPTEwMDAscmVwbGFjZT1UUlVFKSkpCnN1cHByZXNzTWVzc2FnZXMoZCR5IDwtIHNpbXVsYXRlKH54KygxfGYpLCBmYW1pbHk9cG9pc3NvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhPWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3cGFyYW1zPWxpc3QodGhldGE9MSxiZXRhPWMoMCwyKSkpW1sxXV0pCm0xIDwtIGdsbWVyKHl+eCsoMXxmKSxkYXRhPWQsZmFtaWx5PXBvaXNzb24pCm92ZXJkaXNwX2Z1bihtMSkKbTIgPC0gZ2xtbVRNQih5fngrKDF8ZiksZGF0YT1kLGZhbWlseT0icG9pc3NvbiIpCm92ZXJkaXNwX2Z1bihtMikKYGBgCgpUaGUgYGdvZmAgZnVuY3Rpb24gaW4gdGhlIGBhb2RzM2AgcHJvdmlkZXMgc2ltaWxhciBmdW5jdGlvbmFsaXR5CihpdCByZXBvcnRzIGJvdGggZGV2aWFuY2UtIGFuZCAkXGNoaV4yJC1iYXNlZCBlc3RpbWF0ZXMgb2YKb3ZlcmRpc3BlcnNpb24gYW5kIHRlc3RzKS4KCiMjIyBGaXR0aW5nIG1vZGVscyB3aXRoIG92ZXJkaXNwZXJzaW9uPwoKLSBxdWFzaWxpa2VsaWhvb2QgZXN0aW1hdGlvbjogW01BU1M6OmdsbW1QUUxdKGh0dHA6Ly9maW56aS5wc3ljaC51cGVubi5lZHUvUi9saWJyYXJ5L01BU1MvaHRtbC9nbG1tUFFMLmh0bWwpLiBRdWFzaS0gd2FzIGRlZW1lZCB1bnJlbGlhYmxlIGluIGBsbWU0YCwgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIChQYXJ0IG9mIHRoZSBwcm9ibGVtIHdhcyBxdWVzdGlvbmFibGUgbnVtZXJpY2FsIHJlc3VsdHMgaW4gc29tZSBjYXNlczsgdGhlIG90aGVyIHByb2JsZW0gd2FzIHRoYXQgREIgZmVsdCB0aGF0IGhlIGRpZCBub3QgaGF2ZSBhIHN1ZmZpY2llbnRseSBnb29kIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHRoZW9yZXRpY2FsIGZyYW1ld29yayB0aGF0IHdvdWxkIGV4cGxhaW4gd2hhdCB0aGUgYWxnb3JpdGhtIHdhcyBhY3R1YWxseSBlc3RpbWF0aW5nIGluIHRoaXMgY2FzZS4pIFtnZWVwYWNrOjpnZWVsZ21dKGh0dHA6Ly9maW56aS5wc3ljaC51cGVubi5lZHUvUi9saWJyYXJ5L2dlZXBhY2svaHRtbC9nZWVnbG0uaHRtbCkgbWF5IGJlIHdvcmthYmxlIChoYXZlbid0IHRyaWVkIGl0KQoKICAgIElmIHlvdSByZWFsbHkgd2FudCBxdWFzaS1saWtlbGlob29kIGFuYWx5c2lzIGZvciBgZ2xtZXJgIGZpdHMsIHlvdSBjYW4gZG8gaXQgeW91cnNlbGYgYnkgYWRqdXN0aW5nIHRoZQpjb2VmZmljaWVudCB0YWJsZSAtIGkuZS4sIGJ5IG11bHRpcGx5aW5nIHRoZSBzdGFuZGFyZCBlcnJvciBieSB0aGUgc3F1YXJlIHJvb3QKb2YgdGhlIGRpc3BlcnNpb24gZmFjdG9yIFteMl0gYW5kIHJlY29tcHV0aW5nIHRoZSAkWiQtIGFuZCAkcCQtdmFsdWVzCmFjY29yZGluZ2x5LCBhcyBmb2xsb3dzOgoKW14yXTogdGhlIGRpc3BlcnNpb24gZmFjdG9yIGlzIGVzdGltYXRlZCBvbiBhCnZhcmlhbmNlLCBzbyB3ZSBuZWVkIHRvIHRha2UgdGhlIHNxdWFyZSByb290IHRvIGFwcGx5IGl0IHRvIHRoZQpzdGFuZGFyZCBlcnJvcgoKYGBge3IgcXVhc2l9CiMjIGV4dHJhY3Qgc3VtbWFyeSB0YWJsZTsgeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZG8gdGhpcyB2aWEKIyMgIGJyb29tOjp0aWR5IG9yIGJyb29tLm1peGVkOjp0aWR5CnF1YXNpX3RhYmxlIDwtIGZ1bmN0aW9uKG1vZGVsLGN0YWI9Y29lZihzdW1tYXJ5KG1vZGVsKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoaT1vdmVyZGlzcF9mdW4obW9kZWwpWyJyYXRpbyJdKSB7CiAgICBxY3RhYiA8LSB3aXRoaW4oYXMuZGF0YS5mcmFtZShjdGFiKSwKICAgIHsgICBgU3RkLiBFcnJvcmAgPC0gYFN0ZC4gRXJyb3JgKnNxcnQocGhpKQogICAgICAgIGB6IHZhbHVlYCA8LSBFc3RpbWF0ZS9gU3RkLiBFcnJvcmAKICAgICAgICBgUHIoPnx6fClgIDwtIDIqcG5vcm0oYWJzKGB6IHZhbHVlYCksIGxvd2VyLnRhaWw9RkFMU0UpCiAgICB9KQogICAgcmV0dXJuKHFjdGFiKQp9CnByaW50Q29lZm1hdChxdWFzaV90YWJsZShtMSksZGlnaXRzPTMpCiMjIHRvIHVzZSB0aGlzIHdpdGggZ2xtbVRNQiwgd2UgbmVlZCB0byBzZXBhcmF0ZSBvdXQgdGhlCiMjICBjb25kaXRpb25hbCBjb21wb25lbnQgb2YgdGhlIHN1bW1hcnkKcHJpbnRDb2VmbWF0KHF1YXNpX3RhYmxlKG0yLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RhYj1jb2VmKHN1bW1hcnkobTIpKVtbImNvbmQiXV0pLAogICAgICAgICAgICAgZGlnaXRzPTMpCmBgYAoKQW5vdGhlciB2ZXJzaW9uLCB0aGlzIG9uZSB0aWR5dmVyc2UtY2VudHJpYzoKCmBgYHtyIHRpZHlxdWFzaSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShicm9vbS5taXhlZCkKbGlicmFyeShkcGx5cikKdGlkeV9xdWFzaSA8LSBmdW5jdGlvbihtb2RlbCwgcGhpPW92ZXJkaXNwX2Z1bihtb2RlbClbInJhdGlvIl0sCiAgICAgICAgICAgICAgICAgICAgICAgY29uZi5sZXZlbD0wLjk1KSB7CiAgICB0dCA8LSAodGlkeShtb2RlbCwgZWZmZWN0cz0iZml4ZWQiKQogICAgICAgICU+JSBtdXRhdGUoc3RkLmVycm9yPXN0ZC5lcnJvcipzcXJ0KHBoaSksCiAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWM9ZXN0aW1hdGUvc3RkLmVycm9yLAogICAgICAgICAgICAgICAgICAgcC52YWx1ZT0yKnBub3JtKGFicyhzdGF0aXN0aWMpLCBsb3dlci50YWlsPUZBTFNFKSkKICAgICkKICAgIHJldHVybih0dCkKfQp0aWR5X3F1YXNpKG0xKQp0aWR5X3F1YXNpKG0yKQpgYGAKClRoZXNlIGZ1bmN0aW9ucyBtYWtlIHNvbWUgc2ltcGxpZnlpbmcgYXNzdW1wdGlvbnM6ICgxKSB0aGlzIG92ZXJkaXNwZXJzaW9uIGNvbXB1dGF0aW9uIGlzIGFwcHJveGltYXRlCgpJbiB0aGlzIGNhc2UgdXNpbmcgcXVhc2ktbGlrZWxpaG9vZCBkb2Vzbid0IG1ha2UgbXVjaCBkaWZmZXJlbmNlLCBzaW5jZSB0aGUgZGF0YSB3ZSBzaW11bGF0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlIHdlcmUgUG9pc3Nvbi4pIEtlZXAgaW4gbWluZCB0aGF0IG9uY2UgeW91IHN3aXRjaCB0byBxdWFzaS1saWtlbGlob29kIHlvdSB3aWxsIGVpdGhlciBoYXZlIHRvIGVzY2hldyBpbmZlcmVudGlhbCBtZXRob2RzIHN1Y2ggYXMgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCwgcHJvZmlsZSBjb25maWRlbmNlIGludGVydmFscywgQUlDLCBldGMuLCBvciBtYWtlIG1vcmUgaGVyb2ljIGFzc3VtcHRpb25zIHRvIGNvbXB1dGUgInF1YXNpLSIgYW5hbG9ncyBvZiBhbGwgb2YgdGhlIGFib3ZlIChzdWNoIGFzIFFBSUMpLiAKCi0gb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdHMgKE9MUkU6IHRoaXMgYXBwcm9hY2ggc2hvdWxkIHdvcmsgaW4gbW9zdCBwYWNrYWdlcykuIElmIHlvdSB3YW50IHRvIGEgY2l0YXRpb24gZm9yIHRoaXMgYXBwcm9hY2gsIHRyeSBAZWxzdG9uX2FuYWx5c2lzXzIwMDEsIHdobyBjaXRlIEBsYXdzb25fZGlzZWFzZV8xOTk5OyBhcHBhcmVudGx5IHRoZXJlIGlzIGFsc28gYW4gZXhhbXBsZSBpbiBzZWN0aW9uIDEwLjUgb2YgQG1haW5kb25hbGRfZGF0YV8yMDEwLCBhbmQgKGFjY29yZGluZyB0byBhbiBSLXNpZy1taXhlZC1tb2RlbHMgcG9zdCkgdGhpcyBpcyBhbHNvIGRpc2N1c3NlZCBieSBAcmFiZWhlc2tldGhfbXVsdGlsZXZlbF8yMDA4LiBBbHNvIHNlZSBAYnJvd25lX3ZhcmlhbmNlXzIwMDUgZm9yIGFuIGV4YW1wbGUgaW4gdGhlIGJpbm9taWFsIGNvbnRleHQgKGkuZS4gbG9naXQtbm9ybWFsLWJpbm9taWFsIHJhdGhlciB0aGFuIGxvZ25vcm1hbC1Qb2lzc29uKS4gQWdyZXN0aSdzIGV4Y2VsbGVudCAoMjAwMikgYm9vayBAYWdyZXN0aV9jYXRlZ29yaWNhbF8yMDAyIGFsc28gZGlzY3Vzc2VzIHRoaXMgKHNlY3Rpb24gMTMuNSksIHJlZmVycmluZyBiYWNrIHRvIEBicmVzbG93X2V4dHJhcG9pc3Nvbl8xOTg0IGFuZCBAaGluZGVfY29tcG91bmRfMTk4Mi4gWyoqTm90ZXMqKjogKGEpIEkgaGF2ZW4ndCBjaGVja2VkIGFsbCB0aGVzZSByZWZlcmVuY2VzIG15c2VsZiwgKGIpIEkgY2FuJ3QgZmluZCB0aGUgcmVmZXJlbmNlIGFueSBtb3JlLCBidXQgSSBoYXZlIHNlZW4gaXQgc3RhdGVkIHRoYXQgb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdCBlc3RpbWF0aW9uIGlzIHByb2JhYmx5IGRvZGd5IGZvciBQUUwgYXBwcm9hY2hlcyBhcyB1c2VkIGluIEVsc3RvbiBldCBhbCAyMDAxXSAKLSBhbHRlcm5hdGl2ZSBkaXN0cmlidXRpb25zCiAgICAtIFBvaXNzb24tbG9nbm9ybWFsIG1vZGVsIGZvciBjb3VudHMgb3IgYmlub21pYWwtbG9naXQtTm9ybWFsIG1vZGVsIGZvciBwcm9wb3J0aW9ucyAoc2VlIGFib3ZlLCAib2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdHMiKQogICAgLSBuZWdhdGl2ZSBiaW5vbWlhbCBmb3IgY291bnRzIG9yIGJldGEtYmlub21pYWwgZm9yIHByb3BvcnRpb25zCiAgICAgICAgIC0gYGxtZTQ6OmdsbWVyLm5iKClgIHNob3VsZCBmaXQgYSBuZWdhdGl2ZSBiaW5vbWlhbCwgYWx0aG91Z2ggaXQgaXMgc29tZXdoYXQgc2xvdyBhbmQgZnJhZ2lsZSBjb21wYXJlZCB0byBzb21lIG9mIHRoZSBvdGhlciBtZXRob2RzIHN1Z2dlc3RlZCBoZXJlLiBgbG1lNGAgY2Fubm90IGZpdCBiZXRhLWJpbm9taWFsIG1vZGVscyAodGhlc2UgY2Fubm90IGJlIGZvcm11bGF0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBleHBvbmVudGlhbCBmYW1pbHkgb2YgZGlzdHJpYnV0aW9ucykKCSAgICAgLSBbZ2xtbVRNQl0oaHR0cHM6Ly9naXRodWIuY29tL2dsbW10bWIvZ2xtbVRNQi8pIHdpbGwgZml0IHR3byBwYXJhbWV0ZXJpemF0aW9ucyBvZiB0aGUgbmVnYXRpdmUgYmlub21pYWw6IGBmYW1pbHk9Im5iaW5vbTIiYCBnaXZlcyB0aGUgY2xhc3NpYyBwYXJhbWV0ZXJpemF0aW9uIHdpdGggJFxzaWdtYV4yPVxtdSgxK1xtdS9rKSQgKCJOQjIiIGluIEhhcmRpbiBhbmQgSGlsYmUncyB0ZXJtaW5vbG9neSkgd2hpbGUgYGZhbWlseT0ibmJpbm9tMSJgIGdpdmVzIGEgcGFyYW1ldGVyaXphdGlvbiB3aXRoICRcc2lnbWFeMj1ccGhpIFxtdSQsICRccGhpPjEkICgiTkIxIiB0byBIYXJkaW4gYW5kIEhpbGJlKS4gVGhlIGxhdHRlciBtaWdodCBhbHNvIGJlIGNhbGxlZCBhICJxdWFzaS1Qb2lzc29uIiBwYXJhbWV0ZXJpemF0aW9uIGJlY2F1c2UgaXQgbWF0Y2hlcyB0aGUgbWVhbi12YXJpYW5jZSByZWxhdGlvbnNoaXAgYXNzdW1lZCBieSBxdWFzaS1Qb2lzc29uIG1vZGVscywgaS5lLiB0aGUgdmFyaWFuY2UgaXMgc3RyaWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBtZWFuIChhbHRob3VnaCB0aGUgcHJvcG9ydGlvbmFsaXR5IGNvbnN0YW50IG11c3QgYmUgPjEsIGEgbGltaXRhdGlvbiB0aGF0IGRvZXMgbm90IGFwcGx5IHRvIHF1YXNpLWxpa2VsaWhvb2QgYXBwcm9hY2hlcykuIChbZ2xtbUFETUJdKGh0dHA6Ly9naXRodWIuY29tL2Jib2xrZXIvZ2xtbUFETUIvKSB3aWxsIGFsc28gZml0IHRoZXNlIG1vZGVscywgd2l0aCBgZmFtaWx5PSJuYmlub20iYCBmb3IgTkIyLCBidXQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2xtbVRNQi4pCgkgICAtIGBnbG1tVE1CYCBhbGxvd3MgYmV0YS1iaW5vbWlhbCBtb2RlbHMgKFtAaGFycmlzb25fY29tcGFyaXNvbl8yMDE1XSBzdWdnZXN0cyBjb21wYXJpbmcgYmV0YS1iaW5vbWlhbCB3aXRoIE9MUkUgbW9kZWxzIHRvIGFzc2VzcyByZWxpYWJpbGl0eSkKCSAgIC0gdGhlIGBicm1zYCBwYWNrYWdlIGhhcyBhIGBuZWdiaW5vbWlhbGAgZmFtaWx5IChubyBiZXRhLWJpbm9taWFsLCBidXQgaXQgZG9lcyBoYXZlIGEgd2lkZSByYW5nZSBvZiBvdGhlciBmYW1pbGllcykKLSBvdGhlciBwYWNrYWdlcy9hcHByb2FjaGVzIChsZXNzIHdpZGVseSB1c2VkLCBvciByZXF1aXJpbmcgYSBiaXQgbW9yZSBlZmZvcnQpCiAgICAtIGBnYW1sc3MubXg6Z2FtbHNzTlBgCiAgICAtIFdpbkJVR1MvSkFHUyAodmlhIFIyV2luQlVHUy9SamFncykKICAgIC0gQUQgTW9kZWwgQnVpbGRlciAocG9zc2libHkgdmlhIGBSMmFkbWJgIHBhY2thZ2UpIG9yIGBUTUJgCiAgICAtIGBnbmxtbWAgaW4gdGhlIGByZXBlYXRlZGAgcGFja2FnZSAoW29mZi1DUkFOXShodHRwOi8vd3d3LmNvbW1hbnN0ZXIuZXUvcmNvZGUuaHRtbCkpCiAgKiBbQVNSRU1MXShodHRwOi8vd3d3LmFzcmVtbC5jb20vc29mdHdhcmUvZ2Vuc3RhdC9odG1saGVscC9zZXJ2ZXIvR0xNTS5odG0pCgpOZWdhdGl2ZSBiaW5vbWlhbCBtb2RlbHMgaW4gYGdsbW1UTUJgIGFuZCBsb2dub3JtYWwtUG9pc3NvbiBtb2RlbHMgaW4gYGdsbWVyYCAob3IgYE1DTUNnbG1tYCkgYXJlIHByb2JhYmx5IHRoZSBiZXN0IHF1aWNrIGFsdGVybmF0aXZlcyBmb3Igb3ZlcmRpc3BlcnNlZCBjb3VudCBkYXRhLiBJZiB5b3UgbmVlZCB0byBleHBsb3JlIGFsdGVybmF0aXZlcyAoZGlmZmVyZW50IHZhcmlhbmNlLW1lYW4gcmVsYXRpb25zaGlwcywgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMpLCB0aGVuIGBBRE1CYCwgYFRNQmAsIGBXaW5CVUdTYCwgYFN0YW5gLCBgTklNQkxFYCBhcmUgdGhlIG1vc3QgZmxleGlibGUgYWx0ZXJuYXRpdmVzLgoKIyMjIFVuZGVyZGlzcGVyc2lvbgoKVW5kZXJkaXNwZXJzaW9uIChtdWNoICpsZXNzKiB2YXJpYWJpbGl0eSB0aGFuIGV4cGVjdGVkKSBpcyBhIGxlc3MgY29tbW9uIHByb2JsZW0gdGhhbiBvdmVyZGlzcGVyc2lvbi4KCi0gbWlsZCB1bmRlcmRpc3BlcnNpb24gaXMgc29tZXRpbWVzIGlnbm9yZWQsIHNpbmNlIGl0IHRlbmRzIGluIGdlbmVyYWwgdG8gbGVhZCB0byBjb25zZXJ2YXRpdmUgcmF0aGVyIHRoYW4gYW50aS1jb25zZXJ2YXRpdmUgcmVzdWx0cwotIHF1YXNpLWxpa2VsaWhvb2QgKGFuZCB0aGUgcXVhc2ktaGFjayBsaXN0ZWQgYWJvdmUpIGNhbiBoYW5kbGUgdW5kZXItIGFzIHdlbGwgYXMgb3ZlcmRpc3BlcnNpb24KLSBzb21lIG90aGVyIHNvbHV0aW9ucyBleGlzdCwgYnV0IGFyZSBsZXNzIHdpZGVseSBpbXBsZW1lbnRlZAogICAgLSBmb3IgZGlzdHJpYnV0aW9ucyB3aXRoIGEgc21hbGwgcmFuZ2UgKGUuZy4gbGl0dGVyIHNpemVzIG9mIGxhcmdlIG1hbW1hbHMpLCBvbmUgY2FuIHRyZWF0IHJlc3BvbnNlcyBhcyBvcmRpbmFsIChlLmcuIHVzaW5nIHRoZSBgb3JkaW5hbGAgcGFja2FnZSwgb3IgYE1DTUNnbG1tYCBvciBgYnJtc2AgZm9yIEJheWVzaWFuIHNvbHV0aW9ucykKICAgIC0gdGhlIENPTS1Qb2lzc29uIGRpc3RyaWJ1dGlvbiBhbmQgZ2VuZXJhbGl6ZWQgUG9pc3NvbiBkaXN0cmlidXRpb25zLCBpbXBsZW1lbnRlZCBpbiBgZ2xtbVRNQmAsIGNhbiBoYW5kbGUgdW5kZXJkaXNwZXJzaW9uIChKLiBIaWxiZSByZWNvbW1lbmRzIHRoZSBsYXR0ZXIgaW4gW3RoaXMgQ3Jvc3NWYWxpZGF0ZWQgYW5zd2VyXShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy82NzM4NS93aGF0LWlzLXRoZS1hcHByb3ByaWF0ZS1tb2RlbC1mb3ItdW5kZXJkaXNwZXJzZWQtY291bnQtZGF0YSkpLiAoYFZHQU1gIGhhcyBhIGdlbmVyYWxpemVkIFBvaXNzb24gZGlzdHJpYnV0aW9uLCBidXQgZG9lc24ndCBoYW5kbGUgcmFuZG9tIGVmZmVjdHMuKQogICAgIAoKCiMjIEdhbW1hIEdMTU1zCgpXaGlsZSBvbmUgKHdlbGwsIE9LIEkpIHdvdWxkIG5haXZlbHkgdGhpbmsgdGhhdCBHTE1NcyB3aXRoIEdhbW1hIGRpc3RyaWJ1dGlvbnMgd291bGQgYmUganVzdCBhcyBlYXN5IChvciBoYXJkKSBhcyBhbnkgb3RoZXIgc29ydCBvZiBHTE1NcywgaXQgc2VlbXMgdGhhdCB0aGV5IGFyZSBpbiBmYWN0IGhhcmRlciB0byBpbXBsZW1lbnQuIEJhc2ljIHNpbXVsYXRlZCBleGFtcGxlcyBvZiBHYW1tYSBHTE1NcyBjYW4gZmFpbCBpbiBsbWU0IGRlc3BpdGUgYW5hbG9nb3VzIHByb2JsZW1zIHdpdGggUG9pc3NvbiwgYmlub21pYWwsIGV0Yy4gZGlzdHJpYnV0aW9ucy4gIFNvbHV0aW9uczoKLSB0aGUgZGVmYXVsdCBpbnZlcnNlIGxpbmsgc2VlbXMgcGFydGljdWxhcmx5IHByb2JsZW1hdGljOyB0cnkgb3RoZXIgbGlua3MgKGVzcGVjaWFsbHkgYGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKWApIGlmIHRoYXQgaXMgcG9zc2libGUvbWFrZXMgc2Vuc2UKLSBjb25zaWRlciB3aGV0aGVyIGEgbG9nbm9ybWFsIG1vZGVsIChpLmUuIGEgcmVndWxhciBMTU0gb24gbG9nZ2VkIGRhdGEpIHdvdWxkIHdvcmsvbWFrZXMgc2Vuc2UuCi0gQGxvX3RyYW5zZm9ybV8yMDE1IGFyZ3VlIHRoYXQgdGhlIEdhbW1hIGZhbWlseSB3aXRoIGFuICppZGVudGl0eSogbGluayBpcyBzdXBlcmlvciB0byBsb2dub3JtYWwgbW9kZWxzIGZvciByZWFjdGlvbi10aW1lIGRhdGEuIEkgKEJNQikgZG9uJ3QgZmluZCB0aGVpciBhcmd1bWVudCBwYXJ0aWN1bGFybHkgY29udmluY2luZywgYnV0IGxvdHMgb2YgcGVvcGxlIHdhbnQgdG8gZG8gdGhpcy4gVW5mb3J0dW5hdGVseSB0aGlzIGlzIHRlY2huaWNhbGx5IGNoYWxsZW5naW5nIChzZWUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9sbWU0L2xtZTQvaXNzdWVzLzU3MykpLCBiZWNhdXNlIGl0IGlzIGxpa2VseSB0aGF0IHNvbWUgImlsbGVnYWwiIHZhbHVlcyAocHJlZGljdGVkIHJlc3BvbnNlcyAkXGxlIDAkKSB3aWxsIG9jY3VyIHdoaWxlIGZpdHRpbmcgdGhlIG1vZGVsLCBldmVuIGlmIHRoZSBmaW5hbCBmaXR0ZWQgbW9kZWwgbWFrZXMgbm8gaW1wb3NzaWJsZSBwcmVkaWN0aW9ucy4gVGh1cyBzb21ldGhpbmcgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgbW9kZWwtZml0dGluZyBtYWNoaW5lcnkgdG9sZXJhbnQgb2Ygc3VjaCB2YWx1ZXMgKGkuZS4gcmV0dXJuaW5nIGBOQWAgZm9yIHRoZXNlIG1vZGVsIGV2YWx1YXRpb25zLCBvciBjbGFtcGluZyBpbGxlZ2FsIHZhbHVlcyB0byB0aGUgY29uc3RyYWluZWQgc3BhY2Ugd2l0aCBhbiBhcHByb3ByaWF0ZSBzbW9vdGggcGVuYWx0eSBmdW5jdGlvbikuCgpHYW1tYSBtb2RlbHMgY2FuIGJlIGZpdHRlZCBieSBhIHdpZGUgdmFyaWV0eSBvZiBwbGF0Zm9ybXMgKGBsbWU0OjpnbG1lcmAsIGBNQVNTOjpnbG1tUFFMYCwgYGdsbW1BRE1CYCwgYGdsbW1UTUJgLCBgTWl4ZWRNb2RlbHMuamxgLCBgTUNNQ2dsbW1gLCBgYnJtc2AgLi4uIG5vdCBzdXJlIGFib3V0IG90aGVycy4KCiMjIEJldGEgR0xNTXMKClByb3BvcnRpb24gZGF0YSB3aGVyZSB0aGUgZGVub21pbmF0b3IgKGUuZy4gbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uKSBpcyBub3Qga25vd24gY2FuIGJlIG1vZGVsZWQgdXNpbmcgYSBCZXRhIGRpc3RyaWJ1dGlvbi4gQHNtaXRoc29uX2JldHRlcl8yMDA2IGlzIGEgZ29vZCBpbnRyb2R1Y3Rpb24gZm9yIG5vbi1zdGF0aXN0aWNpYW5zICgqbm90KiBpbiB0aGUgbWl4ZWQtbW9kZWwgY2FzZSksIGFuZCB0aGUgYGJldGFyZWdgIHBhY2thZ2UgW0BjcmliYXJpLW5ldG9fYmV0YV8yMDA5XSBoYW5kbGVzICpub24qLW1peGVkIEJldGEgcmVncmVzc2lvbnMuIFRoZSBgZ2xtbVRNQmAgYW5kIGBicm1zYCBwYWNrYWdlcyBoYW5kbGUgQmV0YSBtaXhlZCBtb2RlbHMgKGBicm1zYCBhbHNvIGhhbmRsZXMgemVyby1pbmZsYXRlZCBhbmQgemVyby1vbmUgaW5mbGF0ZWQgbW9kZWxzKS4KCiMjIFplcm8taW5mbGF0aW9uCgpTZWUgZS5nLiBAbWFydGluX3plcm9fMjAwNSBvciBAd2FydG9uX21hbnlfMjAwNSAoIm1hbnkgemVyb3MgZG9lcyBub3QgbWVhbiB6ZXJvIGluZmxhdGlvbiIpIG9yIEB6dXVyX3plcm8tdHJ1bmNhdGVkXzIwMDkgZm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gb24gemVyby1pbmZsYXRpb24uCgojIyMgQ291bnQgZGF0YQoKLSBgTUNNQ2dsbW1gIGhhbmRsZXMgemVyby10cnVuY2F0ZWQsIHplcm8taW5mbGF0ZWQsIGFuZCB6ZXJvLWFsdGVyZWQgbW9kZWxzLCBhbHRob3VnaCBzcGVjaWZ5aW5nIHRoZSBtb2RlbHMgaXMgYSBsaXR0bGUgYml0IHRyaWNreTogc2VlIFNlY3Rpb25zIDUuMyB0byA1LjUgb2YgdGhlIFtDb3Vyc2VOb3RlcyB2aWduZXR0ZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL01DTUNnbG1tL3ZpZ25ldHRlcy9Db3Vyc2VOb3Rlcy5wZGYpCi0gYGdsbW1BRE1CYCBoYW5kbGVzIAogICAgLSB6ZXJvLWluZmxhdGVkIG1vZGVscyAod2l0aCBhIHNpbmdsZSB6ZXJvLWluZmxhdGlvbiBwYXJhbWV0ZXIgLS0gaS5lLiwgdGhlIGxldmVsIG9mIHplcm8taW5mbGF0aW9uIGlzIGFzc3VtZWQgY29uc3RhbnQgYWNyb3NzIHRoZSB3aG9sZSBkYXRhIHNldCkKICAgIC0gdHJ1bmNhdGVkIFBvaXNzb24gYW5kIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbnMgKHdoaWNoIGFsbG93cyB0d28tc3RhZ2UgZml0dGluZyBvZiBodXJkbGUgbW9kZWxzKQotIGBnbG1tVE1CYCBoYW5kbGVzIGEgdmFyaWV0eSBvZiBaLUkgYW5kIFotVCBtb2RlbHMgKGFsbG93cyBjb3ZhcmlhdGVzLCBhbmQgcmFuZG9tIGVmZmVjdHMsIGluIHRoZSB6ZXJvLWFsdGVyYXRpb24gbW9kZWwpCi0gYGJybXNgIGRvZXMgdG9vCi0gc28gZG9lcyBgR0xNTWFkYXB0aXZlYAotIEdhdmluIFNpbXBzb24gaGFzIGEgW2RldGFpbGVkIHdyaXRldXBdKGh0dHA6Ly93d3cuZnJvbXRoZWJvdHRvbW9mdGhlaGVhcC5uZXQvMjAxNy8wNS8wNC9jb21wYXJlLW1nY3Ytd2l0aC1nbG1tVE1CLykgc2hvd2luZyB0aGF0IGBtZ2N2OjpnYW0oKWAgY2FuIGRvIHNpbXBsZSBtaXhlZCBtb2RlbHMgKFBvaXNzb24sIG5vdCBOQikgd2l0aCB6ZXJvLWluZmxhdGlvbiwgYW5kIGNvbXBhcmluZyBgbWdjdmAgd2l0aCBgZ2xtbVRNQmAgcmVzdWx0cwotIGBnYW1sc3NOUGAgaW4gdGhlIGBnYW1sc3MubXhgIHBhY2thZ2Ugc2hvdWxkIGhhbmRsZSB6ZXJvLWluZmxhdGlvbiwgYW5kIHRoZSBgZ2FtbHNzLnRyYCBwYWNrYWdlIHNob3VsZCBoYW5kbGUgdHJ1bmNhdGVkIChpLmUuIGh1cmRsZSkgbW9kZWxzIC0tIGJ1dCBJIGhhdmVuJ3QgdHJpZWQgdGhlbQotIHJvbGwteW91ci1vd246IEFETUIvUjJhZG1iLCBXaW5CVUdTL1IyV2luQlVHUywgVE1CLCBTdGFuLCAuLi4gCgojIyMgQ29udGludW91cyBkYXRhCgpDb250aW51b3VzIGRhdGEgYXJlIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBtaXh0dXJlIG1vZGVsIGZvciB6ZXJvLWluZmxhdGVkIGRhdGEgaXMgbGVzcyByZWxldmFudCwgYmVjYXVzZSBvYnNlcnZhdGlvbnMgdGhhdCBhcmUgZXhhY3RseSB6ZXJvIG9jY3VyIHdpdGggKnByb2JhYmlsaXR5KiAoYnV0IG5vdCBwcm9iYWJpbGl0eSBkZW5zaXR5KSB6ZXJvLiBUaGVyZSBhcmUgdHdvIGNhc2VzIG9mIGludGVyZXN0OgoKIyMjIyBQcm9iYWJpbGl0eSBkZW5zaXR5IG9mICR4JCB6ZXJvIG9yIGluZmluaXRlCgpJbiB0aGlzIGNhc2UgemVybyBpcyBhIHByb2JsZW1hdGljIG9ic2VydmF0aW9uIGZvciB0aGUgZGlzdHJpYnV0aW9uOyBpdCdzIGVpdGhlciBpbXBvc3NpYmxlIG9yIGluZmluaXRlbHkgKGxvY2FsbHkpIGxpa2VseS4gU29tZSBleGFtcGxlczoKCi0gR2FtbWEgZGlzdHJpYnV0aW9uOiBwcm9iYWJpbGl0eSBkZW5zaXR5IGF0IHplcm8gaXMgaW5maW5pdGUgKGlmIHNoYXBlPDEpIG9yIHplcm8gKGlmIHNoYXBlPjEpOyBpdCdzIGZpbml0ZSBvbmx5IGZvciBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gKHNoYXBlPT0xKQotIExvZ25vcm1hbCBkaXN0cmlidXRpb246IHRoZSBwcm9iYWJpbGl0eSBkZW5zaXR5IGF0IHplcm8gaXMgemVyby4KLSBCZXRhIGRpc3RyaWJ1dGlvbjogdGhlIHByb2JhYmlsaXR5IGRlbnNpdGllcyBhdCAwIGFuZCAxIGFyZSB6ZXJvIChpZiB0aGUgY29ycmVzcG9uZGluZyBzaGFwZSBwYXJhbWV0ZXIgaXMgPjEpIG9yIGluZmluaXRlIChpZiBzaGFwZTwxKQoKVGhlIGJlc3Qgc29sdXRpb24gZGVwZW5kcyB2ZXJ5IG11Y2ggb24gdGhlIGRhdGEtZ2VuZXJhdGluZyBtZWNoYW5pc20uCgotIElmIHRoZSBiYWQgKDAvMSkgdmFsdWVzIGFyZSBnZW5lcmF0ZWQgYnkgcm91bmRpbmcgKGUuZy4gcHJvcG9ydGlvbnMgdGhhdCBhcmUgdG9vIGNsb3NlIHRvIHRoZSBib3VuZGFyaWVzIGFyZSByZXBvcnRlZCBhcyBiZWluZyBvbiB0aGUgYm91bmRhcmllcyksIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byAic3F1ZWV6ZSIgdGhlc2UgaW4gc2xpZ2h0bHksIGUuZy4gJHkgXHRvICh5ICthKS8yYSQgZm9yIHNvbWUgc2Vuc2libGUgdmFsdWUgb2YgJGEkIFtAc21pdGhzb25fYmV0dGVyXzIwMDZdCi0gSWYgeW91IHRoaW5rIHRoYXQgemVybyB2YWx1ZXMgYXJlIGdlbmVyYXRlZCBieSBhIHNlcGFyYXRlIHByb2Nlc3MsIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byBmaXQgYSBCZXJub3VsbGkgbW9kZWwgdG8gdGhlIHplcm8vbm9uLXplcm8gZGF0YSwgdGhlbiBhICpjb25kaXRpb25hbCogY29udGludW91cyBtb2RlbCBmb3IgdGhlIG5vbi16ZXJvIHZhbHVlczsgdGhpcyBpcyBlZmZlY3RpdmVseSBhICpodXJkbGUgbW9kZWwqLgotIHlvdSBtaWdodCBoYXZlICpjZW5zb3JlZCogZGF0YSB3aGVyZSBhbGwgdmFsdWVzIGJlbG93IGEgY2VydGFpbiBsaW1pdCAoZS5nLiBhIGRldGVjdGlvbiBsaW1pdCkgYXJlIHJlY29yZGVkIGFzIHplcm8uIFRoZSBUaGUgW2xtZWMgcGFja2FnZV0oaHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1sbWVjKSBoYW5kbGVzICpsaW5lYXIqIG1peGVkIG1vZGVsczsgYGJybXNgIGFuZCBgR0xNTWFkYXB0aXZlYCBib3RoIHByb3ZpZGUgc3VwcG9ydCBmb3IgY2Vuc29yZWQgZGF0YSBpbiBtaXhlZCBtb2RlbHMuCi0gVGhlIGBjcGxtYCBhbmQgYGdsbW1UTUJgIHBhY2thZ2VzIGhhbmRsZXMgJ1R3ZWVkaWUgY29tcG91bmQgUG9pc3NvbiBsaW5lYXIgbW9kZWxzJywgd2hpY2ggaW4gYSBwYXJ0aWN1bGFyIHJhbmdlIG9mIHBhcmFtZXRlcnMgYWxsb3dzIGZvciBza2V3ZWQgY29udGludW91cyByZXNwb25zZXMgd2l0aCBhIHNwaWtlIGF0IHplcm8KCiMjIyMgUHJvYmFiaWxpdHkgZGVuc2l0eSBvZiAkeCQgcG9zaXRpdmUgYW5kIGZpbml0ZQoKSW4gdGhpcyBjYXNlIChlLmcuIGEgc3Bpa2Ugb2YgemVyb3MgaW4gdGhlIGNlbnRlciBvZiBhbiBvdGhlcndpc2UgY29udGludW91cyBkaXN0cmlidXRpb24pLCB0aGUgaHVyZGxlIG1vZGVsIHByb2JhYmx5IG1ha2VzIHRoZSBtb3N0IHNlbnNlLgoKIyMjIFRlc3RzIGZvciB6ZXJvLWluZmxhdGlvbgoKLSB5b3UgY2FuIHVzZSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBiZXR3ZWVuIHRoZSByZWd1bGFyIGFuZCB6ZXJvLWluZmxhdGVkIHZlcnNpb24gb2YgdGhlIG1vZGVsLCBidXQgYmUgYXdhcmUgb2YgYm91bmRhcnkgaXNzdWVzIChzZWFyY2ggImJvdW5kYXJ5IiBlbHNld2hlcmUgb24gdGhpcyBwYWdlIC4uLikgLS0gdGhlIG51bGwgdmFsdWUgKG5vIHplcm8gaW5mbGF0aW9uKSBpcyBvbiB0aGUgYm91bmRhcnkgb2YgdGhlIGZlYXNpYmxlIHNwYWNlCi0geW91IGNhbiB1c2UgQUlDIG9yIHZhcmlhdGlvbnMsIHdpdGggdGhlIHNhbWUgY2F2ZWF0cwotIGFjY29yZGluZyB0byBAd2lsc29uTWlzdXNlMjAxNWEgeW91IHNob3VsZCAqKm5vdCoqIHVzZSBWdW9uZydzIHRlc3QgW0B2dW9uZ0xpa2VsaWhvb2QxOTg5XSB3aGVuICBldmVuIHRob3VnaCBpdCBpcyBmcmVxdWVudGx5IHJlY29tbWVuZGVkIGZvciB0ZXN0aW5nIHplcm8taW5mbGF0aW9uIGluIEdMTXMsIGJlY2F1c2UgdGhlIGJvdW5kYXJ5IGlzc3VlcyB0aGF0IGludmFsaWRhdGUgQUlDIGNvbXBhcmlzb25zIGFuZCBsaWtlbGlob29kIHJhdGlvIHRlc3RzIGFsc28gYXBwbHkgdG8gdGhlIFZ1b25nIHRlc3QuIEBoZVRlc3QyMDE5Ci0gdHdvIHVudGVzdGVkIGJ1dCByZWFzb25hYmxlIGFwcHJvYWNoZXM6CiAgICAtICB1c2UgYSBgc2ltdWxhdGUoKWAgbWV0aG9kIGlmIGl0IGV4aXN0cyB0byBjb25zdHJ1Y3QgYSBzaW11bGF0ZWQgZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHplcm9zIGV4cGVjdGVkIG92ZXJhbGwgZnJvbSB5b3VyIG1vZGVsLCBhbmQgY29tcGFyZSBpdCB0byB0aGUgb2JzZXJ2ZWQgcHJvcG9ydGlvbiBvZiB6ZXJvcyBpbiB0aGUgZGF0YSBzZXQKICAgIC0gVHJ5IHRvIGVzdGltYXRlIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgemVyb3MuIFRoZSBbY2hlY2tfemVyb2luZmxhdGlvbiBmdW5jdGlvbiBpbiB0aGUgYHBlcmZvcm1hbmNlYCBwYWNrYWdlXShodHRwczovL2Vhc3lzdGF0cy5naXRodWIuaW8vcGVyZm9ybWFuY2UvcmVmZXJlbmNlL2NoZWNrX3plcm9pbmZsYXRpb24uaHRtbCkgY29tcGFyZXMgZXhwZWN0ZWQgdnMuIG9ic2VydmVkIHRvIHNlZSBpZiB0aGV5IGFyZSB3aXRoaW4gc29tZSBzcGVjaWZpZWQgdGhyZXNob2xkIChieSBkZWZhdWx0IDAuMDUgLSBpLmUuIHRoZSBmdW5jdGlvbiByZXR1cm5zIHVuZGVyLSBvciBvdmVyaW5mbGF0aW9uIGlmIHRoZSBvYnNlcnZlZCBudW1iZXIgb2YgemVyb3MgaXMgbW9yZSB0aGFuIDUlIGRpZmZlcmVudCBmcm9tIHRoZSBleHBlY3RlZCBudW1iZXIgYmFzZWQgb24gdGhlIHByZWRpY3RlZCBwcm9iYWJpbGl0aWVzIG9mIHplcm8gZm9yIGVhY2ggb2JzZXJ2YXRpb24uIEl0IGRvZXMgKipub3QqKiB0cnkgdG8gZ2l2ZSBjb25maWRlbmNlIGludGVydmFscyBvciBhIHAtdmFsdWUgZm9yIHRoZXNlIHByb2JhYmlsaXRpZXMgKHRoaXMgd291bGQgYmUgcG9zc2libGUgaWYgd2UgYXNzdW1lIHRoZXJlIGlzIG5vIHVuY2VydGFpbnR5IGluIHRoZSBlc3RpbWF0ZWQgcGFyYW1ldGVycywgYnV0IHdvdWxkIGJlIGhhcmRlciBvdGhlcndpc2UgLi4uKQoKIyMgU3BhdGlhbCBhbmQgdGVtcG9yYWwgY29ycmVsYXRpb24gbW9kZWxzLCBoZXRlcm9zY2VkYXN0aWNpdHkgKCJSLXNpZGUiIG1vZGVscykKCkluIGBubG1lYCB0aGVzZSBzby1jYWxsZWQgKipSLXNpZGUqKiAoUiBmb3IgInJlc2lkdWFsIikgc3RydWN0dXJlcyBhcmUgYWNjZXNzaWJsZSB2aWEgdGhlIGB3ZWlnaHRzYC9gVmFyU3RydWN0YCAoaGV0ZXJvc2NlZGFzdGljaXR5KSBhbmQgYGNvcnJlbGF0aW9uYC9gY29yU3RydWN0YCAoc3BhdGlhbCBvciB0ZW1wb3JhbCBjb3JyZWxhdGlvbikgYXJndW1lbnRzIGFuZCBkYXRhIHN0cnVjdHVyZXMuIFRoaXMgZXh0ZW5zaW9uIGlzIGEgYml0IGhhcmRlciB0aGFuIGl0IG1pZ2h0IHNlZW0uIEluIExNTXMgaXQgaXMgYSBuYXR1cmFsIGV4dGVuc2lvbiB0byBhbGxvdyB0aGUgcmVzaWR1YWwgZXJyb3IgdGVybXMgdG8gYmUgY29tcG9uZW50cyBvZiBhIHNpbmdsZSBtdWx0aXZhcmlhdGUgbm9ybWFsIGRyYXc7IGlmIHRoYXQgTVZOIGRpc3RyaWJ1dGlvbiBpcyB1bmNvcnJlbGF0ZWQgYW5kIGhvbW9zY2VkYXN0aWMgKGkuZS4gcHJvcG9ydGlvbmFsIHRvIGFuIGlkZW50aXR5IG1hdHJpeCkgd2UgZ2V0IHRoZSBjbGFzc2ljIG1vZGVsLCBidXQgd2UgY2FuIGluIHByaW5jaXBsZSBhbGxvdyBpdCB0byBiZSBjb3JyZWxhdGVkIGFuZC9vciBoZXRlcm9zY2VkYXN0aWMuCgpJdCBpcyBub3QgdG9vIGhhcmQgdG8gZGVmaW5lIG1hcmdpbmFsIGNvcnJlbGF0aW9uIHN0cnVjdHVyZXMgdGhhdCBkb24ndCBtYWtlIHNlbnNlLiAgT25lIGNsYXNzIG9mIHJlYXNvbmFibHkgc2Vuc2libGUgbW9kZWxzIGlzIHRvIGFsd2F5cyBhc3N1bWUgYW4gb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdCAoYXMgTUNNQ2dsbW0gZG9lcyBmb3IgY29tcHV0YXRpb25hbCByZWFzb25zKSBhbmQgdG8gYWxsb3cgdGhhdCByYW5kb20gZWZmZWN0IHRvIGJlIE1WTiBvbiB0aGUgbGluayBzY2FsZSAoc28gdGhhdCB0aGUgZnVsbCBtb2RlbCBpcyBsb2dub3JtYWwtUG9pc3NvbiwgbG9naXQtbm9ybWFsIGJpbm9taWFsLCBldGMuLCBkZXBlbmRpbmcgb24gdGhlIGxpbmsgZnVuY3Rpb24gYW5kIGZhbWlseSkuCgpGb3IgZXhhbXBsZSwgYSByZWxhdGl2ZWx5IHNpbXBsZSBQb2lzc29uIG1vZGVsIHdpdGggc3BhdGlhbGx5IGNvcnJlbGF0ZWQgZXJyb3JzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgoKJCQKXGJlZ2lue3NwbGl0fQpcZXRhICYgXHNpbSBcdGV4dHJte01WTn0oYSArIGIgeCwgXFNpZ21hKSBcXApcU2lnbWFfe2lqfSAmID0gXHNpZ21hXjIgXGV4cCgtZF97aWp9L3MpIFxcCnlfaSAmIFxzaW0gXHRleHRybXtQb2lzc29ufShcbGFtYmRhPVxleHAoXGV0YV9pKSkKXGVuZHtzcGxpdH0KJCQKClRoYXQgaXMsIHRoZSBtYXJnaW5hbCBkaXN0cmlidXRpb25zIG9mIHRoZSByZXNwb25zZSB2YWx1ZXMgYXJlIFBvaXNzb24tbG9nbm9ybWFsLCBidXQgb24gdGhlIGxpbmsgKGxvZykgc2NhbGUgdGhlIGxhdGVudCBOb3JtYWwgdmFyaWFibGVzIHVuZGVybHlpbmcgdGhlIHJlc3BvbnNlIGFyZSAqbXVsdGl2YXJpYXRlKiBub3JtYWwsIHdpdGggYSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBkZXNjcmliZWQgYnkgYW4gZXhwb25lbnRpYWwgc3BhdGlhbCBjb3JyZWxhdGlvbiBmdW5jdGlvbiB3aXRoIHNjYWxlIHBhcmFtZXRlciAkcyQuCgpIb3cgY2FuIG9uZSBhY2hpZXZlIHRoaXM/CgotIFRoZXNlIHR5cGVzIG9mIG1vZGVscyBhcmUgbm90IGltcGxlbWVudGVkIGluIGBsbWU0YCwgZm9yIGVpdGhlciBMTU1zIG9yIEdMTU1zOyB0aGV5IGFyZSBmYWlybHkgbG93IHByaW9yaXR5LCBhbmQgaXQgaXMgaGFyZCB0byBzZWUgaG93IHRoZXkgY291bGQgYmUgaW1wbGVtZW50ZWQgZm9yIEdMTU1zICh0aGUgZXF1aXZhbGVudCBmb3IgTE1NcyBpcyB0ZWRpb3VzIGJ1dCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIHRvIGltcGxlbWVudCkuCi0gRm9yIExNTXMsIHlvdSBjYW4gdXNlIHRoZSBzcGF0aWFsL3RlbXBvcmFsIGNvcnJlbGF0aW9uIHN0cnVjdHVyZXMgdGhhdCBhcmUgYnVpbHQgaW50byAobilsbWUKLSBZb3UgY2FuIHVzZSB0aGUgc3BhdGlhbC90ZW1wb3JhbCBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVzIGF2YWlsYWJsZSBmb3IgKG4pbG1lLCB3aGljaCBpbmNsdWRlIGJhc2ljIGdlb3N0YXRpc3RpY2FsIChzcGFjZSkgYW5kIEFSTUEtdHlwZSAodGltZSkgbW9kZWxzLiAKYGBge3IgZmluZGNvcnMsZXZhbD1GQUxTRX0KbGlicmFyeShzb3MpCmZpbmRGbigiY29yU3RydWN0IikKYGBgCmZpbmRzIGFkZGl0aW9uYWwgcG9zc2liaWxpdGllcyBpbiB0aGUgYHJhbXBzYCAoZXh0ZW5kZWQgZ2Vvc3RhdGlzdGljYWwpIGFuZCBgYXBlYCAocGh5bG9nZW5ldGljKSBwYWNrYWdlcy4KCi0gWW91IGNhbiB1c2UgdGhlc2Ugc3RydWN0dXJlcyBpbiBHTE1NcyB2aWEgYE1BU1M6OmdsbW1QUUxgIChzZWUgRG9ybWFubiBldCBhbC4pCi0gZ2VlcGFjazo6Z2VlZ2xtCi0gZ2VvUiwgZ2VvUmdsbSAocG93ZXIgdG9vbHMpOyB0aGVzZSBhcmUgbW9zdGx5IGRlc2lnbmVkIGZvciBmaXR0aW5nIHNwYXRpYWwgcmFuZG9tIGZpZWxkIEdMTU1zIHZpYSBNQ01DIC0tIG5vdCBzdXJlIHRoYXQgdGhleSBkbyByYW5kb20gZWZmZWN0cyBvdGhlciB0aGFuIHRoZSBzcGF0aWFsIHJhbmRvbSBlZmZlY3QKLSBbUi1JTkxBXShodHRwOi8vci1pbmxhLm9yZykgKHN1cGVyLXBvd2VyIHRvb2wpCi0gaXQgaXMgcG9zc2libGUgdG8gdXNlIEFEIE1vZGVsIEJ1aWxkZXIgdG8gZml0IHNwYXRpYWwgR0xNTXMsIGFzIHNob3duIGluIHRoZXNlIFtBRCBNb2RlbCBCdWlsZGVyIGV4YW1wbGVzXShodHRwOi8vYWRtYi1wcm9qZWN0Lm9yZy9leGFtcGxlcy9zcGF0aWFsLW1vZGVscyk7IHRoaXMgY2FwYWJpbGl0eSBpcyBub3QgaW4gdGhlIGBnbG1tQURNQmAgcGFja2FnZSAoYW5kIG1heSBub3QgYmUgZm9yIGEgd2hpbGUhKSwgYnV0IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHJ1biBBRCBNb2RlbCBCdWlsZGVyIHZpYSB0aGUgUjJhZG1iIHBhY2thZ2UgKHJlcXVpcmVzIGluc3RhbGxpbmcgLS0gYW5kIGxlYXJuaW5nISBBRE1CKQotIFtnZW9CVUdTXShodHRwOi8vbWF0aHN0YXQuaGVsc2lua2kuZmkvb3BlbmJ1Z3MvTWFudWFscy9HZW9CVUdTL01hbnVhbC5odG1sKSwgdGhlIGdlb3N0YXRpc3RpY2FsL3NwYXRpYWwgY29ycmVsYXRpb24gbW9kdWxlIGZvciBXaW5CVUdTLCBpcyBhbm90aGVyIGFsdGVybmF0aXZlIChidXQgYWdhaW4gcmVxdWlyZXMgZ29pbmcgb3V0c2lkZSBvZiBSKQoKIyMgUGVuYWxpemF0aW9uL2hhbmRsaW5nIGNvbXBsZXRlIHNlcGFyYXRpb24KCipDb21wbGV0ZSBzZXBhcmF0aW9uKiBvY2N1cnMgaW4gYSBiaW5hcnktcmVzcG9uc2UgbW9kZWwgd2hlbiB0aGVyZSBpcwpzb21lIGxpbmVhciBjb21iaW5hdGlvbiBvZiB0aGUgcGFyYW1ldGVycyB0aGF0IHBlcmZlY3RseSBzZXBhcmF0ZXMgZmFpbHVyZXMKZnJvbSBzdWNjZXNzZXMgLSBmb3IgZXhhbXBsZSwgd2hlbiBhbGwgb2YgdGhlIG9ic2VydmF0aW9ucyBhcmUgemVybwpmb3Igc29tZSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mIGNhdGVnb3JpZXMuIFRoZSBzeW1wdG9tcyBvZiB0aGlzCnByb2JsZW0gYXJlIHVucmVhbGlzdGljYWxseSBsYXJnZSBwYXJhbWV0ZXIgZXN0aW1hdGVzOyByaWRpY3Vsb3VzbHkKbGFyZ2UgV2FsZCBzdGFuZGFyZCBlcnJvcnMgKHRoZSAqSGF1Y2stRG9ubmVyIGVmZmVjdCopOyBhbmQgdmFyaW91cwp3YXJuaW5ncy4KCkluIHBhcnRpY3VsYXIsIGJpbm9taWFsIGBnbG1lcigpYCBtb2RlbHMgd2l0aCBjb21wbGV0ZSBzZXBhcmF0aW9uIGNhbiBsZWFkIHRvCiJEb3duZGF0ZWQgVnRWIGlzIG5vdCBwb3NpdGl2ZSBkZWZpbml0ZSIgKGUuZy4gc2VlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vbG1lNC9sbWU0L2lzc3Vlcy80ODMpKSBvciAiUElSTFMgc3RlcC1oYWx2aW5ncyBmYWlsZWQgdG8gcmVkdWNlIGRldmlhbmNlIGluIHB3cnNzVXBkYXRlIiBlcnJvcnMgKGUuZy4gc2VlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vbG1lNC9sbWU0L2lzc3Vlcy8xNzkjaXNzdWVjb21tZW50LTQyNDQ0NTE4NykpLiBSb3VnaGx5IHNwZWFraW5nLCB0aGUgY29tcGxldGUgc2VwYXJhdGlvbiBpcyBsaWtlbHkgdG8gYXBwZWFyIGV2ZW4gaWYgb25lIGNvbnNpZGVycyBvbmx5IHRoZSBmaXhlZCBlZmZlY3RzIHBhcnQgb2YgdGhlIG1vZGVsIChjb3VudGVyYXJndW1lbnRzIG9yIGNvdW50ZXJleGFtcGxlcyB3ZWxjb21lISksIHN1Z2dlc3RpbmcgdHdvIHF1aWNrLWFuZC1kaXJ0eSBkaWFnbm9zdGljIG1ldGhvZHMuIElmIGBmaXhlZF9mb3JtYCBpcyB0aGUgZm9ybXVsYSBpbmNsdWRpbmcgb25seSB0aGUgZml4ZWQgZWZmZWN0czoKCi0gYHN1bW1hcnkoZzEgPC0gZ2xtKGZpeGVkX2Zvcm0sIGZhbWlseT1iaW5vbWlhbCwgZGF0YT0uLi4pKWAgd2lsbCBzaG93IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgc3ltcHRvbXM6CiAgICAgLSB3YXJuaW5ncyB0aGF0IGBnbG0uZml0OiBmaXR0ZWQgcHJvYmFiaWxpdGllcyBudW1lcmljYWxseSAwIG9yIDEgb2NjdXJyZWRgCiAgICAgLSBwYXJhbWV0ZXIgZXN0aW1hdGVzIG9mIGxhcmdlIG1hZ25pdHVkZSAoZS5nLiBgYW55KGFicyhnMSRjb2VmZmljaWVudHMpPjgpYCwgYXNzdW1pbmcgdGhhdCBwcmVkaWN0b3JzIGFyZSBlaXRoZXIgY2F0ZWdvcmljYWwgb3Igc2NhbGVkIHRvIGhhdmUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiAkXGFwcHJveCAxJCkKCSAtIGV4dHJlbWVseSBsYXJnZSBXYWxkIHN0YW5kYXJkIGVycm9ycywgYW5kIGxhcmdlIHAtdmFsdWVzICgqSGF1Y2stRG9ubmVyIGVmZmVjdCopCgkgLSB0aGUgYGRldGVjdHNlcGFyYXRpb25gIHBhY2thZ2UgaGFzIGEgbWV0aG9kIGZvciBkZXRlY3RpbmcgY29tcGxldGUgc2VwYXJhdGlvbjogYGxpYnJhcnkoImRldGVjdHNlcGFyYXRpb24iKTsgdXBkYXRlKGcxLG1ldGhvZD0iZGV0ZWN0X3NlcGFyYXRpb24iKWAuIFRoaXMgc2hvdWxkIHNheSB3aGV0aGVyIGNvbXBsZXRlIHNlcGFyYXRpb24gb2NjdXJzLCBhbmQgaW4gd2hpY2ggKGNvbWJpbmF0aW9ucyBvZikgdmFyaWFibGVzLCBlLmcuCgpgYGAKU2VwYXJhdGlvbjogVFJVRSAKRXhpc3RlbmNlIG9mIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZXMKKEludGVyY2VwdCkgICAgICBoZWlnaHQgCiAgICAgICAgSW5mICAgICAgICAgSW5mIAowOiBmaW5pdGUgdmFsdWUsIEluZjogaW5maW5pdHksIC1JbmY6IC1pbmZpbml0eQpgYGAKCklmIGNvbXBsZXRlIHNlcGFyYXRpb24gaXMgb2NjdXJyaW5nIGJldHdlZW4gY2F0ZWdvcmllcyBvZiBhIHNpbmdsZSBjYXRlZ29yaWNhbCBmaXhlZC1lZmZlY3QgcHJlZGljdG9yIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgbGV2ZWxzLCBvbmUgb3B0aW9uIHdvdWxkIGJlIHRvIHRyZWF0IHRoaXMgZml4ZWQgZWZmZWN0IGFzIGEgcmFuZG9tIGVmZmVjdCwgd2hpY2ggd2lsbCBhbGxvdyBzb21lIGRlZ3JlZSBvZiBzaHJpbmthZ2UgdG8gdGhlIG1lYW4uIChJdCBtaWdodCBiZSByZWFzb25hYmxlIHRvIHNwZWNpZnkgdGhlIHZhcmlhbmNlIG9mIHRoaXMgdGVybSAqYSBwcmlvcmkqIHRvIGEgbGFyZ2UgdmFsdWUgW21pbmltYWwgc2hyaW5rYWdlXSwgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGVzdGltYXRlIGl0IGZyb20gdGhlIGRhdGEuKQoKKCoqVE9ETyoqOiB3b3JrZWQgZXhhbXBsZSkKClRoZSBnZW5lcmFsIGFwcHJvYWNoIHRvIGhhbmRsaW5nIGNvbXBsZXRlIHNlcGFyYXRpb24gaW4gbG9naXN0aWMgcmVncmVzc2lvbgppcyBjYWxsZWQgKnBlbmFsaXplZCByZWdyZXNzaW9uKjsgaXQncyBhdmFpbGFibGUgaW4gdGhlIGBicmdsbWAsCmBicmdsbTJgLCBgbG9naXN0ZmAsIGFuZCBgcm1zYCBwYWNrYWdlcy4gSG93ZXZlciwgdGhlc2UgcGFja2FnZXMKZG9uJ3QgaGFuZGxlIG1peGVkIG1vZGVscywgc28gdGhlIGJlc3QgYXZhaWxhYmxlICpnZW5lcmFsKiBhcHByb2FjaCBpcyB0bwp1c2UgYSBCYXllc2lhbiBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIHNldCBhIHByaW9yIG9uIHRoZSBmaXhlZCBlZmZlY3RzLAplLmcuIGEgR2F1c3NpYW4gd2l0aCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMzsgdGhpcyBjYW4gYmUgZG9uZQppbiBhbnkgb2YgdGhlIEJheWVzaWFuIEdMTU0gcGFja2FnZXMgKGUuZy4gYGJsbWVgLCBgTUNNQ2dsbW1gLCBgYnJtc2AsIC4uLikKKFNlZSBbc3VwcGxlbWVudGFyeSBtYXRlcmlhbCBmb3IgRm94IGV0IGFsLiAyMDE2XShodHRwOi8vYmJvbGtlci5naXRodWIuaW8vbWl4ZWRtb2RlbHMtbWlzYy9lY29zdGF0c19jaGFwLmh0bWwjZGlncmVzc2lvbi1jb21wbGV0ZS1zZXBhcmF0aW9uKSBmb3IgYSB3b3JrZWQgZXhhbXBsZS4pCgojIyBOb24tR2F1c3NpYW4gcmFuZG9tIGVmZmVjdHMKCkknbSBub3QgYXdhcmUgb2YgZWFzeSB3YXlzIHRvIGZpdCBtaXhlZCBtb2RlbHMgd2l0aCBub24tR2F1c3NpYW4gcmFuZG9tIGVmZmVjdHMgZGlzdHJpYnV0aW9ucyBpbiBSIChpLmUuLCBjb252ZW5pZW50LCBmbGV4aWJsZSwgd2VsbC10ZXN0ZWQgaW1wbGVtZW50YXRpb25zKS4gQG1jY3VsbG9jaF9taXNzcGVjaWZ5aW5nXzIwMTEgZGlzY3Vzc2VzIHdoZW4gdGhpcyBtaXNzcGVjaWZpY2F0aW9uIG1heSBiZSBpbXBvcnRhbnQuIFtUaGlzIHByZXNlbnRhdGlvbl0oaHR0cHM6Ly9uaWFzcmEudW93LmVkdS5hdS9jb250ZW50L2dyb3Vwcy9wdWJsaWMvQHdlYi9AaW5mL0BtYXRoL2RvY3VtZW50cy9tbS91b3cyMzYyOTYucGRmKSBkaXNjdXNzZXMgdmFyaW91cyBhcHByb2FjaGVzIHRvIHNvbHZpbmcgdGhlIHByb2JsZW0gKGUuZy4gdXNpbmcgYSBHYW1tYSByYXRoZXIgdGhhbiBhIE5vcm1hbCBkaXN0cmlidXRpb24gb2YgUkVzIGluIGxvZy1saW5rICBtb2RlbHMpLiBUaGUgYHNwYU1NYCBwYWNrYWdlIGltcGxlbWVudHMgSC1saWtlbGlob29kIG1vZGVscyBbQGxlZV9nZW5lcmFsaXplZF8yMDE3XSwgYW5kIGNsYWltcyB0byBhbGxvdyBhIHJhbmdlIG9mIHJhbmRvbS1lZmZlY3RzIGRpc3RyaWJ1dGlvbnMgKHBlcmhhcHMgbm90IHdlbGwgdGVzdGVkIHRob3VnaCAuLi4pCgpJbiBwcmluY2lwbGUgeW91IGNhbiBpbXBsZW1lbnQgYW55IHJhbmRvbS1lZmZlY3RzIGRpc3RyaWJ1dGlvbiB5b3Ugd2FudCBpbiBhIGZ1bGx5IGNhcGFibGUgQmF5ZXNpYW4gbW9kZWxpbmcgbGFuZ3VhZ2UgKGUuZy4gSkFHUy9TdGFuL1B5TUMvZXRjLik7IHNlZSBlLmcuIFt0aGlzIFN0YWNrT3ZlcmZsb3cgYW5zd2VyXShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NTY1NjcxNC91c2VyLWRlZmluZWQtcmFuZG9tLWludGVyY2VwdC1kaXN0cmlidXRpb24tZm9yLWdsbWVyKSwgd2hpY2ggdXNlcyB0aGUgYHJldGhpbmtpbmdgIHBhY2thZ2UncyBpbnRlcmZhY2UgdG8gU3Rhbi4KCiMgRXN0aW1hdGlvbiAKCiMjIFdoYXQgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIGZpdCAoZXN0aW1hdGUpIEdMTU1zPwoKKGFkYXB0ZWQgZnJvbSBCb2xrZXIgZXQgYWwgVFJFRSAyMDA5KQoKYGBge3IgZ2xtbXRhYixlY2hvPUZBTFNFLHJlc3VsdHM9ImFzaXMifQptZXRodGFiIDwtIHJlYWQudGFibGUoc2VwPSJ8IixoZWFkZXI9VFJVRSx0ZXh0PSIKTWV0aG9kIHwgQWR2YW50YWdlcyB8IERpc2FkdmFudGFnZXMgfCBQYWNrYWdlcwpQZW5hbGl6ZWQgcXVhc2ktbGlrZWxpaG9vZCB8IEZsZXhpYmxlLCB3aWRlbHkgaW1wbGVtZW50ZWQgfCBMaWtlbGlob29kIGluZmVyZW5jZSBtYXkgYmUgaW5hcHByb3ByaWF0ZTsgYmlhc2VkIGZvciBsYXJnZSB2YXJpYW5jZSBvciBzbWFsbCBtZWFucyB8IFBST0MgR0xJTU1JWCAoU0FTKSwgR0xNTSAoR2VuU3RhdCksIGdsbW1QUUwgKFI6TUFTUyksIEFTUkVNTC1SCkxhcGxhY2UgYXBwcm94aW1hdGlvbiB8IE1vcmUgYWNjdXJhdGUgdGhhbiBQUUwgfCBTbG93ZXIgYW5kIGxlc3MgZmxleGlibGUgdGhhbiBQUUwgfCBnbG1lciAoUjpsbWU0LGxtZTRhKSwgZ2xtbS5hZG1iIChSOmdsbW1BRE1CKSwgSU5MQSwgZ2xtbVRNQiwgQUQgTW9kZWwgQnVpbGRlciwgSExNIApHYXVzcy1IZXJtaXRlIHF1YWRyYXR1cmUgfCBNb3JlIGFjY3VyYXRlIHRoYW4gTGFwbGFjZSB8IFNsb3dlciB0aGFuIExhcGxhY2U7IGxpbWl0ZWQgdG8gMuKAkTMgcmFuZG9tIGVmZmVjdHMgfCBQUk9DIE5MTUlYRUQgKFNBUyksIGdsbWVyIChSOmxtZTQsIGxtZTRhKSwgZ2xtbU1MIChSOmdsbW1NTCksIHh0bG9naXQgKFN0YXRhKQpNYXJrb3YgY2hhaW4gTW9udGUgQ2FybG8gfCBIaWdobHkgZmxleGlibGUsIGFyYml0cmFyeSBudW1iZXIgb2YgcmFuZG9tIGVmZmVjdHM7IGFjY3VyYXRlIHwgU2xvdywgdGVjaG5pY2FsbHkgY2hhbGxlbmdpbmcsIEJheWVzaWFuIGZyYW1ld29yayB8IE1DTUNnbG1tIChSOk1DTUNnbG1tKSwgcnN0YW5hcm0gKFIpLCBicm1zIChSKSwgTUNNQ3BhY2sgKFIpLCBXaW5CVUdTL09wZW5CVUdTIChSIGludGVyZmFjZTogQlJ1Z3MvUjJXaW5CVUdTKSwgSkFHUyAoUiBpbnRlcmZhY2U6IHJqYWdzL1IyamFncyksIEFEIE1vZGVsIEJ1aWxkZXIgKFIgaW50ZXJmYWNlOiBSMmFkbWIpLCBnbG1tLmFkbWIgKHBvc3QgaG9jIE1DTUMgYWZ0ZXIgTGFwbGFjZSBmaXQpIChSOmdsbW1BRE1CKSIKKQpzZXQuYWxpZ25tZW50KGRlZmF1bHQ9ImxlZnQiKQpwYW5kZXIobWV0aHRhYixzcGxpdC50YWJsZT1JbmYpCmBgYAoKVGhlc2UgYXBwcm9hY2hlcyAoUFFMLCBMYXBsYWNlIGFwcHJveGltYXRpb24sIEdIUSwgTUNNQykgYXJlIG1vc3QgY29tbW9uLiBPdGhlciBsZXNzLWNvbW1vbiBtZXRob2RzIGluY2x1ZGUgTW9udGUgQ2FybG8gRU0gW0Bib290aF9tYXhpbWl6aW5nXzE5OTk7IEBrbnVkc29uTGlrZWxpaG9vZGJhc2VkMjAyMV0gKGBnbG1tYCBwYWNrYWdlKSwgaGllcmFyY2hpY2FsIEdMTXMgKHdoaWNoIHVzZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgaW5mZXJlbmNlIGZyYW1ld29yazogW0BqaW5SZXZpZXcyMDIxOyBAbWVuZ0RlY29kaW5nMjAwOTsgQG1lbmdXaGF0MjAxMV0pLiBBbHNvIHNlZSB0aGUgW01peGVkIE1vZGVscyBUYXNrIFZpZXddKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy9NaXhlZE1vZGVscy5odG1sKS4KCgojIyBUcm91Ymxlc2hvb3RpbmcKCi0gZG91YmxlLWNoZWNrIHRoZSBtb2RlbCBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgZGF0YSBmb3IgbWlzdGFrZXMKLSBjZW50ZXIgYW5kIHNjYWxlIGNvbnRpbnVvdXMgcHJlZGljdG9yIHZhcmlhYmxlcyAoZS5nLiB3aXRoIGBzY2FsZSgpYCkKLSB0cnkgYWxsIGF2YWlsYWJsZSBvcHRpbWl6ZXJzIChlLmcuIHNldmVyYWwgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBCT0JZUUEgYW5kIE5lbGRlci1NZWFkLCBMLUJGR1MtQiBmcm9tICBgb3B0aW1gLCBgbmxtaW5iKClgLCAuLi4pLiAgV2hpbGUgdGhpcyB3aWxsIG9mIGNvdXJzZSBiZSBzbG93IGZvciBsYXJnZSBmaXRzLCB3ZSBjb25zaWRlciBpdCB0aGUgZ29sZCBzdGFuZGFyZDsgaWYgYWxsIG9wdGltaXplcnMgY29udmVyZ2UgdG8gdmFsdWVzIHRoYXQgYXJlIHByYWN0aWNhbGx5IGVxdWl2YWxlbnQgKGl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gZGVjaWRlIHdoYXQgInByYWN0aWNhbGx5IGVxdWl2YWxlbnQgbWVhbnMgZm9yIHRoZWlyIGNhc2UiKSwgdGhlbiB3ZSB3b3VsZCBjb25zaWRlciB0aGUgbW9kZWwgZml0IHRvIGJlIGdvb2QgZW5vdWdoLiBGb3IgZXhhbXBsZToKYGBge3IgYWxsZml0LGV2YWw9RkFMU0V9Cm1vZGVsZml0LmFsbCA8LSBsbWU0OjphbGxGaXQobW9kZWwpCnNzIDwtIHN1bW1hcnkobW9kZWxmaXQuYWxsKQpgYGAKCiMjIyBDb252ZXJnZW5jZSB3YXJuaW5ncwoKTW9zdCBvZiB0aGUgY3VycmVudCBhZHZpY2UgYWJvdXQgdHJvdWJsZXNob290aW5nIGBsbWU0YCBjb252ZXJnZW5jZSBwcm9ibGVtcyBjYW4gYmUgZm91bmQgaW4gdGhlIGhlbHAgcGFnZSBgP2NvbnZlcmdlbmNlYC4gVGhhdCBwYWdlIGV4cGxhaW5zIHRoYXQgdGhlIGNvbnZlcmdlbmNlIHRlc3RzIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYGxtZTRgICgxLjEtMTEsIEZlYnJ1YXJ5IDIwMTYpIGdlbmVyYXRlIGxvdHMgb2YgZmFsc2UgcG9zaXRpdmVzLiBXZSBhcmUgY29uc2lkZXJpbmcgcmFpc2luZyB0aGUgZ3JhZGllbnQgd2FybmluZyB0aHJlc2hvbGQgdG8gMC4wMSBpbiBmdXR1cmUgcmVsZWFzZXMgb2YgYGxtZTRgLiBJbiBhZGRpdGlvbiB0byB0aGUgZ2VuZXJhbCB0cm91Ymxlc2hvb3RpbmcgdGlwcyBhYm92ZToKCi0gZG91YmxlLWNoZWNrIHRoZSBIZXNzaWFuIGNhbGN1bGF0aW9uIHdpdGggdGhlIG1vcmUgZXhwZW5zaXZlIFJpY2hhcmRzb24gZXh0cmFwb2xhdGlvbiBtZXRob2QgKHNlZSBleGFtcGxlcykKLSByZXN0YXJ0IHRoZSBmaXQgZnJvbSB0aGUgYXBwYXJlbnQgb3B0aW11bSwgb3IgZnJvbSBhIHBvaW50IHBlcnR1cmJlZCBzbGlnaHRseSBhd2F5IGZyb20gdGhlIG9wdGltdW0gKGBnZXRNRShtb2RlbCxjKCJ0aGV0YSIsImJldGEiKSlgIHNob3VsZCByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyBpbiBhIGZvcm0gc3VpdGFibGUgdG8gYmUgdXNlZCBhcyB0aGUgYHN0YXJ0YCBwYXJhbWV0ZXIpCi0gYSBjb21tb24gZXJyb3IgaXMgdG8gc3BlY2lmeSBhbiBvZmZzZXQgdG8gYSBsb2ctbGluayBtb2RlbCBhcyBhIHJhdyBzZWFyY2hpbmctZWZmb3J0IHZhbHVlLCBpLmUuIGBvZmZzZXQoZWZmb3J0KWAgcmF0aGVyIHRoYW4gYG9mZnNldChsb2coZWZmb3J0KSlgLiBXaGlsZSB0aGUgaW50ZW50aW9uIGlzIHRvIGZpdCBhIG1vZGVsIHdoZXJlICRcdGV4dHJte2NvdW50c30gXHByb3B0byBcdGV4dHJte2VmZm9ydH0kLCBzcGVjaWZ5aW5nIGBvZmZzZXQoZWZmb3J0KWAgbGVhZHMgdG8gYSBtb2RlbCB3aGVyZSAkXHRleHRybXtjb3VudHN9IFxwcm9wdG8gXGV4cChcdGV4dHJte2VmZm9ydH0pJCBpbnN0ZWFkOyBgZXhwKGVmZm9ydClgIGlzIG9mdGVuIGEgaHVnZSAoYW5kIG1vZGVsLWRlc3RhYmlsaXppbmcpIG51bWJlci4KCltde3Npbmd1bGFyLWZpdH0KW117emVyby12YXJpYW5jZX0KPCEtLSBwcmVzZXJ2ZSBsaW5rIGJhc2VkIG9uIHByZXZpb3VzIHNlY3Rpb24gdGl0bGUgLS0+Cltde3Npbmd1bGFyLW1vZGVscy1yYW5kb20tZWZmZWN0LXZhcmlhbmNlcy1lc3RpbWF0ZWQtYXMtemVyby1vci1jb3JyZWxhdGlvbnMtZXN0aW1hdGVkLWFzLS0tMX0KPCEtLSA8YSBpZD0ic2luZ3VsYXItZml0Ij48L2E+CjxhIGlkPSJ6ZXJvLXZhcmlhbmNlIj48L2E+IC0tPgoKaHR0cHM6Ly9iYm9sa2VyLmdpdGh1Yi5pby9taXhlZG1vZGVscy1taXNjL2dsbW1GQVEuaHRtbCNzaW5ndWxhci1tb2RlbHMtcmFuZG9tLWVmZmVjdC12YXJpYW5jZXMtZXN0aW1hdGVkLWFzLXplcm8tb3ItY29ycmVsYXRpb25zLWVzdGltYXRlZC1hcy0tLTEKIyMjIFNpbmd1bGFyIG1vZGVsczogcmFuZG9tIGVmZmVjdCB2YXJpYW5jZXMgZXN0aW1hdGVkIGFzIHplcm8sIG9yIGNvcnJlbGF0aW9ucyBlc3RpbWF0ZWQgYXMgKy8tIDEKCkl0IGlzIHZlcnkgY29tbW9uIGZvciBvdmVyZml0dGVkIG1peGVkIG1vZGVscyB0byByZXN1bHQgaW4gc2luZ3VsYXIgZml0cy4gVGVjaG5pY2FsbHksIHNpbmd1bGFyaXR5IG1lYW5zIHRoYXQgdGhlIHJhbmRvbSBlZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGlzIG9mICpsZXNzIHRoYW4gZnVsbCByYW5rKi4gVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBkZXNjcmliZSB0aGlzLCBmcm9tIG1vcmUgdG8gbGVzcyB0ZWNobmljYWw6CgotIHNvbWUgb2YgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBhcmUgemVybywgb3IgZWZmZWN0aXZlbHkgemVybzsKLSBzb21lIGNvbWJpbmF0aW9ucyBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHJhbmRvbS1lZmZlY3RzIHZlY3RvciBhcmUgcGVyZmVjdGx5IG11bHRpY29sbGluZWFyOwotIHNvbWUgbGluZWFyIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBvZiB0aGUgcmFuZG9tLWVmZmVjdHMgdmVjdG9yIGhhdmUgemVybyB2YXJpYW5jZTsKLSBhbiAkbiBcdGltZXMgbiQgY292YXJpYW5jZSBtYXRyaXggY29ycmVzcG9uZHMgdG8gYW4gJG4kLWRpbWVuc2lvbmFsIGVsbGlwc29pZCB3aGVyZSB0aGUgbGVuZ3RocyBvZiB0aGUgbWFqb3IgYXhlcyBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBlaWdlbnZhbHVlczsgdGhlIGVsbGlwc29pZCBpcyAiZmxhdCIgaW4gc29tZSBkaXJlY3Rpb25zLCBlLmcuIGFuIGVsbGlwc2UgaGFzIGNvbGxhcHNlZCB0byBhIGxpbmUgc2VnbWVudAoKLSBJbiB0aGUgY2FzZSBvZiBhIHNjYWxhciByYW5kb20gZWZmZWN0IHN1Y2ggYXMgYSByYW5kb20gaW50ZXJjZXB0LCB0aGlzIGlzIGVhc3kgdG8gdW5kZXJzdGFuZCAtIHRoZSByYW5kb20gZWZmZWN0cyB2YXJpYW5jZSBpcyB6ZXJvIG9yIG5lYXIgemVybwotIEluIHRoZSBjYXNlIG9mIGEgdHdvLWRpbWVuc2lvbmFsIHJhbmRvbSBlZmZlY3QgKHN1Y2ggYXMgYSByYW5kb20tc2xvcGVzIG1vZGVsKSwgdGhpcyB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gYSBwZXJmZWN0ICgrLy0gMSkgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgc2xvcGUgYW5kIGludGVyY2VwdAotIGluIGhpZ2hlci1kaW1lbnNpb25hbCByYW5kb20gZWZmZWN0cyAoc3VjaCBhcyB0aGUgcmFuZG9tIGVmZmVjdCBvZiBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHdpdGggbW9yZSB0aGFuIHR3byBsZXZlbHMsIG9yIGEgcmFuZG9tLXNsb3BlcyBtb2RlbCB3aXRoIG1vcmUgdGhhbiBvbmUgY292YXJpYXRlKSwgaXQncyBwcmV0dHkgbXVjaCBpbXBvc3NpYmxlIHRvIHNlZSBhdCBhIGdsYW5jZSB0aGF0IHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBpcyBzaW5ndWxhci4gRXh0cmFjdGluZyB0aGUgUkUgY292YXJpYW5jZSBtYXRyaXggYW5kIGNvbXB1dGluZyBpdHMgZWlnZW52YWx1ZXMgKHRoaXMgaXMgd2hhdCBgcmVQQ0FgIGluIHRoZSBgbG1lNGAgcGFja2FnZSBkb2VzKSB3aWxsIHRlbGwgeW91LiBJbiB0aGUgcGFydGljdWxhciBjYXNlIG9mIGBsbWU0YCwgc2luZ3VsYXJpdHkgaXMgZGV0ZWN0YWJsZSBieSBzZWVpbmcgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgJFxib2xkc3ltYm9sIFx0aGV0YSQgKHZhcmlhbmNlLWNvdmFyaWFuY2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbikgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gZGlhZ29uYWwgZWxlbWVudHMgYXJlIChuZWFyKSB6ZXJvOyB0aGlzIGlzIHdoYXQgYD9pc1Npbmd1bGFyYCBkb2VzLgoKU2luZ3VsYXIgZml0cyBjb21tb25seSBvY2N1ciBpbiB0d28gc2NlbmFyaW9zOgoKLSBzbWFsbCBudW1iZXJzIG9mIHJhbmRvbS1lZmZlY3QgbGV2ZWxzIChlLmcuIDw1KSwgYXMgaWxsdXN0cmF0ZWQgaW4gW3RoZXNlIHNpbXVsYXRpb25zXShodHRwOi8vcnB1YnMuY29tL2Jib2xrZXIvNDE4NykgYW5kIGRpc2N1c3NlZCAoaW4gYSBzb21ld2hhdCBkaWZmZXJlbnQsIEJheWVzaWFuIGNvbnRleHQpIGJ5IEBnZWxtYW5fcHJpb3JfMjAwNi4KLSBjb21wbGV4IHJhbmRvbS1lZmZlY3RzIG1vZGVscywgZS5nLiBtb2RlbHMgb2YgdGhlIGZvcm0gYChmfGcpYCB3aGVyZSBgZmAgaXMgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB3aXRoIGEgcmVsYXRpdmVseSBsYXJnZSBudW1iZXIgb2YgbGV2ZWxzLCBvciBtb2RlbHMgd2l0aCBzZXZlcmFsIGRpZmZlcmVudCByYW5kb20tc2xvcGVzIHRlcm1zLgoKLSBJbiBgTUNNQ2dsbW1gLCBzaW5ndWxhciBvciBuZWFyLXNpbmd1bGFyIG1vZGVscyB3aWxsIHByb3Zva2UgYW4gZXJyb3IgYW5kIGEgcmVxdWlyZW1lbnQgdG8gc3BlY2lmeSBhIHN0cm9uZ2VyIHByaW9yLgoKQXQgcHJlc2VudCB0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIHN0cm9uZyBvcGluaW9ucyBhYm91dCBob3cgdG8gcmVzb2x2ZSBzdWNoIHByb2JsZW1zLiBCcmllZmx5OgoKLSBAYmFycl9yYW5kb21fMjAxMyBzdWdnZXN0IGFsd2F5cyBzdGFydGluZyB3aXRoIHRoZSBtYXhpbWFsIG1vZGVsIChpLmUuIHRoZSBtb3N0IHJhbmRvbS1lZmZlY3RzIGNvbXBvbmVudCBvZiB0aGUgbW9kZWwgdGhhdCBpcyAqdGhlb3JldGljYWxseSogaWRlbnRpZmlhYmxlIGdpdmVuIHRoZSBleHBlcmltZW50YWwgZGVzaWduKSBhbmQgdGhlbiBkcm9wcGluZyB0ZXJtcyB3aGVuIHNpbmd1bGFyaXR5IG9yIG5vbi1jb252ZXJnZW5jZSBvY2N1cnMgKHBsZWFzZSBzZWUgdGhlIHBhcGVyIGZvciBkZXRhaWxlZCByZWNvbW1lbmRhdGlvbnMgLi4uKQotIEBtYXR1c2NoZWtfYmFsYW5jaW5nXzIwMTcgYW5kIEBiYXRlc19wYXJzaW1vbmlvdXNfMjAxNSBzdHJvbmdseSBkaXNhZ3JlZSwgc3VnZ2VzdGluZyB0aGF0IG1vZGVscyBzaG91bGQgYmUgc2ltcGxpZmllZCAqYSBwcmlvcmkqIHdoZW5ldmVyIHBvc3NpYmxlOyB0aGV5IGFsc28gcHJvdmlkZSBbdG9vbHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdGVzL1JlUHN5Y2hMaW5nKSBmb3IgZGlhZ25vc2luZyBhbmQgbWl0aWdhdGluZyBzaW5ndWxhcml0eS4KLSBPbmUgYWx0ZXJuYXRpdmUgKHN1Z2dlc3RlZCBieSBSb2JlcnQgTGFCdWRkZSkgZm9yIHRoZSBzbWFsbC1udW1iZXJzLW9mLWxldmVscyBzY2VuYXJpbyBpcyB0byAiZml0IHRoZSBtb2RlbCB3aXRoIHRoZSByYW5kb20gZmFjdG9yIGFzIGEgZml4ZWQgZWZmZWN0LCBnZXQgdGhlIGxldmVsIGNvZWZmaWNpZW50cyBpbiB0aGUgc3VtIHRvIHplcm8gZm9ybSwgYW5kIHRoZW4gY29tcHV0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMuIiBUaGlzIGlzIGFwcHJvcHJpYXRlIGZvciB1c2VycyB3aG8gYXJlIChhKSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiBtZWFzdXJpbmcgdmFyaWF0aW9uIChpLmUuIHRoZSByYW5kb20gZWZmZWN0cyBhcmUgbm90IGp1c3QgbnVpc2FuY2UgcGFyYW1ldGVycywgYW5kIHRoZSB2YXJpYWJpbGl0eSBbcmF0aGVyIHRoYW4gdGhlIGVzdGltYXRlZCB2YWx1ZXMgZm9yIGVhY2ggbGV2ZWxdIGlzIG9mIHNjaWVudGlmaWMgaW50ZXJlc3QpLCAoYikgdW5hYmxlIG9yIHVud2lsbGluZyB0byB1c2Ugb3RoZXIgYXBwcm9hY2hlcyAoZS5nLiBNQ01DIHdpdGggaGFsZi1DYXVjaHkgcHJpb3JzIGluIFdpbkJVR1MpLCAoYykgdW5hYmxlIG9yIHVud2lsbGluZyB0byBjb2xsZWN0IG1vcmUgZGF0YS4gRm9yIHRoZSBzaW1wbGVzdCBjYXNlIChiYWxhbmNlZCwgb3J0aG9nb25hbCwgbmVzdGVkIGRlc2lnbnMgd2l0aCBub3JtYWwgZXJyb3JzKSB0aGVzZSBlc3RpbWF0ZXMgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBzaG91bGQgZXF1YWwgdGhlIGNsYXNzaWNhbCBtZXRob2Qtb2YtbW9tZW50cyBlc3RpbWF0ZXMuCi0gQmF5ZXNpYW4gYXBwcm9hY2hlcyBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgaW5mb3JtYXRpdmUgcHJpb3IgdGhhdCBhdm9pZHMgc2luZ3VsYXJpdHkuCiAgICAtIFRoZSBgYmxtZWAgcGFja2FnZSBbQGNodW5nX25vbmRlZ2VuZXJhdGVfMjAxM10gcHJvdmlkZXMgYSB3cmFwcGVyIGZvciB0aGUgYGxtZTRgIG1hY2hpbmVyeSB0aGF0IGFkZHMgYSBwYXJ0aWN1bGFyIGZvcm0gb2Ygd2VhayBwcmlvciB0byBnZXQgYW4gYXBwcm94aW1hdGUgYSBCYXllc2lhbiBtYXhpbXVtICphIHBvc3RlcmlvcmkqIGVzdGltYXRlIHRoYXQgYXZvaWRzIHNpbmd1bGFyaXR5LgogICAgLSBUaGUgYE1DTUNnbG1tYCBwYWNrYWdlIGFsbG93cyBmb3IgcHJpb3JzIG9uIHRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeAoJLSBUaGUgYHJzdGFuYXJtYCBhbmQgYGJybXNgIHBhY2thZ2VzIHByb3ZpZGUgd3JhcHBlcnMgZm9yIHRoZSBTdGFuIEhhbWlsdG9uaWFuIE1DTUMgZW5naW5lIHRoYXQgZml0IEdMTU1zIHZpYSBgbG1lNGAgc3ludGF4LCBhZ2FpbiBhbGxvd2luZyBhIHZhcmlldHkgb2YgcHJpb3JzIHRvIGJlIHNldC4KLSBJZiBhIHZhcmlhbmNlIGNvbXBvbmVudCBpcyB6ZXJvLCBkcm9wcGluZyBpdCBmcm9tIHRoZSBtb2RlbCB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIGFueSBvZiB0aGUgZXN0aW1hdGVkIHF1YW50aXRpZXMgKGFsdGhvdWdoIGl0IHdpbGwgYWZmZWN0IHRoZSBBSUMsIGFzIHRoZSB2YXJpYW5jZSBwYXJhbWV0ZXIgaXMgY291bnRlZCBldmVuIHRob3VnaCBpdCBoYXMgbm8gZWZmZWN0KS4gQHBhc2NoX2ludGVyc3BlY2lmaWNfMjAxMyBnaXZlcyBvbmUgZXhhbXBsZSB3aGVyZSByYW5kb20gZWZmZWN0cyB3ZXJlIGRyb3BwZWQgYmVjYXVzZSB0aGUgdmFyaWFuY2UgY29tcG9uZW50cyB3ZXJlIGNvbnNpc3RlbnRseSBlc3RpbWF0ZWQgYXMgemVyby4gQ29udmVyc2VseSwgaWYgb25lIGNob29zZXMgZm9yIHBoaWxvc29waGljYWwgZ3JvdW5kcyB0byByZXRhaW4gdGhlc2UgcGFyYW1ldGVycywgaXQgd29uJ3QgY2hhbmdlIGFueSBvZiB0aGUgYW5zd2Vycy4KCiMjIyBTZXR0aW5nIHJlc2lkdWFsIHZhcmlhbmNlcyB0byBhIGZpeGVkIHZhbHVlICh6ZXJvIG9yIG90aGVyKQoKRm9yIHNvbWUgcHJvYmxlbXMgaXQgd291bGQgYmUgY29udmVuaWVudCB0byBiZSBhYmxlIHRvIHNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2UgdGVybSB0byB6ZXJvLCBvciBhIGZpeGVkIHZhbHVlLiBUaGlzIGlzIGRpZmZpY3VsdCBpbiBgbG1lNGAsIGJlY2F1c2UgdGhlIG1vZGVsIGlzIHBhcmFtZXRlcml6ZWQgaW50ZXJuYWxseSBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlIGlzIHByb2ZpbGVkIG91dCAoaS5lLiwgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGEgcmVzaWR1YWwgZGV2aWFuY2UgdGVybSkgYW5kIHRoZSByYW5kb20tZWZmZWN0cyB2YXJpYW5jZXMgYXJlIHNjYWxlZCBieSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UuCgpbU2VhcmNoaW5nIHRoZSByLXNpZy1taXhlZC1tb2RlbHMgbGlzdCBmb3IgImZpeCByZXNpZHVhbCB2YXJpYW5jZSJdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jYS9zZWFyY2g/cT1zaXRlJTNBJTJGJTJGc3RhdC5ldGh6LmNoJTJGcGlwZXJtYWlsJTJGci1zaWctbWl4ZWQtbW9kZWxzJTJGK2ZpeCtyZXNpZHVhbCt2YXJpYW5jZSkKCi0gVGhpcyBpcyBkb25lIGluIHRoZSBgbWV0YWZvcmAgcGFja2FnZSwgZm9yIG1ldGEtYW5hbHl0aWMgbW9kZWxzCi0gWW91IGNhbiB1c2UgdGhlIGBibG1lYCBwYWNrYWdlIHRvIGZpeCB0aGUgcmVzaWR1YWwgdmFyaWFuY2U6IGZyb20gVmluY2VudCBEb3JpZSwKYGBgCmxpYnJhcnkoYmxtZSkKYmxtZXIoZm9ybXVsYSA9IHkgfiAxICsgKDEgfCBncm91cCksIHdlaWdodHMgPSBWLAogICAgICByZXNpZC5wcmlvciA9IHBvaW50KDEuMCksIGNvdi5wcmlvciA9IE5VTEwpCmBgYApUaGlzIHNldHMgdGhlIHJlc2lkdWFsIHZhcmlhbmNlIHRvIDEuMC4gIFlvdSAqY2Fubm90KiB1c2UgdGhpcyB0byBtYWtlIGl0CmV4YWN0bHkgemVybywgYnV0IHlvdSBjYW4gbWFrZSBpdCB2ZXJ5IHNtYWxsIChhbmQgZXhwZXJpbWVudCB3aXRoIHNldHRpbmcKaXQgdG8gZGlmZmVyZW50IHNtYWxsIHZhbHVlcywgZS5nLiAwLjAwMSB2cyAwLjAwMDEsIHRvIHNlZSBob3cgc2Vuc2l0aXZlCnRoZSByZXN1bHRzIGFyZSkuCi0gU2ltaWxhcmx5LCB5b3UgY2FuIGZpeCB0aGUgcmVzaWR1YWwgdmFyaWFuY2UgdG8gYSBzbWFsbCBwb3NpdGl2ZSB2YWx1ZSBpbiBgW25dbG1lYCB2aWEgdGhlIGBjb250cm9sKClgIGFyZ3VtZW50IFtAaGVpc3RlcmthbXBfdXBkYXRlXzIwMTddOgpgYGB7ciBsbWVfenZhcixyZXN1bHRzPSJoaWRlIn0KbmxtZTo6bG1lKFJlYWN0aW9ufkRheXMscmFuZG9tPX4xfFN1YmplY3QsCiAgICAgICAgICBkYXRhPWxtZTQ6OnNsZWVwc3R1ZHksCiAgICAgICAgICBjb250cm9sPWxpc3Qoc2lnbWE9MWUtOCkpCmBgYAotIHRoZSBgZ2xtbVRNQmAgcGFja2FnZSBjYW4gc2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZSB0byB6ZXJvLCBieSBzcGVjaWZ5aW5nIGBkaXNwZm9ybXVsYSA9IH4wYAotIFRoZXJlIGlzIGFuIFtyckJsdXBNZXRob2Q2IHBhY2thZ2VdKGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9cnJCbHVwTWV0aG9kNikgb24gQ1JBTiAoIlJlLXBhcmFtZXRyaXphdGlvbiBvZiBtaXhlZCBtb2RlbCBmb3JtdWxhdGlvbiB0byBhbGxvdyBmb3IgYSBmaXhlZCByZXNpZHVhbCB2YXJpYW5jZSB3aGVuIHVzaW5nIFJSLUJMVVAgZm9yIGdlbm9tW2Vdd2lkZSBlc3RpbWF0aW9uIG9mIG1hcmtlciBlZmZlY3RzIiksIGJ1dCBpdCBzZWVtcyBmYWlybHkgc3BlY2lhbC1wdXJwb3NlLgotIGl0IG1pZ2h0IGJlIHBvc3NpYmxlICppbiBwcmluY2lwbGUqIHRvIGFkYXB0IGBsbWU0YCdzIGludGVybmFsIGBkZXZmdW4yKClgIGZ1bmN0aW9uICh1c2VkIGluIHRoZSBsaWtlbGlob29kIHByb2ZpbGluZyBjb21wdXRhdGlvbiBmb3IgTE1NcyksIHdoaWNoIHVzZXMgYSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIHJlc2lkdWFsIHN0YW5kYXJkIGRldmlhdGlvbiBpbiBjb21wdXRpbmcgbGlrZWxpaG9vZCwgYnV0IGFzIEBiYXRlc19maXR0aW5nXzIwMTUgc2F5OgoKPiBUaGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGlzIG5vdCB1c2VmdWwgZm9yIGdlbmVyYWwgbm9ubGluZWFyIG9wdGltaXphdGlvbiDigJQgb25lIGNhbiBlYXNpbHkgd2FuZGVyIGludG8gcGFyYW1ldGVyIHJlZ2ltZXMgY29ycmVzcG9uZGluZyB0byBpbmZlYXNpYmxlIChub24tcG9zaXRpdmUgc2VtaWRlZmluaXRlKSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpY2VzIOKAlCBidXQgaXQgc2VydmVzIGZvciBsaWtlbGlob29kIHByb2ZpbGluZywgd2hlcmUgb25lIGZvY2FsIHBhcmFtZXRlciBpcyB2YXJpZWQgYXQgYSB0aW1lIGFuZCB0aGUgb3B0aW1pemF0aW9uIG92ZXIgdGhlIG90aGVyIHBhcmFtZXRlcnMgaXMgbGlrZWx5IHRvIHN0YXJ0IGNsb3NlIHRvIGFuIG9wdGltdW0uCgojIyMgT3RoZXIgcHJvYmxlbXMvYGxtZTRgIGVycm9yIG1lc3NhZ2VzCgpNb3N0IG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZXMgYXJlIHJlbGF0aXZlbHkgdW51c3VhbCwgYW5kIGhhcHBlbiBtb3N0bHkgd2l0aCBjb21wbGV4L2xhcmdlL3Vuc3RhYmxlIG1vZGVscy4gVGhlcmUgaXMgb2Z0ZW4gbm8gc2ltcGxlIGZpeDsgdGhlIHN0YW5kYXJkIHN1Z2dlc3Rpb25zIGZvciB0cm91Ymxlc2hvb3RpbmcgYXJlICgxKSB0cnkgcmVzY2FsaW5nIGFuZC9vciBjZW50ZXJpbmcgcHJlZGljdG9yczsgKDIpIHNlZSBpZiBhIHNpbXBsZXIgbW9kZWwgY2FuIGJlIG1hZGUgdG8gd29yazsgKDMpIGxvb2sgZm9yIHNldmVyZSBsYWNrIG9mIGJhbGFuY2UgYW5kL29yIGNvbXBsZXRlIHNlcGFyYXRpb24gaW4gdGhlIGRhdGEgc2V0LgoKLSBgUElSTFMgc3RlcC1oYWx2aW5ncyBmYWlsZWQgdG8gcmVkdWNlIGRldmlhbmNlIGluIHB3cnNzVXBkYXRlYAoJLSB0aGlzIGNhbiBhbHNvIG9jY3VyIGR1ZSB0byBjb21wbGV0ZSBvciBxdWFzaS1jb21wbGV0ZSBzZXBhcmF0aW9uIChzZWUgW1BlbmFsaXphdGlvbi9oYW5kbGluZyBjb21wbGV0ZSBzZXBhcmF0aW9uXSgjcGVuYWxpemF0aW9uaGFuZGxpbmctY29tcGxldGUtc2VwYXJhdGlvbikKICAgIC0gV2hlbiB1c2luZyBgbG1lNGAgdG8gZml0IEdMTU1zIHdpdGggbGluayBmdW5jdGlvbnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBjb25zdHJhaW4gdGhlIHJlc3BvbnNlIHRvIHRoZSBhbGxvd2FibGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbmFsIGZhbWlseSAoZS5nLiBiaW5vbWlhbCBtb2RlbHMgd2l0aCBhIGxvZyBsaW5rLCB3aGVyZSB0aGUgZXN0aW1hdGVkIHByb2JhYmlsaXR5IGNhbiBiZSA+MSwgb3IgaW52ZXJzZS1HYW1tYSBtb2RlbHMsIHdoZXJlIHRoZSBlc3RpbWF0ZWQgbWVhbiBjYW4gYmUgbmVnYXRpdmUpLCBpdCBpcyBub3QgdW51c3VhbCB0byBnZXQgdGhpcyBlcnJvci4gIFRoaXMgb2NjdXJzIGJlY2F1c2UgYGxtZTRgIGRvZXNuJ3QgZG8gYW55dGhpbmcgdG8gY29uc3RyYWluIHRoZSBwcmVkaWN0ZWQgdmFsdWVzLCBzbyBgTmFOYCB2YWx1ZXMgcG9wIHVwLCB3aGljaCBhcmVuJ3QgaGFuZGxlZCBncmFjZWZ1bGx5LiBJZiBwb3NzaWJsZSwgc3dpdGNoIHRvIGEgbGluayBmdW5jdGlvbiB0byBvbmUgdGhhdCBjb25zdHJhaW5zIHRoZSByZXNwb25zZSAoZS5nLiBsb2dpdCBsaW5rIGZvciBiaW5vbWlhbCBvciBsb2cgbGluayBmb3IgR2FtbWEpLgoJLSBvdGhlcndpc2UgdGhpcyBtZXNzYWdlIG9mdGVuIG9jY3VycyB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyBlbHNlIHdyb25nIHdpdGggdGhlIG1vZGVsIG9yIGRhdGEsIGUuZy4gCgkgICAgICAtIFthIG1vZGVsIGZpdHRlZCB0byB1bmRlcmRpc3BlcnNlZCBkYXRhIGluY2x1ZGVzIGJvdGggYSBuZWdhdGl2ZSBiaW5vbWlhbCByZXNwb25zZSBhbmQgb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdHNdKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI4MDM2MzM0L3VzaW5nLWdsbWVyLW5iLXRoZS1lcnJvci1tZXNzYWdlbWF4c3RlcGhhbGZpdC1waXJscy1zdGVwLWhhbHZpbmdzLWZhaWxlZC10KQoJCSAgLSBbbmVnYXRpdmUgcmVzcG9uc2UgdmFsdWVzIGZvciBhIGxpbmsgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IGFsbG93IHRoZW1dKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3NTMzODI1L2Vycm9yLW1heHN0ZXBoYWxmaXQtcGlybHMtc3RlcC1oYWx2aW5ncy1mYWlsZWQtdG8tcmVkdWNlLWRldmlhbmNlLWluLXB3cnNzdXBkKQotIGBEb3duZGF0ZWQgVnRWIGlzIG5vdCBwb3NpdGl2ZSBkZWZpbml0ZWA6IG5vIHNwZWNpZmljIGFkdmljZSwgc2VlIGdlbmVyYWwgc3VnZ2VzdGlvbnMgYWJvdmUKLSBgY29udmVyZ2VuY2UgY29kZSAzIGZyb20gYm9ieXFhOiBib2J5cWEgLS0gYSB0cnVzdCByZWdpb24gc3RlcCBmYWlsZWQgdG8gcmVkdWNlIHFgOiBhZ2FpbiBubyBzcGVjaWZpYyBhZHZpY2UgYWJvdXQgZml4aW5nIHRoaXMsIGFsdGhvdWdoIHRoZXJlIGlzIGEgW3VzZWZ1bCBkaXNjdXNzaW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBlcnJvciBtZXNzYWdlIG9uIENyb3NzVmFsaWRhdGVkXShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy84OTk0NS9tZWFuaW5nLW9mLWEtY29udmVyZ2VuY2Utd2FybmluZy1pbi1nbG1lcikKCiMjIFJFTUwgZm9yIEdMTU1zCgotIFdoaWxlIHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIChSRU1MKSBwcm9jZWR1cmVzIChbV2lraXBlZGlhXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Jlc3RyaWN0ZWRfbWF4aW11bV9saWtlbGlob29kKSBhcmUgd2VsbCBlc3RhYmxpc2hlZCBmb3IgbGluZWFyIG1peGVkIG1vZGVscywgaXQgaXMgbGVzcyBjbGVhciBob3cgb25lIHNob3VsZCBkZWZpbmUgYW5kIGNvbXB1dGUgdGhlIGVxdWl2YWxlbnQgY3JpdGVyaWEgKGludGVncmF0aW5nIG91dCB0aGUgZWZmZWN0cyBvZiBmaXhlZCBwYXJhbWV0ZXJzKSBmb3IgR0xNTXMuIEBtaWxsYXJfbWF4aW11bV8yMDExIGFuZCBAYmVyZ2VyX2ludGVncmF0ZWRfMTk5OSBhcmUgcG9zc2libGUgc3RhcnRpbmcgcG9pbnRzIGluIHRoZSBwZWVyLXJldmlld2VkIGxpdGVyYXR1cmUsIGFuZCB0aGVyZSBhcmUgbWFpbGluZy1saXN0IGRpc2N1c3Npb25zIG9mIHRoZXNlIGlzc3VlcyBbaGVyZV0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvcGlwZXJtYWlsL3Itc2lnLW1peGVkLW1vZGVscy8yMDA5cTEvMDAyMTA0Lmh0bWwpIGFuZCBbaGVyZV0oaHR0cDovL2xpc3RzLmFkbWItcHJvamVjdC5vcmcvcGlwZXJtYWlsL3VzZXJzLzIwMTEtSnVuZS8wMDEyMjQuaHRtbCkuCi0gQXR0ZW1wdGluZyB0byB1c2UgYFJFTUw9VFJVRWAgd2l0aCBgZ2xtZXJgIHdpbGwgcHJvZHVjZSB0aGUgd2FybmluZyBgZXh0cmEgYXJndW1lbnQocykg4oCYUkVNTOKAmSBkaXNyZWdhcmRlZGAKLSBgZ2xtbVRNQmAgYWxsb3dzIGBSRU1MPVRSVUVgIGZvciBHTE1NcyAoaXQgdXNlcyB0aGUgTGFwbGFjZSBhcHByb3hpbWF0aW9uIHRvIGludGVncmF0ZSBvdmVyIHRoZSBmaXhlZCBlZmZlY3QgcGFyYW1ldGVycyksIHNpbmNlIHZlcnNpb24gMC4yLjIgCgojIE1vZGVsIGRpYWdub3N0aWNzCgojIEluZmVyZW5jZSBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKCiMjIFRlc3RpbmcgaHlwb3RoZXNlcwoKIyMjIFdoYXQgYXJlIHRoZSBwLXZhbHVlcyBsaXN0ZWQgYnkgYHN1bW1hcnkoZ2xtZXJmaXQpYCBldGMuPyAgQXJlIHRoZXkgcmVsaWFibGU/CgpCeSBkZWZhdWx0LCBpbiBrZWVwaW5nIHdpdGggdGhlIHRyYWRpdGlvbiBpbiBhbmFseXNpcyBvZiBnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWxzLCBgbG1lNGAgYW5kIHNpbWlsYXIgcGFja2FnZXMgZGlzcGxheSB0aGUgV2FsZCBaLXN0YXRpc3RpY3MgZm9yIGVhY2ggcGFyYW1ldGVyIGluIHRoZSBtb2RlbCBzdW1tYXJ5LiBUaGVzZSBoYXZlIG9uZSBiaWcgYWR2YW50YWdlOiB0aGV5J3JlIGNvbnZlbmllbnQgdG8gY29tcHV0ZS4gIEhvd2V2ZXIsIHRoZXkgYXJlIGFzeW1wdG90aWMgYXBwcm94aW1hdGlvbnMsIGFzc3VtaW5nIGJvdGggdGhhdCAoMSkgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG11bHRpdmFyaWF0ZSBub3JtYWwgKG9yIGVxdWl2YWxlbnRseSB0aGF0IHRoZSBsb2ctbGlrZWxpaG9vZCBzdXJmYWNlIGlzIHF1YWRyYXRpYykgYW5kIHRoYXQgKDIpIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgdGhlIGxvZy1saWtlbGlob29kIGlzIChwcm9wb3J0aW9uYWwgdG8pICRcY2hpXjIkLiAgVGhlIHNlY29uZCBhcHByb3hpbWF0aW9uIGlzIGRpc2N1c3NlZCBmdXJ0aGVyIHVuZGVyICJEZWdyZWVzIG9mIGZyZWVkb20iLiAgVGhlIGZpcnN0IGFzc3VtcHRpb24gdXN1YWxseSByZXF1aXJlcyBhbiBldmVuIGdyZWF0ZXIgbGVhcCBvZiBmYWl0aCwgYW5kIGlzIGtub3duIHRvIGNhdXNlIHByb2JsZW1zIGluIHNvbWUgY29udGV4dHMgKGZvciBiaW5vbWlhbCBtb2RlbHMgZmFpbHVyZXMgb2YgdGhpcyBhc3N1bXB0aW9uIGFyZSBjYWxsZWQgdGhlICpIYXVjay1Eb25uZXIgZWZmZWN0KiksIGVzcGVjaWFsbHkgd2l0aCBleHRyZW1lLXZhbHVlZCBwYXJhbWV0ZXJzLgoKIyMjIE1ldGhvZHMgZm9yIHRlc3Rpbmcgc2luZ2xlIHBhcmFtZXRlcnMKCkZyb20gd29yc3QgdG8gYmVzdDoKCi0gV2FsZCAkWiQtdGVzdHMKLSAqKkZvciBiYWxhbmNlZCwgbmVzdGVkIExNTXMqKiB3aGVyZSBkZWdyZWVzIG9mIGZyZWVkb20gY2FuIGJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBjbGFzc2ljYWwgcnVsZXM6IFdhbGQgJHQkLXRlc3RzIAotIExpa2VsaWhvb2QgcmF0aW8gdGVzdCwgZWl0aGVyIGJ5IHNldHRpbmcgdXAgdGhlIG1vZGVsIHNvIHRoYXQgdGhlIHBhcmFtZXRlciBjYW4gYmUgaXNvbGF0ZWQvZHJvcHBlZCAodmlhIGBhbm92YWAgb3IgYGRyb3AxYCwgb3IgdmlhIGNvbXB1dGluZyBsaWtlbGlob29kIHByb2ZpbGVzCi0gTWFya292IGNoYWluIE1vbnRlIENhcmxvIChNQ01DKSBvciBwYXJhbWV0cmljIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscwoKIyMjIFRlc3RzIG9mIGVmZmVjdHMgKGkuZS4gdGVzdGluZyB0aGF0IHNldmVyYWwgcGFyYW1ldGVycyBhcmUgc2ltdWx0YW5lb3VzbHkgemVybykKCkZyb20gd29yc3QgdG8gYmVzdDoKCi0gV2FsZCBjaGktc3F1YXJlIHRlc3RzIChlLmcuIGBjYXI6OkFub3ZhYCkKLSBMaWtlbGlob29kIHJhdGlvIHRlc3QgKHZpYSBgYW5vdmFgIG9yIGBkcm9wMWApCi0gKipGb3IgYmFsYW5jZWQsIG5lc3RlZCBMTU1zKiogd2hlcmUgZGYgY2FuIGJlIGNvbXB1dGVkOiBjb25kaXRpb25hbCBGLXRlc3RzIAotICoqRm9yIExNTXMqKjogY29uZGl0aW9uYWwgRi10ZXN0cyB3aXRoIGRmIGNvcnJlY3Rpb24gKGUuZy4gS2Vud2FyZC1Sb2dlciBpbiBgcGJrcnRlc3RgIHBhY2thZ2U6IHNlZSBub3RlcyBvbiBLLVIgZXRjIFtiZWxvd10oI2RkZikuIAotIE1DTUMgb3IgcGFyYW1ldHJpYywgb3Igbm9ucGFyYW1ldHJpYywgYm9vdHN0cmFwIGNvbXBhcmlzb25zIChub25wYXJhbWV0cmljIGJvb3RzdHJhcHBpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCBjYXJlZnVsbHkgdG8gYWNjb3VudCBmb3IgZ3JvdXBpbmcgZmFjdG9ycykKCiMjIyBJcyB0aGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IHJlbGlhYmxlIGZvciBtaXhlZCBtb2RlbHM/CgotIEl0IGRlcGVuZHMuCi0gTm90IGZvciBmaXhlZCBlZmZlY3RzIGluIGZpbml0ZS1zaXplIGNhc2VzIChzZWUgQHBpbmhlaXJvX21peGVkLWVmZmVjdHNfMjAwMCk6IG1heSBkZXBlbmQgb24gJ2Rlbm9taW5hdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbScgKG51bWJlciBvZiBncm91cHMpIGFuZC9vciB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyAtIHRvdGFsIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gQ29uZGl0aW9uYWwgRi10ZXN0cyBhcmUgcHJlZmVycmVkIGZvciBMTU1zLCAqKmlmKiogZGVub21pbmF0b3IgZGVncmVlcyBvZiBmcmVlZG9tIGFyZSBrbm93bgoKPGEgaWQ9ImRkZiI+PC9hPgoKIyMjIFdoeSBkb2Vzbid0IGBsbWU0YCBkaXNwbGF5IGRlbm9taW5hdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbS9wIHZhbHVlcz8gIFdoYXQgb3RoZXIgb3B0aW9ucyBkbyBJIGhhdmU/CgpUaGVyZSBpcyBhbiBbUiBGQVEgZW50cnldKGh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL0ZBUS9SLUZBUS5odG1sI1doeS1hcmUtcF8wMDJkdmFsdWVzLW5vdC1kaXNwbGF5ZWQtd2hlbi11c2luZy1sbWVyXzAwMjhfMDAyOV8wMDNmKSBvbiB0aGlzIHRvcGljLCB3aGljaCBsaW5rcyB0byBhIFttYWlsaW5nIGxpc3QgcG9zdF0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvcGlwZXJtYWlsL3ItaGVscC8yMDA2LU1heS8wOTQ3NjUuaHRtbCkgYnkgRG91ZyBCYXRlcyAodGhlcmUgaXMgYWxzbyBhIHZvbHVtaW5vdXMgW21haWxpbmcgbGlzdCB0aHJlYWRdKGh0dHA6Ly9yd2lraS5zY2l2aWV3cy5vcmcvZG9rdS5waHA/aWQ9Z3VpZGVzOmxtZXItdGVzdHMpIHJlcHJvZHVjZWQgb24gdGhlIFIgd2lraSkuIFRoZSBib3R0b20gbGluZSBpcyAKCi0gRm9yIHNwZWNpYWwgY2FzZXMgdGhhdCBjb3JyZXNwb25kIHRvIGNsYXNzaWNhbCBleHBlcmltZW50YWwgZGVzaWducyAoaS5lLiBiYWxhbmNlZCBkZXNpZ25zIHRoYXQgYXJlIG5lc3RlZCwgc3BsaXQtcGxvdCwgcmFuZG9taXplZCBibG9jaywgZXRjLikgLi4uIHdlIGNhbiBzaG93IHRoYXQgdGhlIG51bGwgZGlzdHJpYnV0aW9ucyBvZiBwYXJ0aWN1bGFyIHJhdGlvcyBvZiBzdW1zIG9mIHNxdWFyZXMgZm9sbG93IGFuICRGJCBkaXN0cmlidXRpb24gd2l0aCBrbm93biBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbSAoYW5kIGhlbmNlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mIHBhcnRpY3VsYXIgY29udHJhc3RzIGFyZSB0LWRpc3RyaWJ1dGVkIHdpdGgga25vd24gZGYpLiBJbiBtb3JlIGNvbXBsaWNhdGVkIHNpdHVhdGlvbnMgKHVuYmFsYW5jZWQsIEdMTU1zLCBjcm9zc2VkIHJhbmRvbSBlZmZlY3RzLCBtb2RlbHMgd2l0aCB0ZW1wb3JhbCBvciBzcGF0aWFsIGNvcnJlbGF0aW9uLCBldGMuKSBpdCBpcyBub3QgaW4gZ2VuZXJhbCBjbGVhciB0aGF0IHRoZSBudWxsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgY29tcHV0ZWQgcmF0aW8gb2Ygc3VtcyBvZiBzcXVhcmVzIGlzIHJlYWxseSBhbiBGIGRpc3RyaWJ1dGlvbiwgZm9yICphbnkqIGNob2ljZSBvZiBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20uCi0gRm9yIGVhY2ggc2ltcGxlIGRlZ3JlZXMtb2YtZnJlZWRvbSByZWNpcGUgdGhhdCBoYXMgYmVlbiBzdWdnZXN0ZWQgKHRyYWNlIG9mIHRoZSBoYXQgbWF0cml4LCBldGMuKSB0aGVyZSBzZWVtcyB0byBiZSBhdCBsZWFzdCBvbmUgZmFpcmx5IHNpbXBsZSBjb3VudGVyZXhhbXBsZSB3aGVyZSB0aGUgcmVjaXBlIGZhaWxzIGJhZGx5IChlLmcuIHNlZSBbdGhpcyByLWhlbHAgdGhyZWFkIGZyb20gU2VwdGVtYmVyIDIwMDZdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLWhlbHAvMjAwNi1TZXB0ZW1iZXIvMTEyNDk1Lmh0bWwpKS4KLSBXaGVuIHRoZSByZXNwb25zZXMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCB0aGUgZGVzaWduIGlzIGJhbGFuY2VkLCBuZXN0ZWQgZXRjLiAoaS5lLiB0aGUgY2xhc3NpY2FsIExNTSBzaXR1YXRpb24pLCB0aGUgc2NhbGVkIGRldmlhbmNlcyBhbmQgZGlmZmVyZW5jZXMgaW4gZGV2aWFuY2VzIGFyZSBleGFjdGx5ICRGJC1kaXN0cmlidXRlZCBhbmQgbG9va2luZyBhdCB0aGUgZXhwZXJpbWVudGFsIGRlc2lnbiAoaS5lLiwgd2hpY2ggdHJlYXRtZW50cyB2YXJ5L2FyZSByZXBsaWNhdGVkIGF0IHdoaWNoIGxldmVscykgdGVsbHMgdXMgd2hhdCB0aGUgcmVsZXZhbnQgZGVncmVlcyBvZiBmcmVlZG9tIGFyZSAoc2VlICJkZiBhbHRlcm5hdGl2ZXMiIGJlbG93KQotIFR3byBhcHByb2FjaGVzIHRvIGFwcHJveGltYXRpbmcgZGYgKFNhdHRlcnRod2FpdGUgYW5kIEtlbndhcmQtUm9nZXIpIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiBSLCBTYXR0ZXJ0aHdhaXRlIGluIGBsbWVyVGVzdGAgYW5kIEtlbndhcmQtUm9nZXIgaW4gYHBia3J0ZXN0YCAoYXMgYEtSbW9kY29tcGApICh2YXJpb3VzIHBhY2thZ2VzIHN1Y2ggYXMgYGxtZXJUZXN0YCwgYGVtbWVhbnNgLCBgY2FyYCwgZXRjLiwgaW1wb3J0IGBwYmtydGVzdDo6Z2V0X0xiX2RkZmApLgogICAgLSBLLVIgaXMgcHJvYmFibHkgdGhlIG1vc3QgcmVsaWFibGUgb3B0aW9uIFtAc2NoYWFsamVfYWRlcXVhY3lfMjAwMl0sIGFsdGhvdWdoIGl0IG1heSBiZSBwcm9oaWJpdGl2ZWx5IGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUgZm9yIGxhcmdlIGRhdGEgc2V0cy4KICAgIC0gSy1SIHdhcyBkZXJpdmVkIGZvciBMTU1zIChhbmQgZm9yIFJFTUw/KSBpbiBwYXJ0aWN1bGFyLCBpdCBpc24ndCBjbGVhciBob3cgaXQgd291bGQgYXBwbHkgdG8gR0xNTXMuIEBzdHJvdXBfcmV0aGlua2luZ18yMDE0IHN0YXRlcyAocmVmZXJlbmNpbmcgQHN0cm91cF9ub24tbm9ybWFsXzIwMTMpIHRoYXQgSy1SIGFjdHVhbGx5IHdvcmtzIHJlYXNvbmFibHkgd2VsbCBmb3IgR0xNTXMgKEstUiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gUiBmb3IgR0xNTXM7IFN0cm91cCBzdWdnZXN0cyB0aGF0IGEgcHNldWRvLWxpa2VsaWhvb2QgW0B3b2xmaW5nZXJfZ2VuZXJhbGl6ZWRfMTk5M10gYXBwcm9hY2ggaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGltcGxlbWVudCBLLVIgZm9yIEdMTU1zKToKCiAgICAgICAgPiBOb3RpY2UgdGhlIG5vbi1pbnRlZ2VyIHZhbHVlcyBvZiB0aGUgZGVub21pbmF0b3IgZGYuIFRoZXksIGFuZCB0aGUgJEYkIGFuZCAkcCQgdmFsdWVzLCByZWZsZWN0IHRoZSBwcm9jZWR1cmUgZGV2ZWxvcGVkIGJ5IEtlbndhcmQgYW5kIFJvZ2VyICgyMDA5KSB0byBhY2NvdW50IGZvciB0aGUgZWZmZWN0IG9mIHRoZSBjb3ZhcmlhbmNlICBzdHJ1Y3R1cmUgb24gZGVncmVlcyBvZiBmcmVlZG9tIGFuZCBzdGFuZGFyZCBlcnJvcnMuIEFsdGhvdWdoIHRoZSBLZW53YXJk4oCTUm9nZXIgYWRqdXN0bWVudCB3YXMgZGVyaXZlZCBmb3IgdGhlIExNTSB3aXRoIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGRhdGEgYW5kIGlzIGFuIGFkIGhvYyBwcm9jZWR1cmUgZm9yIEdMTU1zIHdpdGggbm9uLW5vcm1hbCBkYXRhLCBpbmZvcm1hbCBzaW11bGF0aW9uIHN0dWRpZXMgY29uc2lzdGVudGx5IGhhdmUgc3VnZ2VzdGVkIHRoYXQgdGhlIGFkanVzdG1lbnQgaXMgYWNjdXJhdGUuIFRoZSBLZW53YXJkLVJvZ2VyIGFkanVzdG1lbnQgcmVxdWlyZXMgdGhhdCB0aGUgU0FTIEdMSU1NSVggZGVmYXVsdCBjb21wdXRpbmcgYWxnb3JpdGhtLCBwc2V1ZG8tbGlrZWxpaG9vZCwgYmUgdXNlZCByYXRoZXIgdGhhbiB0aGUgTGFwbGFjZSBhbGdvcml0aG0gdXNlZCB0byBvYnRhaW4gQUlDQyBzdGF0aXN0aWNzLiBTdHJvdXAgKDIwMTNiKSBmb3VuZCB0aGF0IGZvciBiaW5vbWlhbCBhbmQgUG9pc3NvbiBHTE1NcywgcHNldWRvLWxpa2VsaWhvb2Qgd2l0aCB0aGUgS2Vud2FyZOKAk1JvZ2VyIGFkanVzdG1lbnQgeWllbGRzIGJldHRlciBUeXBlIEkgZXJyb3IgY29udHJvbCB0aGFuIExhcGxhY2Ugd2hpbGUgcHJlc2VydmluZyB0aGUgR0xNTeKAmXMgYWR2YW50YWdlIHdpdGggcmVzcGVjdCB0byBwb3dlciBhbmQgYWNjdXJhY3kgaW4gZXN0aW1hdGluZyB0cmVhdG1lbnQgbWVhbnMuCgkKLSBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgaXNzdWVzIGF0IHBsYXkgaW4gZmluaXRlLXNpemUgKHNtYWxsLXNhbXBsZSkgYWRqdXN0bWVudHMsIHdoaWNoIGFwcGx5IHNsaWdodGx5IGRpZmZlcmVudGx5IHRvIExNTXMgYW5kIEdMTU1zLgogICAgIC0gIFdoZW4gdGhlIGRhdGEgZG9uJ3QgZml0IGludG8gdGhlIGNsYXNzaWNhbCBmcmFtZXdvcmsgKGNyb3NzZWQsIHVuYmFsYW5jZWQsIFItc2lkZSBlZmZlY3RzKSwgd2UgbWlnaHQgc3RpbGwgZ3Vlc3MgdGhhdCB0aGUgZGV2aWFuY2VzIGV0Yy4gYXJlIGFwcHJveGltYXRlbHkgRi1kaXN0cmlidXRlZCBidXQgdGhhdCB3ZSBkb24ndCBrbm93IHRoZSByZWFsIGRlZ3JlZXMgb2YgZnJlZWRvbSAtLSB0aGlzIGlzIHdoYXQgdGhlIFNhdHRlcnRod2FpdGUsIEtlbndhcmQtUm9nZXIsIEZhaS1Db3JuZWxpdXMsIGV0Yy4gYXBwcm94aW1hdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGRvLgogICAgIC0gV2hlbiB0aGUgcmVzcG9uc2VzIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGFzIGluIEdMTXMgYW5kIEdMTU1zKSwgYW5kIHdoZW4gdGhlIHNjYWxlIHBhcmFtZXRlciBpcyBub3QgZXN0aW1hdGVkIChhcyBpbiBzdGFuZGFyZCBQb2lzc29uLSBhbmQgYmlub21pYWwtcmVzcG9uc2UgbW9kZWxzKSwgdGhlbiB0aGUgZGV2aWFuY2UgZGlmZmVyZW5jZXMgYXJlIG9ubHkgYXN5bXB0b3RpY2FsbHkgRi0gb3IgY2hpLXNxdWFyZS1kaXN0cmlidXRlZCAoaS5lLiBub3QgZm9yIG91ciByZWFsLCBmaW5pdGUtc2l6ZSBzYW1wbGVzKS4gIEluIHN0YW5kYXJkIEdMTSBwcmFjdGljZSwgd2UgdXN1YWxseSBpZ25vcmUgdGhpcyBwcm9ibGVtOyB0aGVyZSBpcyBzb21lIGxpdGVyYXR1cmUgb24gZmluaXRlLXNpemUgY29ycmVjdGlvbnMgZm9yIEdMTXMgdW5kZXIgdGhlIHJ1YnJpY3Mgb2YgIkJhcnRsZXR0IGNvcnJlY3Rpb25zIiBhbmQgImhpZ2hlciBvcmRlciBhc3ltcHRvdGljcyIgKHNlZSBATWNDdWxsYWdoTmVsZGVyMTk4OSwgQGNvcmRlaXJvX2ltcHJvdmVkXzE5OTQsIEBjb3JkZWlyb19ub3RlXzE5OTggYW5kIHRoZSBgY29uZGAgcGFja2FnZSAoW29uIENSQU5dKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3BhY2thZ2U9Y29uZCkpIFt3aGljaCB3b3JrcyB3aXRoIEdMTXMsIG5vdCBHTE1Nc10pLCBidXQgaXQncyByYXJlbHkgdXNlZC4gIChUaGUgYmlhcyBjb3JyZWN0aW9uL0ZpcnRoIGFwcHJvYWNoIGltcGxlbWVudGVkIGluIHRoZSBgYnJnbG1gIHBhY2thZ2UgYXR0ZW1wdHMgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbSBvZiBmaW5pdGUtc2l6ZSBiaWFzLCBub3QgZmluaXRlLXNpemUgbm9uLWNoaS1zcXVhcmVkbmVzcyBvZiB0aGUgZGV2aWFuY2UgZGlmZmVyZW5jZXMuKQogICAgLSBXaGVuIHRoZSBzY2FsZSBwYXJhbWV0ZXIgaW4gYSBHTE0gaXMgZXN0aW1hdGVkIHJhdGhlciB0aGFuIGZpeGVkIChhcyBpbiBHYW1tYSBvciBxdWFzaS1saWtlbGlob29kIG1vZGVscyksIGl0IGlzIHNvbWV0aW1lcyByZWNvbW1lbmRlZCB0byB1c2UgYW4gJEYkIHRlc3QgdG8gYWNjb3VudCBmb3IgdGhlIHVuY2VydGFpbnR5IG9mIHRoZSBzY2FsZSBwYXJhbWV0ZXIgKGUuZy4gQHZlbmFibGVzX21vZGVybl8yMDAyIHJlY29tbWVuZCBgYW5vdmEoLi4uLHRlc3Q9IkYiKWAgZm9yIHF1YXNpLWxpa2VsaWhvb2QgbW9kZWxzKQogICAgLSBDb21iaW5pbmcgdGhlc2UgaXNzdWVzLCBvbmUgaGFzIHRvIGxvb2sgcHJldHR5IGhhcmQgZm9yIGluZm9ybWF0aW9uIG9uIHNtYWxsLXNhbXBsZSBvciBmaW5pdGUtc2l6ZSBjb3JyZWN0aW9ucyBmb3IgR0xNTXM6IEBmZW5nX3NtYWxsXzIwMDQgYW5kIEBiZWxsX3NtYWxsXzIwMTAgbG9vayBsaWtlIGdvb2Qgc3RhcnRpbmcgcG9pbnRzLCBidXQgaXQncyBub3QgYXQgYWxsIHRyaXZpYWwuCgojIyMjIERmIGFsdGVybmF0aXZlczoKCi0gdXNlIE1BU1M6OmdsbW1QUUwgKHVzZXMgb2xkIGBubG1lYCBydWxlcyBhcHByb3hpbWF0ZWx5IGVxdWl2YWxlbnQgdG8gU0FTICdpbm5lci1vdXRlcicvJ3dpdGhpbi1iZXR3ZWVuJyBydWxlcykgZm9yIEdMTU1zLCBvciBgKG4pbG1lYCBmb3IgTE1NcwotIEd1ZXNzIHRoZSBkZW5vbWluYXRvciBkZiBmcm9tIHN0YW5kYXJkIHJ1bGVzIChmb3Igc3RhbmRhcmQgZGVzaWducywgZS5nLiBzZWUgQEdvdGVsbGlFbGxpc29uMjAwNCkgYW5kIGFwcGx5IHRoZW0gdG8gJHQkIG9yICRGJCB0ZXN0cwotIFJ1biB0aGUgbW9kZWwgaW4gYGxtZWAgKGlmIHBvc3NpYmxlKSBhbmQgdXNlIHRoZSBkZW5vbWluYXRvciBkZiByZXBvcnRlZCB0aGVyZSAod2hpY2ggZm9sbG93IGEgc2ltcGxlICdpbm5lci1vdXRlcicgcnVsZSB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgY2Fub25pY2FsIGFuc3dlciBmb3Igc2ltcGxlL29ydGhvZ29uYWwgZGVzaWducyksIGFwcGxpZWQgdG8gJHQkIG9yICRGJCB0ZXN0cy4gIEZvciB0aGUgZXhwbGljaXQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcnVsZXMgdGhhdCBgbG1lYCB1c2VzLCBzZWUgcGFnZSA5MSBvZiBQaW5oZWlybyBhbmQgQmF0ZXMgKCp0aGlzIHBhZ2Ugd2FzIHByZXZpb3VzbHkgYXZhaWxhYmxlIG9uIFtHb29nbGUgQm9va3NdKGh0dHA6Ly90aW55dXJsLmNvbS9udHlncTMpLCBidXQgdGhlIGxpbmsgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgc28gaGVyZSBhcmUgdGhlIHJlbGV2YW50IHBhcmFncmFwaHMqKToKCj4gVGhlc2UgY29uZGl0aW9uYWwgdGVzdHMgZm9yIGZpeGVkLWVmZmVjdHMgdGVybXMgcmVxdWlyZSBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20uIEluIHRoZSBjYXNlIG9mIHRoZSBjb25kaXRpb25hbCAkRiQtdGVzdHMsIHRoZSBudW1lcmF0b3IgZGVncmVlcyBvZiBmcmVlZG9tIGFyZSBhbHNvIHJlcXVpcmVkLCBiZWluZyBkZXRlcm1pbmVkIGJ5IHRoZSB0ZXJtIGl0c2VsZi4gVGhlIGRlbm9taW5hdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbSBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZ3JvdXBpbmcgbGV2ZWwgYXQgd2hpY2ggdGhlIHRlcm0gaXMgZXN0aW1hdGVkLiBBIHRlcm0gaXMgY2FsbGVkIGlubmVyIHJlbGF0aXZlIHRvIGEgZmFjdG9yIGlmIGl0cyB2YWx1ZSBjYW4gY2hhbmdlIHdpdGhpbiBhIGdpdmVuIGxldmVsIG9mIHRoZSBncm91cGluZyBmYWN0b3IuIEEgdGVybSBpcyBvdXRlciB0byBhIGdyb3VwaW5nIGZhY3RvciBpZiBpdHMgdmFsdWUgZG9lcyBub3QgY2hhbmdlcyB3aXRoaW4gbGV2ZWxzIG9mIHRoZSBncm91cGluZyBmYWN0b3IuIEEgdGVybSBpcyBzYWlkIHRvIGJlIGVzdGltYXRlZCBhdCBsZXZlbCAkaSQsIGlmIGl0IGlzIGlubmVyIHRvIHRoZSAkaS0xJHN0IGdyb3VwaW5nIGZhY3RvciBhbmQgb3V0ZXIgdG8gdGhlICRpJHRoIGdyb3VwaW5nIGZhY3Rvci4gRm9yIGV4YW1wbGUsIHRoZSB0ZXJtIGBNYWNoaW5lYCBpbiB0aGUgYGZtMk1hY2hpbmVgIG1vZGVsIGlzIG91dGVyIHRvIGBNYWNoaW5lICVpbiUgV29ya2VyYCBhbmQgaW5uZXIgdG8gYFdvcmtlcmAsIHNvIGl0IGlzIGVzdGltYXRlZCBhdCBsZXZlbCAyIChgTWFjaGluZSAlaW4lIFdvcmtlcmApLiBJZiBhIHRlcm0gaXMgaW5uZXIgdG8gYWxsICRRJCBncm91cGluZyBmYWN0b3JzIGluIGEgbW9kZWwsIGl0IGlzIGVzdGltYXRlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIHdpdGhpbi1ncm91cCBlcnJvcnMsIHdoaWNoIHdlIGRlbm90ZSBhcyB0aGUgJFErMSRzdCBsZXZlbC4KPgo+ICBUaGUgaW50ZXJjZXB0LCB3aGljaCBpcyB0aGUgcGFyYW1ldGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbHVtbiBvZiBhbGwgMSdzIGluIHRoZSBtb2RlbCBtYXRyaWNlcyAkWF9pJCwgaXMgdHJlYXRlZCBkaWZmZXJlbnRseSBmcm9tIGFsbCB0aGUgb3RoZXIgcGFyYW1ldGVycywgd2hlbiBpdCBpcyBwcmVzZW50LiBBcyBhIHBhcmFtZXRlciBpdCBpcyByZWdhcmRlZCBhcyBiZWluZyBlc3RpbWF0ZWQgYXQgbGV2ZWwgMCBiZWNhdXNlIGl0IGlzIG91dGVyIHRvIGFsbCB0aGUgZ3JvdXBpbmcgZmFjdG9ycy4gSG93ZXZlciwgaXRzIGRlbm9taW5hdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbSBhcmUgY2FsY3VsYXRlZCBhcyBpZiBpdCB3ZXJlIGVzdGltYXRlZCBhdCBsZXZlbCAkUSsxJC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBpbnRlcmNlcHQgaXMgdGhlIG9uZSBwYXJhbWV0ZXIgdGhhdCBwb29scyBpbmZvcm1hdGlvbiBmcm9tIGFsbCB0aGUgb2JzZXJ2YXRpb25zIGF0IGEgbGV2ZWwgZXZlbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiAkWF9pJCBkb2Vzbid0IGNoYW5nZSB3aXRoIHRoZSBsZXZlbC4KPgo+ICAgIExldHRpbmcgJG1faSQgZGVub3RlIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3JvdXBzIGluIGxldmVsICRpJCAod2l0aCB0aGUgY29udmVudGlvbiB0aGF0ICRtXzA9MSQgd2hlbiB0aGUgZml4ZWQgZWZmZWN0cyBtb2RlbCBpbmNsdWRlcyBhbiBpbnRlcmNlcHQgYW5kIDAgb3RoZXJ3aXNlLCBhbmQgJG1fe1ErMX09TiQpIGFuZCAkcF9pJCBkZW5vdGUgdGhlIHN1bSBvZiB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRlcm1zIGVzdGltYXRlZCBhdCBsZXZlbCAkaSQsIHRoZSAkaSR0aCBsZXZlbCBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20gaXMgZGVmaW5lZCBhcwo+Cj4gJCQgXG1hdGhybXtkZW5ERn1faSA9IG1faSAtIChtX3tpLTF9ICsgcF9pKSwgaSA9IDEsIFxkb3RzLCBRICQkCj4gCj4gVGhpcyBkZWZpbml0aW9uIGNvaW5jaWRlcyB3aXRoIHRoZSBjbGFzc2ljYWwgZGVjb21wb3NpdGlvbiBvZiBkZWdyZWVzIG9mIGZyZWVkb20gaW4gYmFsYW5jZWQsIG11bHRpbGV2ZWwgQU5PVkEgZGVzaWducyBhbmQgZ2l2ZXMgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gZm9yIG1vcmUgZ2VuZXJhbCBtaXhlZC1lZmZlY3RzIG1vZGVscy4KCk5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCBpbiBgbG1lYCAqKmdldHMgdGhlIHdyb25nIGFuc3dlciBmb3IgcmFuZG9tLXNsb3BlcyBtb2RlbHMqKjoKYGBge3IgbG1lREYsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShubG1lKQpsbWVERiA8LSBmdW5jdGlvbihmb3JtdWxhPWRpc3RhbmNlfmFnZSxyYW5kb209fjF8U3ViamVjdCkgewogICAgIG1vZCA8LSBsbWUoZm9ybXVsYSxyYW5kb20sZGF0YT1PcnRob2RvbnQpCiAgICAgYWEgPC0gYW5vdmEobW9kKQogICAgcmV0dXJuKHNldE5hbWVzKGFhWywiZGVuREYiXSxyb3duYW1lcyhhYSkpKQp9CmxtZURGKCkKbG1lREYocmFuZG9tPX5hZ2V8U3ViamVjdCkgIyMgd3JvbmchCmBgYApJIChCQikgaGF2ZSByZS1pbXBsZW1lbnRlZCB0aGlzIGFsZ29yaXRobSBpbiBhIHdheSB0aGF0IGRvZXMgc2xpZ2h0bHkgYmV0dGVyIGZvciByYW5kb20tc2xvcGVzIG1vZGVscyAoYnV0IG1heSBzdGlsbCBnZXQgY29uZnVzZWQhKSwgc2VlIFtoZXJlXShSL2NhbGNEZW5ERi5SKS4KCmBgYHtyIGNhbGNEZW5ERn0Kc291cmNlKCJSL2NhbGNEZW5ERi5SIikKY2FsY0RlbkRGKH5hZ2UsIlN1YmplY3QiLG5sbWU6Ok9ydGhvZG9udCkKY2FsY0RlbkRGKH5hZ2UsZGF0YT1ubG1lOjpPcnRob2RvbnQscmFuZG9tPX4xfFN1YmplY3QpCmNhbGNEZW5ERih+YWdlLGRhdGE9bmxtZTo6T3J0aG9kb250LHJhbmRvbT1+YWdlfFN1YmplY3QpICMjIG9mZiBieSAxCmBgYAoKLSB1c2UgU0FTLCBHZW5zdGF0IChBUy1SRU1MKSwgU3RhdGE/Ci0gQXNzdW1lIGluZmluaXRlIGRlbm9taW5hdG9yIGRmIChpLmUuICRaJC8kXGNoaV4yJCB0ZXN0IHJhdGhlciB0aGFuICR0JC8kRiQpIGlmIG51bWJlciBvZiBncm91cHMgaXMgbGFyZ2UgKD40NT8gVmFyaW91cyBydWxlcyBvZiB0aHVtYiBmb3IgaG93IGxhcmdlIGlzICJhcHByb3hpbWF0ZWx5IGluZmluaXRlIiBoYXZlIGJlZW4gcG9zZWQsIGluY2x1ZGluZyBbaW4gQGFuZ3Jpc3RfbW9zdGx5XzIwMDldLCA0MiAoaW4gaG9tYWdlIHRvIERvdWdsYXMgQWRhbXMpCgojIyMgVGVzdGluZyBzaWduaWZpY2FuY2Ugb2YgcmFuZG9tIGVmZmVjdHMKCi0gdGhlIG1vc3QgY29tbW9uIHdheSB0byBkbyB0aGlzIGlzIHRvIHVzZSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCwgaS5lLiBmaXQgdGhlIGZ1bGwgYW5kIHJlZHVjZWQgbW9kZWxzICh0aGUgcmVkdWNlZCBtb2RlbCBpcyB0aGUgbW9kZWwgd2l0aCB0aGUgZm9jYWwgdmFyaWFuY2Uocykgc2V0IHRvIHplcm8pLiBGb3IgZXhhbXBsZToKYGBge3IgcmFuZWZmX3Rlc3QsbWVzc2FnZT1GQUxTRSxjYWNoZT1UUlVFfQpsaWJyYXJ5KGxtZTQpCm0yIDwtIGxtZXIoUmVhY3Rpb25+RGF5cysoMXxTdWJqZWN0KSsoMCtEYXlzfFN1YmplY3QpLHNsZWVwc3R1ZHksUkVNTD1GQUxTRSkKbTEgPC0gdXBkYXRlKG0yLC5+RGF5cysoMXxTdWJqZWN0KSkKbTAgPC0gbG0oUmVhY3Rpb25+RGF5cyxzbGVlcHN0dWR5KQphbm92YShtMixtMSxtMCkgIyMgdHdvIHNlcXVlbnRpYWwgdGVzdHMKYGBgCldpdGggcmVjZW50IHZlcnNpb25zIG9mIGBsbWU0YCwgZ29vZG5lc3Mtb2YtZml0IChkZXZpYW5jZSkgY2FuIGJlIGNvbXBhcmVkIGJldHdlZW4gYChnKWxtZXJgIGFuZCBgKGcpbG1gIG1vZGVscywgYWx0aG91Z2ggYGFub3ZhKClgIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG1peGVkIChgKGcpbG1lcmApIG1vZGVsIGxpc3RlZCBmaXJzdC4KS2VlcCBpbiBtaW5kIHRoYXQgTFJULWJhc2VkIG51bGwgaHlwb3RoZXNpcyB0ZXN0cyBhcmUgY29uc2VydmF0aXZlIHdoZW4gdGhlIG51bGwgdmFsdWUgKHN1Y2ggYXMgJFxzaWdtYV4yPTAkKSBpcyBvbiB0aGUgYm91bmRhcnkgb2YgdGhlIGZlYXNpYmxlIHNwYWNlIFtAc2VsZl9hc3ltcHRvdGljXzE5ODc7QHN0cmFtX3ZhcmlhbmNlXzE5OTQ7QEdvbGRtYW5XaGVsYW4yMDAwXTsgaW4gdGhlIHNpbXBsZXN0IGNhc2UgKHNpbmdsZSByYW5kb20gZWZmZWN0IHZhcmlhbmNlKSwgdGhlIHAtdmFsdWUgaXMgYXBwcm94aW1hdGVseSB0d2ljZSBhcyBsYXJnZSBhcyBpdCBzaG91bGQgYmUgW0BwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDBdLgoKLSBDb25zaWRlciAqbm90KiB0ZXN0aW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgcmFuZG9tIGVmZmVjdHMuIElmIHRoZSByYW5kb20gZWZmZWN0IGlzIHBhcnQgb2YgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24sIHRoaXMgcHJvY2VkdXJlIG1heSBiZSBjb25zaWRlcmVkICdzYWNyaWZpY2lhbCBwc2V1ZG9yZXBsaWNhdGlvbicgW0BIdXJsYmVydDE5ODRdLiBVc2luZyBzdGVwd2lzZSBhcHByb2FjaGVzIHRvIGVsaW1pbmF0ZSBub24tc2lnbmlmaWNhbnQgdGVybXMgaW4gb3JkZXIgdG8gc3F1ZWV6ZSBtb3JlIHNpZ25pZmljYW5jZSBvdXQgb2YgdGhlIHJlbWFpbmluZyB0ZXJtcyBpcyBkYW5nZXJvdXMgaW4gYW55IGNhc2UuCi0gY29uc2lkZXIgdXNpbmcgdGhlIGBSTFJzaW1gIHBhY2thZ2UsIHdoaWNoIGhhcyBhIGZhc3QgaW1wbGVtZW50YXRpb24gb2Ygc2ltdWxhdGlvbi1iYXNlZCB0ZXN0cyBvZiBudWxsIGh5cG90aGVzZXMgYWJvdXQgemVybyB2YXJpYW5jZXMsIGZvciBzaW1wbGUgdGVzdHMuIChIb3dldmVyLCBpdCBvbmx5IGFwcGxpZXMgdG8gYGxtZXJgIG1vZGVscywgYW5kIGlzIGEgYml0IHRyaWNreSB0byB1c2UgZm9yIG1vcmUgY29tcGxleCBtb2RlbHMuKQoKYGBge3IgUkxSc2ltX2NoZWNrLGVjaG89RkFMU0V9CmlmIChwYWNrYWdlVmVyc2lvbigiUkxSc2ltIik8IjMuMS02IikgewogIHN0b3AoIm5lZWQgcmVjZW50IHZlcnNpb24gb2YgUkxSc2ltOiBjb25zaWRlciIsCiAgICAgICAiJ3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKFwiZmFiaWFuLXMvUkxSc2ltXCIpJyIpCn0KYGBgCmBgYHtyIFJMUnNpbSxtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KFJMUnNpbSkKIyMgY29tcGFyZSBtMCBhbmQgbTEKZXhhY3RMUlQobTEsbTApCiMjIGNvbXBhcmUgbTEgYW5kIG0yCm1BIDwtIHVwZGF0ZShtMixSRU1MPVRSVUUpCm0wQiA8LSB1cGRhdGUobUEsIC4gfiAuIC0gKDAgKyBEYXlzfFN1YmplY3QpKQptLnNsb3BlICA8LSB1cGRhdGUobUEsIC4gfiAuIC0gKDF8U3ViamVjdCkpCmV4YWN0UkxSVChtMD1tMEIsbT1tLnNsb3BlLG1BPW1BKQpgYGAKCi0gUGFyYW1ldHJpYyBib290c3RyYXA6IGZpdCB0aGUgcmVkdWNlZCBtb2RlbCwgdGhlbiByZXBlYXRlZGx5IHNpbXVsYXRlIGZyb20gaXQgYW5kIGNvbXB1dGUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGRldmlhbmNlIG9mIHRoZSByZWR1Y2VkIGFuZCB0aGUgZnVsbCBtb2RlbCBmb3IgZWFjaCBzaW11bGF0ZWQgZGF0YSBzZXQuICBDb21wYXJlIHRoaXMgbnVsbCBkaXN0cmlidXRpb24gdG8gdGhlIG9ic2VydmVkIGRldmlhbmNlIGRpZmZlcmVuY2UuIFRoaXMgcHJvY2VkdXJlIGlzIGltcGxlbWVudGVkIGluIHRoZSBgcGJrcnRlc3RgIHBhY2thZ2UgKG1lc3NhZ2VzIGFuZCB3YXJuaW5ncyBzdXBwcmVzc2VkKS4KYGBge3IgcGJvb3RfdmFydGVzdF9jb21wLGNhY2hlPVRSVUUsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0KKHBiIDwtIHBia3J0ZXN0OjpQQm1vZGNvbXAobTIsbTEsc2VlZD0xMDEpKQpgYGAKCiMjIyBTdGFuZGFyZCBlcnJvcnMgb2YgdmFyaWFuY2UgZXN0aW1hdGVzCgo8YSBpZD0idmFyaWFuY2Utc3RhbmRhcmQtZXJyb3JzIj48L2E+CgotIFBhcmFwaHJhc2luZyBEb3VnIEJhdGVzOiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHZhcmlhbmNlIGVzdGltYXRlcyBpcyBpbiBnZW5lcmFsIHN0cm9uZ2x5IGFzeW1tZXRyaWM6IHRoZSBzdGFuZGFyZCBlcnJvciBtYXkgYmUgYSBwb29yIGNoYXJhY3Rlcml6YXRpb24gb2YgdGhlIHVuY2VydGFpbnR5LgotIGBsbWU0YCBhbGxvd3MgZm9yIGNvbXB1dGluZyBsaWtlbGlob29kIHByb2ZpbGVzIG9mIHZhcmlhbmNlcyBhbmQgY29tcHV0aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9uIHRoZWlyIGJhc2lzOyB0aGVzZSBsaWtlbGlob29kIHByb2ZpbGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIHN1YmplY3QgdG8gdGhlIHVzdWFsIGNhdmVhdHMgYWJvdXQgdGhlIExSVCB3aXRoIGZpbml0ZSBzYW1wbGUgc2l6ZXMuCi0gVXNpbmcgYW4gTUNNQy1iYXNlZCBhcHByb2FjaCAodGhlIHNpbXBsZXN0L21vc3QgY2FubmVkIGlzIHByb2JhYmx5IHRvIHVzZSB0aGUgYE1DTUNnbG1tYCBwYWNrYWdlLCBhbHRob3VnaCBpdHMgbW9kZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IGlkZW50aWNhbCB0byB0aG9zZSBvZiBsbWU0KSB3aWxsIHByb3ZpZGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIHZhcmlhbmNlIHBhcmFtZXRlcnM6IHF1YW50aWxlcyBvciBjcmVkaWJsZSBpbnRlcnZhbHMgKGBIUERpbnRlcnZhbCgpYCBpbiB0aGUgYGNvZGFgIHBhY2thZ2UpIHdpbGwgY2hhcmFjdGVyaXplIHRoZSB1bmNlcnRhaW50eS4KLSAoZG9uJ3Qgc2F5IHdlIGRpZG4ndCB3YXJuIHlvdSAuLi4pIGBbbl1sbWVgIGZpdHMgY29udGFpbiBhbiBlbGVtZW50IGNhbGxlZCBgYXBWYXJgIHdoaWNoIGNvbnRhaW5zIHRoZSBhcHByb3hpbWF0ZSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCAoZGVyaXZlZCBmcm9tIHRoZSBIZXNzaWFuLCB0aGUgbWF0cml4IG9mIChudW1lcmljYWxseSBhcHByb3hpbWF0ZWQpIHNlY29uZCBkZXJpdmF0aXZlcyBvZiB0aGUgbGlrZWxpaG9vZCAoUkVNTD8pIGF0IHRoZSBtYXhpbXVtIChyZXN0cmljdGVkPykgbGlrZWxpaG9vZCB2YWx1ZXMpOiB5b3UgY2FuIGRlcml2ZSB0aGUgc3RhbmRhcmQgZXJyb3JzIGZyb20gdGhpcyBsaXN0IGVsZW1lbnQgdmlhIGBzcXJ0KGRpYWcobG1lLm9iaiRhcFZhcikpYC4gRm9yIHdoYXRldmVyIGl0J3Mgd29ydGgsIHRob3VnaCwgW3RoZXNlIGVzdGltYXRlcyBtaWdodCBub3QgbWF0Y2hdKGh0dHA6Ly93d3cuYmlvc3RhdC53dXN0bC5lZHUvYXJjaGl2ZXMvaHRtbC9zLW5ld3MvMjAwMy0wNy9tc2cwMDEyNy5odG1sKSB0aGUgW2VzdGltYXRlcyB0aGF0IFNBUyBnaXZlc10oaHR0cDovL3d3dy50YXUuYWMuaWwvY2MvcGFnZXMvZG9jcy9zYXM4L3N0YXQvY2hhcDQxL3NlY3QyNS5odG0jbWl4ZWRjcGUpIHdoaWNoIGFyZSBzdXBwb3NlZGx5IGRlcml2ZWQgaW4gdGhlIHNhbWUgd2F5LgotIGl0J3Mgbm90IGEgZnVsbCBzb2x1dGlvbiwgYnV0IHRoZXJlIGlzIHNvbWUgbW9yZSBpbmZvcm1hdGlvbiBbaGVyZV0oaHR0cHM6Ly9ycHVicy5jb20vYmJvbGtlci93YWxkdmFyKS4gSSBoYXZlIHNvbWUgZGVsdGEtbWV0aG9kIGNvbXB1dGF0aW9ucyB0aGVyZSB0aGF0IGFyZSBvZmYgYnkgYSBmYWN0b3Igb2YgMiBmb3IgdGhlIHJlc2lkdWFsIHN0YW5kYXJkIGRldmlhdGlvbiwgYXMgd2VsbCBhcyBzb21lIGNvbXB1dGF0aW9ucyBiYXNlZCBvbiByZXBhcmFtZXRlcml6aW5nIHRoZSBkZXZpYW5jZSBmdW5jdGlvbi4KCiMjIyBQLXZhbHVlczogTUNNQyBhbmQgcGFyYW1ldHJpYyBib290c3RyYXAgCgpBYmFuZG9uaW5nIHRoZSBhcHByb3hpbWF0ZSAkRiQvJHQkLXN0YXRpc3RpYyByb3V0ZSwgb25lIGVuZHMgdXAgd2l0aCB0aGUgbW9yZSBnZW5lcmFsIHByb2JsZW0gb2YgZXN0aW1hdGluZyAkcCQtdmFsdWVzLiAgVGhlcmUgaXMgYSB3aWRlciByYW5nZSBvZiBvcHRpb25zIGhlcmUsIGFsdGhvdWdoIG1hbnkgb2YgdGhlbSBhcmUgY29tcHV0YXRpb25hbGx5IGludGVuc2l2ZSAuLi4KCiMjIyMgTWFya292IGNoYWluIE1vbnRlIENhcmxvIHNhbXBsaW5nOgotIHBzZXVkby1CYXllc2lhbjogcG9zdC1ob2Mgc2FtcGxpbmcsIHR5cGljYWxseSAoMSkgYXNzdW1pbmcgZmxhdCBwcmlvcnMgYW5kICgyKSBzdGFydGluZyBmcm9tIHRoZSBNTEUsIHBvc3NpYmx5IHVzaW5nIHRoZSBhcHByb3hpbWF0ZSB2YXJpYW5jZS1jb3ZhcmlhbmNlIGVzdGltYXRlIHRvIGNob29zZSBhIGNhbmRpZGF0ZSBkaXN0cmlidXRpb24KICAgIC0gdmlhIGBtY21jc2FtcGAgKGlmIGF2YWlsYWJsZSBmb3IgeW91ciBwcm9ibGVtOiBpLmUuIExNTXMgd2l0aCBzaW1wbGUgcmFuZG9tIGVmZmVjdHMgLS0gbm90IEdMTU1zIG9yIGNvbXBsZXggcmFuZG9tIGVmZmVjdHMpCiAgICAtIHZpYSBgcHZhbHMuZm5jYCBpbiB0aGUgYGxhbmd1YWdlUmAgcGFja2FnZSwgYSB3cmFwcGVyIGZvciBtY21jc2FtcCkKICAgIC0gaW4gQUQgTW9kZWwgQnVpbGRlciwgcG9zc2libHkgdmlhIHRoZSBgZ2xtbUFETUJgIHBhY2thZ2UgKHVzZSB0aGUgYG1jbWM9VFJVRWAgb3B0aW9uKSBvciB0aGUgYFIyYWRtYmAgcGFja2FnZSAod3JpdGUgeW91ciBvd24gbW9kZWwgZGVmaW5pdGlvbiBpbiBBRCBNb2RlbCBCdWlsZGVyKSwgb3Igb3V0c2lkZSBvZiBSCiAgICAtIHZpYSB0aGUgYHNpbWAgZnVuY3Rpb24gZnJvbSB0aGUgYGFybWAgcGFja2FnZSAoc2ltdWxhdGVzIHRoZSBwb3N0ZXJpb3Igb25seSBmb3IgdGhlIGJldGEgKGZpeGVkLWVmZmVjdCkgY29lZmZpY2llbnRzOyBub3QgeWV0IHdvcmtpbmcgd2l0aCBkZXZlbG9wbWVudCBsbWU0OyB3b3VsZCBsaWtlIGEgYmV0dGVyIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIC4uLj8pCi0gZnVsbHkgQmF5ZXNpYW4gYXBwcm9hY2hlcwogICAgLSB2aWEgdGhlIGBNQ01DZ2xtbWAgcGFja2FnZQogICAgLSBgZ2xtbUJVR1NgIChhIFdpbkJVR1Mgd3JhcHBlci9SIGludGVyZmFjZSkKICAgIC0gSkFHUy9XaW5CVUdTL09wZW5CVUdTIGV0Yy4sIHZpYSB0aGUgYHJqYWdzYC9gcjJqYWdzYC9gUjJXaW5CVUdTYC9gQlJ1Z3NgIHBhY2thZ2VzCgojIyMjIFN0YXR1cyBvZiBtY21jc2FtcAoKYG1jbWNzYW1wYCBpcyBhIGZ1bmN0aW9uIGZvciBsbWU0IHRoYXQgaXMgc3VwcG9zZWQgdG8gc2FtcGxlIGZyb20gdGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24gb2YgdGhlIHBhcmFtZXRlcnMsIGJhc2VkIG9uIGZsYXQvaW1wcm9wZXIgcHJpb3JzIGZvciB0aGUgcGFyYW1ldGVycyBbZWQ6IEkgYmVsaWV2ZSwgYnV0IGFtIG5vdCBzdXJlLCB0aGF0IHRoZXNlIHByaW9ycyBhcmUgZmxhdCAqKm9uIHRoZSBzY2FsZSBvZiB0aGUgdGhldGEgKENob2xlc2t5LWZhY3RvcikgcGFyYW1ldGVycyoqXS4gIEF0IHByZXNlbnQsIGluIHRoZSBDUkFOIHZlcnNpb24gKGxtZTQgMC45OTk5OTktMCkgYW5kIHRoZSBSLWZvcmdlICJzdGFibGUiIHZlcnNpb24gKGxtZTQuMCAwLjk5OTk5OS0xKSwgdGhpcyBjb3ZlcnMgb25seSBsaW5lYXIgbWl4ZWQgbW9kZWxzIHdpdGggdW5jb3JyZWxhdGVkIHJhbmRvbSBlZmZlY3RzLgoKQXMgaGFzIGJlZW4gZGlzY3Vzc2VkIGluIGEgdmFyaWV0eSBvZiBwbGFjZXMgKGUuZy4gW29uIHItc2lnLW1peGVkIG1vZGVsc10oaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAubGFuZy5yLmxtZTQuZGV2ZWwvMTc4OC8pLCBhbmQgW29uIHRoZSByLWZvcmdlIGJ1ZyB0cmFja2VyXShodHRwczovL3ItZm9yZ2Uuci1wcm9qZWN0Lm9yZy90cmFja2VyLz9mdW5jPWRldGFpbCZhaWQ9NjgmZ3JvdXBfaWQ9NjAmYXRpZD0yOTgpLCBpdCBpcyBjaGFsbGVuZ2luZyB0byBjb21lIHVwIHdpdGggYSBzYW1wbGVyIHRoYXQgYWNjb3VudHMgcHJvcGVybHkgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBmb3Igc29tZSBvZiB0aGUgdmFyaWFuY2UgY29tcG9uZW50cyBtYXkgYmUgbWl4dHVyZXMgb2YgcG9pbnQgbWFzc2VzIGF0IHplcm8gYW5kIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9ucy4gIE5haXZlIHNhbXBsZXJzIGFyZSBsaWtlbHkgdG8gZ2V0IHN0dWNrIGF0IG9yIG5lYXIgemVyby4gIERvdWcgQmF0ZXMgaGFzIGFsd2F5cyBiZWVuIGEgYml0IHVuc3VyZSB0aGF0IGBtY21jc2FtcGAgaXMgcmVhbGx5IHBlcmZvcm1pbmcgYXMgaW50ZW5kZWQsIGV2ZW4gaW4gdGhlIGxpbWl0ZWQgY2FzZXMgaXQgbm93IGhhbmRsZXMuCgpHaXZlbiB0aGlzIHVuY2VydGFpbnR5IGFib3V0IGhvdyBldmVuIHRoZSBiYXNpYyB2ZXJzaW9uIHdvcmtzLCB0aGUgYGxtZTRgIGRldmVsb3BlcnMgaGF2ZSBiZWVuIHJlbHVjdGFudCB0byBtYWtlIHRoZSBlZmZvcnQgdG8gZXh0ZW5kIGl0IHRvIEdMTU1zIG9yIG1vcmUgY29tcGxleCBMTU1zLCBvciB0byBpbXBsZW1lbnQgaXQgZm9yIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIGxtZTQgLi4uIHNvIHVubGVzcyBzb21ldGhpbmcgbWlyYWN1bG91cyBoYXBwZW5zLCBpdCB3aWxsIG5vdCBiZSBpbXBsZW1lbnRlZCBmb3IgdGhlIG5ldyB2ZXJzaW9uIG9mIGBsbWU0YC4gQXMgYWx3YXlzLCB1c2VycyBhcmUgZW5jb3VyYWdlZCB0byB3cml0ZSBhbmQgc2hhcmUgdGhlaXIgb3duIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZXNlIGNhcGFiaWxpdGllcyAuLi4KCiMjIyMgUGFyYW1ldHJpYyBib290c3RyYXAKClRoZSBpZGVhIGhlcmUgaXMgdGhhdCBpbiBvcmRlciB0byBkbyBpbmZlcmVuY2Ugb24gdGhlIGVmZmVjdCBvZiAoYSkgcHJlZGljdG9yKHMpLCB5b3UgKDEpIGZpdCB0aGUgcmVkdWNlZCBtb2RlbCAod2l0aG91dCB0aGUgcHJlZGljdG9ycykgdG8gdGhlIGRhdGE7ICgyKSBtYW55IHRpbWVzLCAoMmEpIHNpbXVsYXRlIGRhdGEgZnJvbSB0aGUgcmVkdWNlZCBtb2RlbDsgKDJiKSBmaXQgYm90aCB0aGUgcmVkdWNlZCBhbmQgdGhlIGZ1bGwgbW9kZWwgdG8gdGhlIHNpbXVsYXRlZCAobnVsbCkgZGF0YTsgKDJjKSBjb21wdXRlIHNvbWUgc3RhdGlzdGljKHMpIFtlLmcuIHQtc3RhdGlzdGljIG9mIHRoZSBmb2NhbCBwYXJhbWV0ZXIsIG9yIHRoZSBsb2ctbGlrZWxpaG9vZCBvciBkZXZpYW5jZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1vZGVsc107ICgzKSBjb21wYXJlIHRoZSBvYnNlcnZlZCB2YWx1ZXMgb2YgdGhlIHN0YXRpc3RpYyBmcm9tIGZpdHRpbmcgeW91ciBmdWxsIG1vZGVsIHRvIHRoZSBkYXRhIHRvIHRoZSBudWxsIGRpc3RyaWJ1dGlvbiBnZW5lcmF0ZWQgaW4gc3RlcCAyLgotIGBQQm1vZGNvbXBgIGluIHRoZSBgcGJrcnRlc3RgIHBhY2thZ2UKLSBzZWUgdGhlIGV4YW1wbGUgaW4gYGhlbHAoInNpbXVsYXRlLW1lciIpYCBpbiB0aGUgYGxtZTRgIHBhY2thZ2UgdG8gcm9sbCB5b3VyIG93biwgdXNpbmcgYSBjb21iaW5hdGlvbiBvZiBgc2ltdWxhdGUoKWAgYW5kIGByZWZpdCgpYC4KLSBgYm9vdE1lcmAgaW4gYGxtZTRgIHZlcnNpb24gPjEuMC4wCi0gYSBwcmVzZW50YXRpb24gYXQgVXNlUiEgMjAwOSAoW2Fic3RyYWN0XShodHRwOi8vd3d3LmFncm9jYW1wdXMtb3Vlc3QuZnIvbWF0aC91c2VSLTIwMDkvYWJzdHJhY3RzL3BkZi9TYW5jaGV6RXNwaWdhcmVzK09jYW5hLnBkZiksIFtzbGlkZXNdKGh0dHA6Ly93d3cuYWdyb2NhbXB1cy1vdWVzdC5mci9tYXRoL3VzZVItMjAwOS9zbGlkZXMvU2FuY2hlekVzcGlnYXJlcytPY2FuYS5wZGYpKSB3ZW50IGludG8gZGV0YWlsIGFib3V0IGEgcHJvcG9zZWQgYGJvb3RNZXJgIHBhY2thZ2UgYW5kIHN1Z2dlc3RlZCBpdCBjb3VsZCB3b3JrIGZvciBHTE1NcyB0b28gLS0gCmJ1dCBpdCBkb2VzIG5vdCBzZWVtIHRvIGJlIGFjdGl2ZS4KCiMjIFByZWRpY3Rpb25zIGFuZC9vciBjb25maWRlbmNlIChvciBwcmVkaWN0aW9uKSBpbnRlcnZhbHMgb24gcHJlZGljdGlvbnMKCk5vdGUgdGhhdCBub25lIG9mIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2hlcyB0YWtlcyB0aGUgdW5jZXJ0YWludHkKb2YgdGhlIHJhbmRvbSBlZmZlY3RzIHBhcmFtZXRlcnMgaW50byBhY2NvdW50IC4uLiBpZiB5b3Ugd2FudCB0byB0YWtlIFJFIHBhcmFtZXRlciB1bmNlcnRhaW50eSBpbnRvIGFjY291bnQsIGEgQmF5ZXNpYW4gYXBwcm9hY2ggaXMgcHJvYmFibHkgdGhlIGVhc2llc3Qgd2F5IHRvIGRvIGl0LgoKVGhlIGdlbmVyYWwgcmVjaXBlIGZvciBjb21wdXRpbmcgcHJlZGljdGlvbnMgZnJvbSBhIGxpbmVhciBvciBnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWwgaXMgdG8gCgotIGZpZ3VyZSBvdXQgdGhlIG1vZGVsIG1hdHJpeCAkWCQgY29ycmVzcG9uZGluZyB0byB0aGUgbmV3IGRhdGE7Ci0gIG1hdHJpeC1tdWx0aXBseSAkWCQgYnkgdGhlIHBhcmFtZXRlciB2ZWN0b3IgJFxiZXRhJCB0byBnZXQgdGhlIHByZWRpY3Rpb25zIChvciBsaW5lYXIgcHJlZGljdG9yIGluIHRoZSBjYXNlIG9mIEdMTShNKXMpOyAKLSBleHRyYWN0IHRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBvZiB0aGUgcGFyYW1ldGVycyAkViQgCi0gY29tcHV0ZSAkWCBWIFhee1xwcmltZX0kIHRvIGdldCB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggb2YgdGhlIHByZWRpY3Rpb25zOyAKLSBleHRyYWN0IHRoZSBkaWFnb25hbCBvZiB0aGlzIG1hdHJpeCB0byBnZXQgdmFyaWFuY2VzIG9mIHByZWRpY3Rpb25zOwotIGlmIGNvbXB1dGluZyBwcmVkaWN0aW9uIHJhdGhlciB0aGFuIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBhZGQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlOyAKLSB0YWtlIHRoZSBzcXVhcmUtcm9vdCBvZiB0aGUgdmFyaWFuY2VzIHRvIGdldCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyAoZXJyb3JzKSBvZiB0aGUgcHJlZGljdGlvbnM7IAotIGNvbXB1dGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgYmFzZWQgb24gYSBOb3JtYWwgYXBwcm94aW1hdGlvbjsKLSBmb3IgR0woTSlNcywgcnVuIHRoZSBjb25maWRlbmNlIGludGVydmFsIGJvdW5kYXJpZXMgKG5vdCB0aGUgc3RhbmRhcmQgZXJyb3JzKSB0aHJvdWdoIHRoZSBpbnZlcnNlLWxpbmsgZnVuY3Rpb24uCgojIyMgbG1lCgpgYGB7ciBsbWVwcmVkLGNhY2hlPVRSVUUsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShubG1lKSAKZm0xIDwtIGxtZShkaXN0YW5jZSB+IGFnZSpTZXgsIHJhbmRvbSA9IH4gMSArIGFnZSB8IFN1YmplY3QsCiAgICAgICAgICAgZGF0YSA9IE9ydGhvZG9udCkgCnBsb3QoT3J0aG9kb250LGFzcD0iZmlsbCIpICMjIHBsb3QgcmVzcG9uc2VzIGJ5IGluZGl2aWR1YWwKIyMgbm90ZSB0aGF0IGV4cGFuZC5ncmlkKCkgb3JkZXJzIGZhY3RvciBsZXZlbHMgYnkgKm9yZGVyIG9mCiMjIGFwcGVhcmFuY2UqIC0tIG11c3QgbWF0Y2ggbGV2ZWxzKE9ydGhvZG9udCRTZXgpCm5ld2RhdCA8LSBleHBhbmQuZ3JpZChhZ2U9Yyg4LDEwLDEyLDE0KSwgU2V4PWMoIkZlbWFsZSIsIk1hbGUiKSkgCm5ld2RhdCRwcmVkIDwtIHByZWRpY3QoZm0xLCBuZXdkYXQsIGxldmVsID0gMCkKCiMjIFstMl0gZHJvcHMgcmVzcG9uc2UgZnJvbSBmb3JtdWxhCkRlc2lnbm1hdCA8LSBtb2RlbC5tYXRyaXgoZm9ybXVsYShmbTEpWy0yXSwgbmV3ZGF0KQpwcmVkdmFyIDwtIGRpYWcoRGVzaWdubWF0ICUqJSB2Y292KGZtMSkgJSolIHQoRGVzaWdubWF0KSkgCm5ld2RhdCRTRSA8LSBzcXJ0KHByZWR2YXIpIApuZXdkYXQkU0UyIDwtIHNxcnQocHJlZHZhcitmbTEkc2lnbWFeMikKCmxpYnJhcnkoZ2dwbG90MikgCnBkIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNCkgCmcwIDwtIGdncGxvdChuZXdkYXQsYWVzKHg9YWdlLHk9cHJlZCxjb2xvdXI9U2V4KSkrIAogICBnZW9tX3BvaW50KHBvc2l0aW9uPXBkKQpjbXVsdCA8LSAyICAjIyBjb3VsZCB1c2UgMS45NiBpbnN0ZWFkCmcwICsgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW49cHJlZC1jbXVsdCpTRSx5bWF4PXByZWQrY211bHQqU0UpLCBwb3NpdGlvbj1wZCkKCiMjIHByZWRpY3Rpb24gaW50ZXJ2YWxzIApnMCArIGdlb21fbGluZXJhbmdlKGFlcyh5bWluPXByZWQtY211bHQqU0UyLHltYXg9cHJlZCtjbXVsdCpTRTIpLCBwb3NpdGlvbj1wZCkgCmBgYAoKQSBzaW1pbGFyIGFuc3dlciBpcyBsYWlkIG91dCBpbiB0aGUgcmVzcG9uc2VzIHRvIHRoaXMgW1N0YWNrT3ZlcmZsb3cgcXVlc3Rpb25dKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQzNTg4MTEvZXh0cmFjdC1wcmVkaWN0aW9uLWJhbmQtZnJvbS1sbWUtZml0KS4KCiMjIyBsbWU0CgpDdXJyZW50IHZlcnNpb25zIG9mIGxtZTQgaGF2ZSBhIGBwcmVkaWN0YCBtZXRob2QuCgpgYGB7ciBsbWU0cHJlZCxjYWNoZT1UUlVFfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoZ2dwbG90MikKZGF0YSgiT3J0aG9kb250IixwYWNrYWdlPSJNRU1TUyIpCmZtMSA8LSBsbWVyKAoJZm9ybXVsYSA9IGRpc3RhbmNlIH4gYWdlKlNleCArIChhZ2V8U3ViamVjdCkKCSwgZGF0YSA9IE9ydGhvZG9udAopCm5ld2RhdCA8LSBleHBhbmQuZ3JpZCgKCWFnZT1jKDgsMTAsMTIsMTQpCgksIFNleD1jKCJGZW1hbGUiLCJNYWxlIikKCSwgZGlzdGFuY2UgPSAwCikKbmV3ZGF0JGRpc3RhbmNlIDwtIHByZWRpY3QoZm0xLG5ld2RhdCxyZS5mb3JtPU5BKQptbSA8LSBtb2RlbC5tYXRyaXgodGVybXMoZm0xKSxuZXdkYXQpCiMjIG9yIG5ld2RhdCRkaXN0YW5jZSA8LSBtbSAlKiUgZml4ZWYoZm0xKQpwdmFyMSA8LSBkaWFnKG1tICUqJSB0Y3Jvc3Nwcm9kKHZjb3YoZm0xKSxtbSkpCnR2YXIxIDwtIHB2YXIxK1ZhckNvcnIoZm0xKSRTdWJqZWN0WzFdICAjIyBtdXN0IGJlIGFkYXB0ZWQgZm9yIG1vcmUgY29tcGxleCBtb2RlbHMKY211bHQgPC0gMiAjIyBjb3VsZCB1c2UgMS45NgpuZXdkYXQgPC0gZGF0YS5mcmFtZSgKCW5ld2RhdAoJLCBwbG8gPSBuZXdkYXQkZGlzdGFuY2UtY211bHQqc3FydChwdmFyMSkKCSwgcGhpID0gbmV3ZGF0JGRpc3RhbmNlK2NtdWx0KnNxcnQocHZhcjEpCgksIHRsbyA9IG5ld2RhdCRkaXN0YW5jZS1jbXVsdCpzcXJ0KHR2YXIxKQoJLCB0aGkgPSBuZXdkYXQkZGlzdGFuY2UrY211bHQqc3FydCh0dmFyMSkKKQojcGxvdCBjb25maWRlbmNlCmcwIDwtIGdncGxvdChuZXdkYXQsIGFlcyh4PWFnZSwgeT1kaXN0YW5jZSwgY29sb3VyPVNleCkpK2dlb21fcG9pbnQoKQpnMCArIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IHBsbywgeW1heCA9IHBoaSkpKwogICAgbGFicyh0aXRsZT0iQ0kgYmFzZWQgb24gZml4ZWQtZWZmZWN0cyB1bmNlcnRhaW50eSBPTkxZIikKI3Bsb3QgcHJlZGljdGlvbgpnMCArIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IHRsbywgeW1heCA9IHRoaSkpKwogICAgbGFicyh0aXRsZT0iQ0kgYmFzZWQgb24gRkUgdW5jZXJ0YWludHkgKyBSRSB2YXJpYW5jZSIpCnJtKCJPcnRob2RvbnQiKSAjIyBjbGVhbiB1cApgYGAKCiMjIyBnbG1tVE1CCgpgYGB7ciBnbG1tVE1CcHJlZCxjYWNoZT1UUlVFfQpsaWJyYXJ5KGdsbW1UTUIpCmRhdGEoT3J0aG9kb250LHBhY2thZ2U9Im5sbWUiKQpmbTIgPC0gZ2xtbVRNQihkaXN0YW5jZSB+IGFnZSpTZXggKyAoYWdlIHwgU3ViamVjdCksCiAgICAgICAgICAgICAgICBkYXRhID0gT3J0aG9kb250LAogICAgICAgICAgICAgICAgZmFtaWx5PSJnYXVzc2lhbiIpCgojIyBtYWtlIHByZWRpY3Rpb24gZGF0YSBmcmFtZQpuZXdkYXQgPC0gZXhwYW5kLmdyaWQoYWdlPWMoOCwxMCwxMiwxNCksIFNleD1jKCJGZW1hbGUiLCJNYWxlIikpCiMjIGRlc2lnbiBtYXRyaXggKGZpeGVkIGVmZmVjdHMpCm1tIDwtIG1vZGVsLm1hdHJpeChkZWxldGUucmVzcG9uc2UodGVybXMoZm0yKSksbmV3ZGF0KQojIyBsaW5lYXIgcHJlZGljdG9yIChmb3IgR0xNTXMsIGJhY2stdHJhbnNmb3JtIHRoaXMgd2l0aCB0aGUKIyMgIGludmVyc2UgbGluayBmdW5jdGlvbiAoZS5nLiBwbG9naXMoKSBmb3IgYmlub21pYWwsIGJldGE7CiMjICBleHAoKSBmb3IgUG9pc3NvbiwgbmVnYXRpdmUgYmlub21pYWwKbmV3ZGF0JGRpc3RhbmNlIDwtIGRyb3AobW0gJSolIGZpeGVmKGZtMilbWyJjb25kIl1dKQpwcmVkdmFyIDwtIGRpYWcobW0gJSolIHZjb3YoZm0yKVtbImNvbmQiXV0gJSolIHQobW0pKQpuZXdkYXQkU0UgPC0gc3FydChwcmVkdmFyKSAKbmV3ZGF0JFNFMiA8LSBzcXJ0KHByZWR2YXIrc2lnbWEoZm0yKV4yKQpgYGAKCihQcm9iYWJseSBvdmVybHkgY29tcGxpY2F0ZWQpIGBnZ3Bsb3RgIGNvZGU6CmBgYHtyIGdncGxvdH0KbGlicmFyeShnZ3Bsb3QyKTsgIHRoZW1lX3NldCh0aGVtZV9idygpKQpwZCA8LSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjQpCmcwIDwtIGdncGxvdChPcnRob2RvbnQsYWVzKHg9YWdlLHk9ZGlzdGFuY2UsY29sb3VyPVNleCkpKwogICAgc3RhdF9zdW0oYWxwaGE9MC4yLGFlcyhzaXplPS4ubi4uKSkrCiAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoYnJlYWtzPTE6NCxyYW5nZT1jKDIsNSkpCmcxIDwtIGcwK2dlb21fbGluZShkYXRhPW5ld2RhdCxwb3NpdGlvbj1wZCkrCiAgICBnZW9tX3BvaW50KGRhdGE9bmV3ZGF0LHNoYXBlPTE3LHNpemU9Myxwb3NpdGlvbj1wZCkKIyMgY29uZmlkZW5jZSBpbnRlcnZhbHMKZzIgPC0gZzEgKyBnZW9tX2xpbmVyYW5nZShkYXRhPW5ld2RhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeW1pbj1kaXN0YW5jZS0yKlNFLHltYXg9ZGlzdGFuY2UrMipTRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbHdkPTIsIHBvc2l0aW9uPXBkKQojIyBwcmVkaWN0aW9uIGludGVydmFscyAKZzIgKyBnZW9tX2xpbmVyYW5nZShkYXRhPW5ld2RhdCwKICAgICAgICAgICAgICAgICAgICBhZXMoeW1pbj1kaXN0YW5jZS0yKlNFMix5bWF4PWRpc3RhbmNlKzIqU0UyKSwgcG9zaXRpb249cGQpCmBgYAoKVGhlIGBlZmZlY3RzYCwgYGVtbWVhbnNgLCBhbmQgYHNqUGxvdGAgcGFja2FnZXMgYXJlIGFsc28gdXNlZnVsIGhlcmUuCgojIyBDb25maWRlbmNlIGludGVydmFscyBvbiBjb25kaXRpb25hbCBtZWFucy9CTFVQcy9yYW5kb20gZWZmZWN0cwoKIyMjIGxtZTQgCgooRnJvbSBIYXJvbGQgRG9yYW4sIHVwZGF0ZWQgYnkgQXNzYWYgT3JvbiBOb3YuIDIwMTM6KQoKSWYgeW91IHdhbnQgdGhlIHN0YW5kYXJkIGVycm9ycyBvZiB0aGUgY29uZGl0aW9uYWwgbWVhbnMsIHlvdSBjYW4gZXh0cmFjdCB0aGVtIGFzIGZvbGxvd3M6CmBgYHtyIHN0ZGVyX2NvbmRtZWFuc30KbGlicmFyeShsbWU0KQpmbTEgPC0gbG1lcihSZWFjdGlvbiB+IERheXMgKyAoRGF5c3xTdWJqZWN0KSwgc2xlZXBzdHVkeSkKY1YgPC0gcmFuZWYoZm0xLCBjb25kVmFyID0gVFJVRSkgICAKYGBgCmBjVmAgaXMgYSBsaXN0OyBlYWNoIGVsZW1lbnQgaXMgYSBkYXRhIGZyYW1lIGNvbnRhaW5pbmcgdGhlIGNvbmRpdGlvbmFsIG1vZGVzIGZvciBhIHBhcnRpY3VsYXIgZ3JvdXBpbmcgZmFjdG9yLiBJZiB5b3UgdXNlIHNjYWxhciByYW5kb20gZWZmZWN0cyAodHlwaWNhbGx5IHJhbmRvbSBpbnRlcmNlcHRzKSwgdGhlbiBzcGVjaWZ5aW5nIGByYW5lZiguLi4sZHJvcD1UUlVFKWAgd2lsbCByZXR1cm4gdGhlIGNvbmRpdGlvbmFsIG1vZGVzIGFzIGEgc2luZ2xlIG5hbWVkIHZlY3RvciBpbnN0ZWFkLgoKVGhlIGNvbmRpdGlvbmFsIHZhcmlhbmNlcyBhcmUgcmV0dXJuZWQgYXMgYW4gYXR0cmlidXRlIG9mIHRoZSBjb25kaXRpb25hbCBtb2Rlcy4KSXQgbWF5IGJlIGVhc2llc3QgdG8gdXNlIGBhcy5kYXRhLmZyYW1lKGNWKWAsIG9yIGBicm9vbS5taXhlZDo6dGlkeShmbTEsIGVmZmVjdHM9InJhbl92YWxzIilgLCB0byBleHRyYWN0IGFsbCBvZiB0aGUgY29uZGl0aW9uYWwgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMuCgpPciwgZGlnZ2luZyBpbiB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUgYnkgaGFuZDogaWYgd2Ugc2V0CmBgYHtyIHJhbnZhcn0KcmFudmFyIDwtIGF0dHIoY1ZbWzFdXSwgInBvc3RWYXIiKQpgYGAKdGhlbiBgcmFudmFyYCBpcyBhIDMtRCBhcnJheSAodGhlIGF0dHJpYnV0ZSBpcyBzdGlsbCBjYWxsZWQgYHBvc3RWYXJgLCByYXRoZXIgdGhhbiBgY29uZFZhcmAsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMvYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuIEluZGl2aWR1YWwtbGV2ZWwgY292YXJpYW5jZSBtYXRyaWNlcyBvZiB0aGUgY29uZGl0aW9uYWwgbW9kZXMgd2lsbCBzaXQgb24gdGhlIGBbLCxpXWAgZmFjZXMuIEZvciBleGFtcGxlLCBgcmFudmFyWywsMV1gIGlzIHRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBvZiB0aGUgY29uZGl0aW9uYWwgZGlzdHJpYnV0aW9uIGZvciB0aGUgZmlyc3QgZ3JvdXAsIHNvCmBgYHtyIHNxcnRkaWFncmFudmFyc30Kc3FydChkaWFnKHJhbnZhclssLDFdKSkKYGBgCndpbGwgcHJvdmlkZSB0aGUgaW50ZXJjZXB0IGFuZCBzbG9wZSBzdGFuZGFyZCBzdGFuZGFyZCBkZXZpYXRpb25zIGZvciB0aGUgZmlyc3QgZ3JvdXAncyBjb25kaXRpb25hbCBtb2Rlcy4gSWYgeW91IGhhdmUgYSBzY2FsYXIgcmFuZG9tIGVmZmVjdCBhbmQgdXNlZCBgZHJvcD1UUlVFYCBpbiBgcmFuZWYoKWAsIHRoZW4geW91IHdpbGwgKG1lcmNpZnVsbHkpIHJlY2VpdmUgb25seSBhIHZlY3RvciBvZiBpbmRpdmlkdWFsIHZhcmlhbmNlcyBoZXJlIChvbmUgZm9yIGVhY2ggbGV2ZWwgb2YgdGhlIGdyb3VwaW5nIGZhY3RvcikuIFRoZSBmb2xsb3dpbmcgaW5jYW50YXRpb24gd2lsbCBnaXZlIGEgbWF0cml4IG9mIGNvbmRpdGlvbmFsIHZhcmlhbmNlcyB3aXRoIG9uZSByb3cgZm9yIGVhY2ggZ3JvdXAgYW5kIG9uZSBjb2x1bW4gZm9yIGVhY2ggcGFyYW1ldGVyczoKYGBge3IgcmFuc2V9Cm5nIDwtIGRpbShyYW52YXIpWzNdCm5wIDwtIGRpbShyYW52YXIpWzJdCm1tIDwtIG1hdHJpeChyYW52YXJbY2JpbmQocmVwKHNlcShucCksbmcpLAogICAgICAgICAgICAgcmVwKHNlcShucCksbmcpLAogICAgICAgICAgICAgcmVwKG5nLGVhY2g9bnApKV0sCiAgICAgICBieXJvdz1UUlVFLAogICAgICAgbnJvdz1uZykKYGBgICAgICAgICAgICAgIAoKR2V0dGluZyB0aGUgdW5jZXJ0YWludHkgb2YgdGhlIGNvZWZmaWNpZW50cyAoaS5lLiwgd2hhdCdzIHJldHVybmVkIGJ5IGBjb2VmKClgOiB0aGUgc3VtIG9mIHRoZSBmaXhlZC1lZmZlY3QgYW5kIHJhbmRvbS1lZmZlY3QgcHJlZGljdGlvbnMgZm9yIGEgcGFydGljdWxhciBsZXZlbCkgaXMgbm90IChhbGFzKSBjdXJyZW50bHkgZWFzeSB3aXRoIGBsbWU0YC4gSWYgdGhlIGZpeGVkIGFuZCByYW5kb20gZWZmZWN0cyB3ZXJlIGluZGVwZW5kZW50IHRoZW4gd2UgY291bGQgc2ltcGx5IGFkZCB0aGUgY29uZGl0aW9uYWwgdmFyaWFuY2UgYW5kIHRoZSB2YXJpYW5jZSBvZiB0aGUgZml4ZWQtZWZmZWN0IHByZWRpY3Rpb25zLCBidXQgdGhleSBhcmVuJ3QgaW4gZ2VuZXJhbC4gVGhlcmUgaXMgYSBsb25nIFtyLXNpZy1taXhlZC1tb2RlbHMgbWFpbGluZyBsaXN0IHRocmVhZF0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvcGlwZXJtYWlsL3Itc2lnLW1peGVkLW1vZGVscy8yMDEzcTEvMDE5Nzk1Lmh0bWwpIHRoYXQgZGlzY3Vzc2VzIHRoZSBpc3N1ZXMsIGZvY3VzaW5nIG9uICgxKSBob3cgdG8gZXh0cmFjdCB0aGUgY292YXJpYW5jZSBiZXR3ZWVuIGZpeGVkLWVmZmVjdCBlc3RpbWF0ZSBhbmQgdGhlIHJhbmRvbS1lZmZlY3QgcHJlZGljdGlvbjsgKDIpIHdoZXRoZXIgdGhpcyB2YWx1ZSAodGhlIGNvdmFyaWFuY2UgYmV0d2VlbiBhbiAqZXN0aW1hdGVkKiBwYXJhbWV0ZXIgYW5kIGEgKnByZWRpY3RlZCogbW9kZSBvZiBhIGNvbmRpdGlvbmFsIGRpc3RyaWJ1dGlvbiBvZiBhIHJhbmRvbSB2YXJpYWJsZSkgZXZlbiBtYWtlcyBzZW5zZSBpbiBhIGZyZXF1ZW50aXN0IGZyYW1ld29yay4gSWYgeW91J3JlIHdpbGxpbmcgdG8gKmFzc3VtZSogaW5kZXBlbmRlbmNlIG9mIHRoZSBjb25kaXRpb25hbCB2YXJpYW5jZSBhbmQgdGhlIGZpeGVkLWVmZmVjdCBzYW1wbGluZyB2YXJpYW5jZSwgdGhlbiAoZS5nLikgdGhlIHZhcmlhbmNlIG9mIHRoZSBpbnRlcmNlcHRzIGZvciBlYWNoIGdyb3VwIHdvdWxkIGJlIHRoZSBzdW0gb2YgdGhlIGZpeGVkLWVmZmVjdCBpbnRlcmNlcHQgdmFyaWFuY2UgYW5kIHRoZSBjb25kaXRpb25hbCB2YXJpYW5jZSBvZiB0aGUgaW50ZXJjZXB0IGZvciBlYWNoIGdyb3VwOgoKYGBge3IgY29tYn0KdmNvdihmbTEpWzEsMV0rbW1bLDFdCmBgYAoKIyMgUG93ZXIgYW5hbHlzaXMKClBvd2VyIGFuYWx5c2lzIGZvciAoRylMTU1zIGlzIG1vc3RseSBkb25lIGJ5IHNpbXVsYXRpb24sIGFsdGhvdWdoCnRoZXJlIGFyZSBzb21lIGNsb3NlZC1mb3JtIHNvbHV0aW9ucyBhbmQgYXBwcm94aW1hdGlvbnMsIGUuZy4KQHNuaWpkZXJzX3N0YW5kYXJkXzE5OTMgKFNuaWpkZXJzIGhhcyBsaW5rcyB0byBwcm9ncmFtcyBhbmQgb3RoZXIgcmVzb3VyY2VzCm9uIFtoaXMgd2ViIHBhZ2VdKGh0dHBzOi8vd3d3LnN0YXRzLm94LmFjLnVrL35zbmlqZGVycy9tdWx0aWxldmVsLmh0bSkpLiBUaGVyZSBhcmUgcmVzb3VyY2VzIGFuZCBiaXRzIG9mIGNvZGUgZXhhbXBsZXMgc3ByZWFkIGFsbCBvdmVyIHRoZSBpbnRlcm5ldC4gZS5nLiBbaGVyZV0oaHR0cHM6Ly9ycHVicy5jb20vYmJvbGtlci8xMTcwMykuCgpAa2Fpbl9wcmFjdGljYWxfMjAxNSBhbmQgQGpvaG5zb25fcG93ZXJfMjAxNSBhcmUgcGVlci1yZXZpZXdlZCBwYXBlcnMKdGhhdCBkaXNjdXNzIHBvd2VyIGFuYWx5c2lzIHZpYSBzaW11bGF0aW9uIGluIG1vcmUgZGV0YWlsLgoKYGBge3IgZXZhbD1GQUxTRX0KbGlicmFyeShzb3MpOyBmaW5kRm4oIntwb3dlciBhbmFseXNpc30gbWl4ZWQgc2ltdWxhdGlvbiIpCmBgYApsb2NhdGVzIHRoZSBgZnVsbGZhY3RgLCBgcGFtbWAsIGBzaW1yYCwgYW5kIGBzaW1nbG1gIHBhY2thZ2VzLgpEZXBlbmRpbmcgb24gdGhlIGdvYWwsIG9uZSBvZiB0aGVzZSBwYWNrYWdlcyBtYXkgaGF2ZSBzdWZmaWNpZW50CmZsZXhpYmlsaXR5IHRvIGRvIHdoYXQgeW91IHdhbnQuCgojIE1vZGVsIHNlbGVjdGlvbiBhbmQgYXZlcmFnaW5nCgojIyBDYW4gSSB1c2UgQUlDIGZvciBtaXhlZCBtb2RlbHM/ICBIb3cgZG8gSSBjb3VudCB0aGUgbnVtYmVyIG9mIGRlZ3JlZXMgb2YgZnJlZWRvbSBmb3IgYSByYW5kb20gZWZmZWN0PwoKLSBZZXMsIHdpdGggY2F1dGlvbi4KLSBJdCBkZXBlbmRzIG9uIHRoZSAibGV2ZWwgb2YgZm9jdXMiICgqc2Vuc3UqIEBzcGllZ2VsaGFsdGVyX2JheWVzaWFuXzIwMDIpIHdoZXRoZXIgKGUuZy4pIGEgc2luZ2xlIHJhbmRvbS1lZmZlY3QgdmFyaWFuY2Ugc2hvdWxkIGJlIGNvdW50ZWQgYXMgMSBkZWdyZWUgb2YgZnJlZWRvbSAoaS5lLiwgdGhlIHZhcmlhbmNlIHBhcmFtZXRlciBvciBhcyBhIHZhbHVlIGJldHdlZW4gMSBhbmQgTi0xICh3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgZ3JvdXBzKTogc2VlIEB2YWlkYV9jb25kaXRpb25hbF8yMDA1IGFuZCBAZ3JldmVuX2JlaGF2aW91cl8yMDEwLiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHBvcHVsYXRpb24tbGV2ZWwgcHJlZGljdGlvbi9pbmZlcmVuY2UsIHRoZW4gdGhlIGZvcm1lciAoY2FsbGVkICptYXJnaW5hbCBBSUMqIFttQUlDXSk7IGlmIGluZGl2aWR1YWwtbGV2ZWwgcHJlZGljdGlvbi9pbmZlcmVuY2UgKGkuZS4sIHVzaW5nIHRoZSBCTFVQcy9jb25kaXRpb25hbCBtb2RlcyksIHRoZW4gdGhlIGxhdHRlciAoY2FsbGVkICpjb25kaXRpb25hbCBBSUMqIFtjQUlDXSkuIEdyZXZlbiBhbmQgS25laWIgcHJlc2VudCByZXN1bHRzIGZvciBsaW5lYXIgbW9kZWxzLCBnaXZpbmcgYSB2ZXJzaW9uIG9mIGNBSUMgdGhhdCBpcyBib3RoIGNvbXB1dGF0aW9uYWxseSBlZmZpY2llbnQgYW5kIHRha2VzIHVuY2VydGFpbnR5IGluIHRoZSBlc3RpbWF0aW9uIG9mIHRoZSB2YXJpYW5jZXMgaW50byBhY2NvdW50LiAgKEJvYiBPJ0hhcmEgaGFzIGEgdmVyeSBuaWNlLCBpbGx1c3RyYXRpdmUgW2Jsb2cgcG9zdF0oaHR0cDovL2RlZXB0aG91Z2h0c2FuZHNpbGxpbmVzcy5ibG9nc3BvdC5jYS8yMDA3LzEyL2ZvY3VzLW9uLWRpYy5odG1sKSBvbiB0aGlzIHRvcGljIGluIHRoZSBjb250ZXh0IG9mIERJQyAuLi4pCi0gaW4gY2FzZXMgd2hlbiB0ZXN0aW5nIGEgdmFyaWFuY2UgcGFyYW1ldGVyLCBBSUMgbWF5IGJlIHN1YmplY3QgdG8gdGhlIHNhbWUga2luZHMgb2YgYm91bmRhcnkgZWZmZWN0cyBhcyBsaWtlbGlob29kIHJhdGlvIHRlc3QgcC12YWx1ZXMgKGkuZS4sIEFJQ3MgbWF5IGJlIGNvbnNlcnZhdGl2ZS9vdmVyZml0IHNsaWdodGx5IHdoZW4gdGhlIG5lc3RlZCBwYXJhbWV0ZXIgdmFsdWUgaXMgb24gdGhlIGJvdW5kYXJ5IG9mIHRoZSBmZWFzaWJsZSBzcGFjZSkuIEBncmV2ZW5fYmVoYXZpb3VyXzIwMTAgZXhwbG9yZSB0aGUgcHJvYmxlbXMgd2l0aCBtQUlDIGluIHRoaXMgY29udGV4dCwgYnV0IGRvIG5vdCBzdWdnZXN0IGEgc29sdXRpb24gKHRoZXkgcG9pbnQgb3V0IHRoYXQgQGh1Z2hlc19tb2RlbF8yMDAzIHByZXNlbnQgYSAnb25lLXNpZGVkJyBBSUMsIGJ1dCBub3Qgb25lIHRoYXQgZGVhbHMgd2l0aCB0aGUgbm9uLWluZGVwZW5kZW5jZSBvZiBkYXRhIHBvaW50cy4gIEkgaGF2ZW4ndCByZWFkIEh1Z2hlcyBhbmQgS2luZywgSSBzaG91bGQgZ28gZG8gdGhhdCkuCi0gQUlDIGFsc28gaW5oZXJpdHMgdGhlIHByaW1hcnkgcHJvYmxlbSBvZiBsaWtlbGlob29kIHJhdGlvIHRlc3RzIGluIHRoZSBHTE1NIGNvbnRleHQgLS0gdGhhdCBpcywgdGhhdCBMUlRzIGFyZSBhc3ltcHRvdGljIHRlc3RzLiBBIGZpbml0ZS1zaXplIGNvcnJlY3Rpb24gZm9yIEFJQyBkb2VzIGV4aXN0IChBSUNjKSAtLSBidXQgaXQgd2FzIGRldmVsb3BlZCBpbiB0aGUgY29udGV4dCBvZiBsaW5lYXIgbW9kZWxzLiBBcyBmYXIgYXMgSSBrbm93IGl0cyBhZGVxdWFjeSBpbiB0aGUgR0xNTSBjYXNlIGhhcyBub3QgYmVlbiBlc3RhYmxpc2hlZC4gU2VlIGUuZy4gQHJpY2hhcmRzX3Rlc3RpbmdfMjAwNSBmb3IgY2F1dGlvbiBhYm91dCBBSUNjIGluIHRoZSBHTE0gKG5vdCBHTE1NKSBjYXNlLgotIGxtZTQgYW5kIG5sbWUgY291bnQgcGFyYW1ldGVycyBmb3IgQUlDKGMpIGFzIGZvbGxvd3M6CiAgICAtIHRoZSBudW1iZXIgb2YgZml4ZWQtZWZmZWN0IHBhcmFtZXRlcnMgaXMgc3RyYWlnaHRmb3J3YXJkICh0aGUgbGVuZ3RoIG9mIHRoZSBmaXhlZC1lZmZlY3QgcGFyYW1ldGVyIHZlY3RvciBiZXRhLCBpLmUuIGBsZW5ndGgoZml4ZWYobW9kZWwpKWApCgktIGVhY2ggcmFuZG9tIHRlcm0gaW4gdGhlIG1vZGVsIHdpdGggJHEkIGNvbXBvbmVudHMgY291bnRzIGZvciAkcShxKzEpLzIkIHBhcmFtZXRlcnMgLS0gZm9yIGV4YW1wbGUsIGEgdGVybSBvZiB0aGUgZm9ybSAoc2xvcGV8Z3JvdXApIGhhcyAzIHBhcmFtZXRlcnMgKGludGVyY2VwdCB2YXJpYW5jZSwgc2xvcGUgdmFyaWFuY2UsIGNvcnJlbGF0aW9uIGJldHdlZW4gaW50ZXJjZXB0IGFuZCBzbG9wZSkuCiAgICAtIG1vZGVscyB0aGF0IHVzZSBhIHNjYWxlIHBhcmFtZXRlciAoZS5nLiB0aGUgdmFyaWFuY2UgcGFyYW1ldGVyIG9mIGxpbmVhciBtaXhlZCBtb2RlbHMsIG9yIHRoZSBzY2FsZSBwYXJhbWV0ZXIgb2YgYSBHYW1tYSBHTE1NIC0tIHN0YW5kYXJkIEdMTU1zIHN1Y2ggYXMgYmlub21pYWwgYW5kIFBvaXNzb24gZG8gbm90KSBnZXQgYW4gZXh0cmEgcGFyYW1ldGVyIGNvdW50ZWQuIFdoZXRoZXIgdG8gYWRkIG51aXNhbmNlIHBhcmFtZXRlcnMgb3Igbm90LCBzdWNoIGFzIHRoZSByZXNpZHVhbCB2YXJpYW5jZSBwYXJhbWV0ZXIgKGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgcmVzaWR1YWwgdmFyaWFuY2UsIHJhdGhlciB0aGFuIGFuIGV4cGxpY2l0IHBhcmFtZXRlciBpbiB0aGUgb3B0aW1pemF0aW9uKSBpcyBhcyBmYXIgYXMgSSBrbm93IGFuIG9wZW4gcXVlc3Rpb24uICBJbiB0aGUgY2xhc3NpYyBBSUMgY29udGV4dCBpdCBkb2Vzbid0IG1hdHRlciBhcyBsb25nIGFzIG9uZSBpcyBjb25zaXN0ZW50LiAgSW4gdGhlIEFJQ2MgY29udGV4dCwgSSBkb24ndCB0aGluayBhbnlvbmUgcmVhbGx5IGtub3dzIHRoZSBhbnN3ZXIgLi4uIGFkZGluZyArMSBmb3IgdGhlIHJlc2lkdWFsIHZhcmlhbmNlIHBhcmFtZXRlciAoYXMgbG1lNCBkb2VzKSB3b3VsZCBtYWtlIHRoZSBtb2RlbCBzZWxlY3Rpb24gcHJvY2VzcyBzbGlnaHRseSBtb3JlIGNvbnNlcnZhdGl2ZS4KCiMgTW9kZWwgc3VtbWFyaWVzIChnb29kbmVzcy1vZi1maXQsIGRlY29tcG9zaXRpb24gb2YgdmFyaWFuY2UsIGV0Yy4pCgojIyBIb3cgZG8gSSBjb21wdXRlIGEgY29lZmZpY2llbnQgb2YgZGV0ZXJtaW5hdGlvbiAoJFJeMiQpLCBvciBhbiBhbmFsb2d1ZSwgZm9yIChHKUxNTXM/CgojIyMgUHJvYmxlbQoKKCpUaGlzIHRvcGljIGFwcGxpZXMgdG8gYm90aCBMTU1zIGFuZCBHTE1NcywgcGVyaGFwcyBtb3JlIHNvIHRvIExNTXMsIGJlY2F1c2UgdGhlIGlzc3VlcyBhcmUgZXZlbiBoYXJkZXIgZm9yIEdMTU1zLiopCgpSZXNlYXJjaGVycyBvZnRlbiB3YW50IHRvIGtub3cgaWYgdGhlcmUgaXMgYSBzaW1wbGUgKG9yIGF0IGxlYXN0IGltcGxlbWVudGVkLWluLVIpIHdheSB0byBnZXQgYW4gYW5hbG9ndWUgb2YgJFJeMiQgb3IgYW5vdGhlciBzaW1wbGUgZ29vZG5lc3Mtb2YtZml0IG1ldHJpYyBmb3IgTE1NcyBvciBHTE1Ncy4gVGhpcyBpcyBhIGNoYWxsZW5naW5nIHF1ZXN0aW9uIGluIGJvdGggdGhlIEdMTSBhbmQgTE1NIHdvcmxkcyAoYW5kIHRoZXJlZm9yZSBkb3VibHkgc28gZm9yIEdMTU1zKSwgYmVjYXVzZSBpdCB0dXJucyBvdXQgdGhhdCB0aGUgd29uZGVyZnVsIHNpbXBsaWNpdHkgb2YgJFJeMiQgYnJlYWtzIGRvd24gaW4gdGhlIGV4dGVuc2lvbiB0byBHTE1zIG9yIExNTXMuIElmIHlvdSdyZSB0cnlpbmcgdG8gcXVhbnRpZnkgImZyYWN0aW9uIG9mIHZhcmlhbmNlIGV4cGxhaW5lZCIgaW4gdGhlIEdMTSBjb250ZXh0LCBzaG91bGQgeW91IGluY2x1ZGUgb3IgZXhjbHVkZSBzYW1wbGluZyB2YXJpYXRpb24gKGUuZy4sIFBvaXNzb24gdmFyaWF0aW9uIGFyb3VuZCB0aGUgZXhwZWN0ZWQgbWVhbik/IFtBY2NvcmRpbmcgdG8gYW4gYHNvczo6ZmluZEZuYCBzZWFyY2ggZm9yICJOYWdlbGtlcmtlIiwgb25lIG9mIHRoZSBjb21tb24gc29sdXRpb25zIHRvIHRoaXMgcHJvYmxlbSwgdGhlIGBMb2dSZWdSMmAgZnVuY3Rpb24gaW4gdGhlIGBkZXNjcmAgcGFja2FnZSBjb21wdXRlcyBzZXZlcmFsIGRpZmZlcmVudCAicHNldWRvLSRSXjIkIiBtZWFzdXJlcyBmb3IgbG9naXN0aWMgcmVncmVzc2lvbi5dICBJZiB5b3UncmUgdHJ5aW5nIHRvIHF1YW50aWZ5IGl0IGluIHRoZSBMTU0gY29udGV4dCwgc2hvdWxkIHlvdSBpbmNsdWRlIG9yIGV4Y2x1ZGUgdmFyaWF0aW9uIG9mIGRpZmZlcmVudCByYW5kb20tZWZmZWN0cyB0ZXJtcz8KClRoZSBzYW1lIHF1ZXN0aW9ucyBhcHBseSBtb3JlIGdlbmVyYWxseSB0byBkZWNvbXBvc2l0aW9uIG9mIHZhcmlhbmNlIChpLmUuIHRyeWluZyB0byBhc3Nlc3MgdGhlIGNvbnRyaWJ1dGlvbiBvZiB2YXJpb3VzIG1vZGVsIGNvbXBvbmVudHMgdG8gdGhlIG92ZXJhbGwgZml0LCBub3QganVzdCB0cnlpbmcgdG8gYXNzZXNzIHRoZSBvdmVyYWxsIGdvb2RuZXNzLW9mLWZpdCBvZiB0aGUgbW9kZWwpOyB0aGVyZSBpcyB1bmxpa2VseSB0byBiZSBhIHNpbmdsZSByZWNpcGUgdGhhdCBkb2VzIGV2ZXJ5dGhpbmcgeW91IHdhbnQuCgpUaGlzIGhhcyBiZWVuIGRpc2N1c3NlZCBhdCB2YXJpb3VzIHRpbWVzIG9uIHRoZSBtYWlsaW5nIGxpc3RzLiBbVGhpcyB0aHJlYWRdKGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAubGFuZy5yLmxtZTQuZGV2ZWwvMzI4MSkgYW5kIFt0aGlzIHRocmVhZF0oaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5sYW5nLnIubG1lNC5kZXZlbC82ODQpIG9uIHRoZSByLXNpZy1taXhlZC1tb2RlbHMgIG1haWxpbmcgbGlzdCBhcmUgZ29vZCBzdGFydGluZyBwb2ludHMsIGFuZCBbdGhpcyBwb3N0XShodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxhbmcuci5sbWU0LmRldmVsLzIxNDMpIGlzIHVzZWZ1bCB0b28uCgpJbiBvbmUgb2YgdGhvc2UgdGhyZWFkcywgRG91ZyBCYXRlcyBzYWlkOgoKPiBBc3N1bWluZyB0aGF0IG9uZSB3YW50cyB0byBkZWZpbmUgYW4gUl4yIG1lYXN1cmUsIEkgdGhpbmsgYW4KPiBhcmd1bWVudCBjb3VsZCBiZSBtYWRlIGZvciB0cmVhdGluZyB0aGUgcGVuYWxpemVkIHJlc2lkdWFsIHN1bSBvZgo+IHNxdWFyZXMgZnJvbSBhIGxpbmVhciBtaXhlZCBtb2RlbCBpbiB0aGUgc2FtZSB3YXkgdGhhdCB3ZSBjb25zaWRlciB0aGUKPiByZXNpZHVhbCBzdW0gb2Ygc3F1YXJlcyBmcm9tIGEgbGluZWFyIG1vZGVsLiAgT3Igb25lIGNvdWxkIHVzZSBqdXN0Cj4gdGhlIHJlc2lkdWFsIHN1bSBvZiBzcXVhcmVzIHdpdGhvdXQgdGhlIHBlbmFsdHkgb3IgdGhlIG1pbmltdW0KPiByZXNpZHVhbCBzdW0gb2Ygc3F1YXJlcyBvYnRhaW5hYmxlIGZyb20gYSBnaXZlbiBzZXQgb2YgdGVybXMsIHdoaWNoCj4gY29ycmVzcG9uZHMgdG8gYW4gaW5maW5pdGUgcHJlY2lzaW9uIG1hdHJpeC4gIEkgZG9uJ3Qga25vdywgcmVhbGx5Lgo+IEl0IGRlcGVuZHMgb24gd2hhdCB5b3UgYXJlIHRyeWluZyB0byBjaGFyYWN0ZXJpemUuCgojIyMgU2ltcGxlL2NydWRlIHNvbHV0aW9ucwoKSW4gb25lIG9mIHRob3NlIHRocmVhZHMsIEphcnJldHQgQnlybmVzIGNvbnRyaWJ1dGVkIHRoZSBmb2xsb3dpbmcgY29kZToKYGBge3IgcjJjb3JyfQpyMi5jb3JyLm1lciA8LSBmdW5jdGlvbihtKSB7CiAgIGxtZml0IDwtICBsbShtb2RlbC5yZXNwb25zZShtb2RlbC5mcmFtZShtKSkgfiBmaXR0ZWQobSkpCiAgIHN1bW1hcnkobG1maXQpJHIuc3F1YXJlZAp9CmBgYAoKJFxPbWVnYV4yXzAkIFtAeHVfbWVhc3VyaW5nXzIwMDNdLCB3aGljaCBpcyBhbG1vc3QgdGhlIHNhbWUsIGlzIGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgcmVzaWR1YWwgdmFyaWFuY2Ugb2YgdGhlIGZ1bGwgbW9kZWwgYWdhaW5zdCB0aGUgcmVzaWR1YWwgdmFyaWFuY2Ugb2YgYSAoZml4ZWQpIGludGVyY2VwdC1vbmx5IG51bGwgbW9kZWw6IAoKYGBge3IgcmVzdmFyLGV2YWw9RkFMU0V9CjEtdmFyKHJlc2lkdWFscyhtKSkvdmFyKG1vZGVsLnJlc3BvbnNlKG1vZGVsLmZyYW1lKG0pKSkKYGBgCgpBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRoZSBzcXVhcmVkIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGFuZCB0aGUgcHJlZGljdGVkIHZhbHVlczoKCmBgYHtyIHJlc2NvcnNxLCBldmFsPUZBTFNFfQpjb3IobW9kZWwucmVzcG9uc2UobW9kZWwuZnJhbWUobSkpLHByZWRpY3QobSx0eXBlPSJyZXNwb25zZSIpKV4yCmBgYAoKIyMjIFNvcGhpc3RpY2F0ZWQgc29sdXRpb25zCgpAZ2VsbWFuX2JheWVzaWFuXzIwMDYgcHJvcG9zZS9kaXNjdXNzIEJheWVzaWFuIG1lYXN1cmVzIG9mICRSXjIkIChJIGRvbid0IGtub3cgaWYgYW55b25lIGhhcyBjcmVhdGVkIGEgY2FubmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1lYXN1cmVzIGluIFIpLgpAbmFrYWdhd2FfZ2VuZXJhbF8yMDEzIGFuZCBAam9obnNvbl9leHRlbnNpb25fMjAxNCBoYXZlIGFsc28gcHJvcG9zZWQgYSBnZW5lcmFsIG1ldGhvZG9sb2d5IGZvciBjb21wdXRpbmcgJFJeMiQ7IEouIExlZmNoZWNrIGdpdmVzIGV4YW1wbGVzIFtoZXJlXShodHRwczovL2pvbmxlZmNoZWNrLm5ldC8yMDEzLzAzLzEzL3IyLWZvci1saW5lYXItbWl4ZWQtZWZmZWN0cy1tb2RlbHMvKSBhbmQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qc2xlZmNoZS9waWVjZXdpc2VTRU0vYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI2dldC1yMi1mb3ItaW5kaXZpZHVhbC1tb2RlbHMpLCBiYXNlZCBvbiBoaXMgaW1wbGVtZW50YXRpb24gaW4gdGhlIGBwaWVjZXdpc2VTRU1gIHBhY2thZ2UgKFtDUkFOXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcGllY2V3aXNlU0VNL2luZGV4Lmh0bWwpLCBbR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20vanNsZWZjaGUvcGllY2V3aXNlU0VNKSkuIFNlZSBhbHNvIEBqYWVnZXJfcjJfMjAxNywgQHJpZ2h0c19xdWFudGlmeWluZ18yMDE4IC4uLgoKQSByZWxhdGVkIHF1ZXN0aW9uIGlzIGhvdyB0byBxdWFudGlmeSAicmVwZWF0YWJpbGl0eSIgKGkuZS4sIHJhdGlvcyBvZiB2YXJpYW5jZSBhdCBkaWZmZXJlbnQgbGV2ZWxzKSBpbiBHTE1NcywgZXNwZWNpYWxseSBob3cgdG8gY29tcHV0ZSB0aGUgInJlc2lkdWFsIGVycm9yIiB0ZXJtIGZvciBHTE1Nczogc2VlIEBuYWthZ2F3YV9yZXBlYXRhYmlsaXR5XzIwMTAgYW5kIHRoZSBbcnB0UiBwYWNrYWdlXShodHRwOi8vcnB0ci5yLWZvcmdlLnItcHJvamVjdC5vcmcvKS4KClRoZSBib3R0b20gbGluZSBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIHNpbXBsZSByZWNpcGVzIChhbmQgc29tZSBtb3JlIGNvbXBsZXggcmVjaXBlcyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBjb2RlZCB1cCBieSBzb21lb25lKSwgYnV0IHRoYXQgJycneW91IGhhdmUgdG8gdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoYXQgaW5mb3JtYXRpb24geW91IHdhbnQgdG8gZ2V0IG91dCBvZiB0aGUgY29lZmZpY2llbnQgb2YgZGV0ZXJtaW5hdGlvbicnJywgYmVjYXVzZSBubyByZWNpcGUgd2lsbCBoYXZlIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiAkUl4yJCBpbiB0aGUgc2ltcGxlIGxpbmVhciBtb2RlbCBjYXNlLgoKKipQYWNrYWdlcy9mdW5jdGlvbnMqKjogU2VlIFtgcGVyZm9ybWFuY2U6OnIyKClgXShodHRwczovL2Vhc3lzdGF0cy5naXRodWIuaW8vcGVyZm9ybWFuY2UvcmVmZXJlbmNlL3IyLmh0bWwpLCBgTXVNSW46OnIuc3F1YXJlZEdMTU0oKWAsIHRoZSBbYHIyZ2xtbWAgcGFja2FnZV0oaHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1yMmdsbW0pLCB0aGUgc3RhbmRhbG9uZSBbcjJNTE0gZnVuY3Rpb25dKGh0dHBzOi8vbXkudmFuZGVyYmlsdC5lZHUvamFzb25yaWdodHMvc29mdHdhcmUvcjJNTE0pLCBzdHVmZiBpbiB0aGUgYHBpZWNld2lzZVNFTWAgcGFja2FnZSwgW2Bwc3ljaG86OlIyX25ha2FnYXdhYF0oaHR0cDovL2ZpbnppLnBzeWNoLnVwZW5uLmVkdS9SL2xpYnJhcnkvcHN5Y2hvL2h0bWwvUjJfbmFrYWdhd2EuaHRtbCksIFtwYXJ0UjJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXN0b2ZmZWwvcGFydFIyKSBwYWNrYWdlIC4uLiAodHJ5IGUuZy4gYHNvczo6ZmluZEZuKCJOYWthZ2F3YSBTY2hpZWx6ZXRoIilgIGZvciBhbiB1cC10by1kYXRlIGxpc3QgLi4uKQoKIyMgVmFyaWFibGUgaW1wb3J0YW5jZQoKLSBUaGUgc2ltcGxlc3Qgd2F5IHRvIGdldCAod2l0aGluLXN0dWR5KSBtZWFzdXJlcyBvZiB2YXJpYWJsZSBpbXBvcnRhbmNlIGlzIHRvIHN0YW5kYXJkaXplIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIChzY2FsaW5nIGJ5IDEgU0Qgb3IgMlNEOiBAZ2VsbWFuX3NjYWxpbmdfMjAwOCwgQHNjaGllbHpldGhfc2ltcGxlXzIwMTApCi0gVGhlIGByMmdsbW1gIHBhY2thZ2UgY29tcHV0ZXMgcGFydGlhbCAkUl4yJCB2YWx1ZXMgZm9yIGZpeGVkIGVmZmVjdHMgKG9ubHkgZm9yIGBsbWVyYCwgYGxtZWAsIGFuZCBgZ2xtbVBRTGAgbW9kZWxzKQotIEhlbnJpayBTaW5nbWFubiBoYXMgYSBkZXRhaWxlZCBhbnN3ZXIgW2hlcmVdKGh0dHBzOi8vYWZleC5zaW5nbWFubi5zY2llbmNlL2ZvcnVtcy90b3BpYy9jb21wdXRlLWVmZmVjdC1zaXplcy1mb3ItbWl4ZWQtb2JqZWN0cykgb24gd2h5IHN0YW5kYXJkaXplZCBtZWFzdXJlcyBzdWNoIGFzIHBhcnRpYWwgZXRhLXNxdWFyZWQgYXJlIHByb2JsZW1hdGljOgoKICAgID4gVGhlIGZhY3QgdGhhdCBjYWxjdWxhdGluZyBhIGdsb2JhbCBtZWFzdXJlIG9mIG1vZGVsIGZpdCAoc3VjaCBhcyBSMikgaXMgYWxyZWFkeSByaWRkbGVkIHdpdGggY29tcGxpY2F0aW9ucyBhbmQgdGhhdCBubyBzaW1wbGUgc2luZ2xlIG51bWJlciBjYW4gYmUgZm91bmQsIHNob3VsZCBiZSBhIGhpbnQgdGhhdCBkb2luZyBzbyBmb3IgYSBzdWJzZXQgb2YgdGhlIG1vZGVsIHBhcmFtZXRlcnMgKGkuZS4sIG1haW4tZWZmZWN0cyBvciBpbnRlcmFjdGlvbnMpIGlzIGV2ZW4gbW9yZSBkaWZmaWN1bHQuIEdpdmVuIHRoaXMsIEkgd291bGQgbm90IHJlY29tbWVuZCB0byB0cnkgZmluZGluZyBhIG1lYXN1cmUgb2Ygc3RhbmRhcmRpemVkIGVmZmVjdCBzaXplcyBmb3IgbWl4ZWQgbW9kZWxzLgoKICAgIEhlIGV2ZW4gZ2l2ZXMgc3VnZ2VzdGVkIHdvcmRpbmcgZm9yIHJlc3BvbmRpbmcgdG8gcmV2aWV3ZXJzIHdobyB3YW50IHN0YW5kYXJkaXplZCBtZWFzdXJlcyEKCiMjIERvIEkgaGF2ZSB0byBzcGVjaWZ5IHRoZSBsZXZlbHMgb2YgZml4ZWQgZWZmZWN0cyBpbiBsbWVyPwoKTm8uIFNlZSBEb3VnIEJhdGVzIHJlcGx5IHRvIHRoaXMgcXVlc3Rpb24gW2hlcmVdKGh0dHA6Ly9yLjc4OTY5NS5uNC5uYWJibGUuY29tL2xtZTQtYW5kLVZhcmlhYmxlLWxldmVsLWRldGVjdGlvbi10ZDg4MTY4MC5odG1sKQoKIyBNaXNjZWxsYW5lb3VzL3Byb2NlZHVyYWwKCiMjIFByb251bmNpYXRpb24gb2YgYGxtZXJgL2BnbG1lcmAvZXRjLgoKLSBgbG1lcmA6IEkgaGF2ZSBoZWFyZCAiZWxsIGVtbSBlZSBhcnIiIChpLmUuIHByb25vdW5jaW5nIGVhY2ggbGV0dGVyKTsgImVsbWVyIiAocHJvYmFibHkgbW9zdCBjb21tb24pOyBhbmQgImxlbXVyIgotIGBnbG1lcmA6ICJnZWUgZWxsIGVtbSBlZSBhcnIiLCAiZ2VlIGVsbWVyIiwgImdsaW1tZXIiLCBvciAiZ2xlYW1lciIKLSBmb3IgYGxtZWAgYW5kIGBubG1lYCBwZW9wbGUganVzdCBzZWVtIHRvIHNwZWxsIG91dCB0aGUgbmFtZXMgKHJhdGhlciB0aGFuIHNheWluZyBlLmcuICJsZW1teSIgYW5kICJuZWxteSIpCgojIyBTdG9yaW5nIGluZm9ybWF0aW9uCgpSZWNlbnQgdmVyc2lvbnMgb2YgYGxtZTRgIG91dHB1dCBjb250YWluIGFuIGBAb3B0aW5mb2Agc2xvdCB0aGF0IHN0b3JlcyB3YXJuaW5ncy4KCkNvcGllZCBmcm9tIGh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLWhlbHAvMjAxMi1GZWJydWFyeS8zMDI3NjcuaHRtbCA6Cgo+IFRoZXJlJ3MgYSBzb21ld2hhdCBoYWNrLWlzaCBzb2x1dGlvbiwgd2hpY2ggaXMgdG8gdXNlIG9wdGlvbnMod2Fybj0yKSB0byAndXBncmFkZScgd2FybmluZ3MgdG8gZXJyb3JzLCBhbmQgdGhlbiB1c2UgdHJ5KCkgb3IgdHJ5Q2F0Y2goKSB0byBjYXRjaCB0aGVtLgoKPiBNb3JlIGZhbmNpbHksIEkgdXNlZCBjb2RlIHRoYXQgbG9va2VkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gc2F2ZSB3YXJuaW5ncyBhcyBJIHdlbnQgYWxvbmcgKHNvcnJ5IGFib3V0IHRoZSA8PC0gKSBpbiBhIHJlY2VudCBzaW11bGF0aW9uIHN0dWR5LiAgWW91IGNvdWxkIGFsc28gY2hlY2sgdyRtZXNzYWdlIHRvIGRvIGRpZmZlcmVudCB0aGluZ3MgaW4gdGhlIGNhc2Ugb2YgZGlmZmVyZW50IHdhcm5pbmdzLgoKYGBge3IgY2F0Y2hfZXJyb3JzLGV2YWw9RkFMU0V9CiMjIG4uYi4gaGF2ZSB0byBzZXQgdXAgYSAzRCB3YXJuIGFycmF5IGZpcnN0IC4uLgp3aXRoQ2FsbGluZ0hhbmRsZXJzKHRyeUNhdGNoKGZ1bihuPW52ZWNbal0sdGF1PXRhdXZlY1tpXSwuLi4pLAogICAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgIHdhcm5bayxpLGpdIDw8LSBwYXN0ZSgiRVJST1I6IixlJG1lc3NhZ2UpCiAgICAgICAgICAgICAgTkFfYW5zfSksCiAgICAgICAgICAgICAgIHdhcm5pbmcgPSBmdW5jdGlvbih3KSB7CiAgICAgICAgICAgICAgICAgIHdhcm5bayxpLGpdIDw8LSB3JG1lc3NhZ2UKICAgICAgICAgICAgICAgICAgaW52b2tlUmVzdGFydCgibXVmZmxlV2FybmluZyIpCiAgICAgICAgICAgICB9KQpgYGAKCiMgTWl4ZWQgbW9kZWxpbmcgcGFja2FnZXMgCgotIGFsc28gc2VlIHRoZSBbcGFja2FnZSBjb21wYXJpc29uXShodHRwOi8vZ2xtbS53aWtpZG90LmNvbS9wa2ctY29tcGFyaXNvbikgb24gYGdsbW0ud2lraWRvdC5jb21gCgojIyBXaGljaCBSIHBhY2thZ2VzIChmdW5jdGlvbnMpIGZpdCBHTE1Ncz8KCi0gTUFTUzo6Z2xtbVBRTCAocGVuYWxpemVkIHF1YXNpLWxpa2VsaWhvb2QpCi0gbG1lNDo6Z2xtZXIgKExhcGxhY2UgYXBwcm94aW1hdGlvbiBhbmQgYWRhcHRpdmUgR2F1c3MtSGVybWl0ZSBxdWFkcmF0dXJlIFtBR0hRXSkKLSBNQ01DZ2xtbSAoTWFya292IGNoYWluIE1vbnRlIENhcmxvKQotIGdsbW1NTCAoQUdIUSkKLSBnbG1tQUsgKEFHSFE/KQotIGdsbW1BRE1CIChMYXBsYWNlKQotIGdsbW0gKGZyb20gSmltIExpbmRzZXkncyBgcmVwZWF0ZWRgIHBhY2thZ2U6IEFHSFEpCi0gZ2FtbHNzLm14Ci0gQVNSRU1MLVIKLSBzYWJyZVIKCiMjIFNob3VsZCBJIHVzZSBgYW92KClgLCBgbmxtZWAsIG9yIGBsbWU0YCwgb3Igc29tZSBvdGhlciBwYWNrYWdlPwoKLSBgYW92KClgIChpbiB0aGUgYHN0YXRzYCBwYWNrYWdlIGluIGJhc2UgUjogYmFsYW5jZWQsIG9ydGhvZ29uYWwgZGVzaWducyBvbmx5IChSIGFuYWxvZ3VlIG9mIFNBUyBQUk9DIEdMTSkKLSBgbmxtZWAgKGFuYWxvZ3VlIG9mIFNBUyBgUFJPQyBNSVhFRGAvYE5MTUlYRURgKQogICAgLSBhbGxvd3MgbW9yZSBjb21wbGV4IGRlc2lnbnMgdGhhbiBgYW92YCAodW5iYWxhbmNlZCwgaGV0ZXJvc2NlZGFzdGljaXR5IGFuZC9vciBjb3JyZWxhdGlvbiBhbW9uZyByZXNpZHVhbCBlcnJvcnMpCiAgICAtIG1vcmUgbWF0dXJlIHRoYW4gYGxtZTRgCiAgICAtIHdlbGwtZG9jdW1lbnRlZCBbQHBpbmhlaXJvX21peGVkLWVmZmVjdHNfMjAwMF0KICAgIC0gaW1wbGVtZW50cyBSLXNpZGUgZWZmZWN0cyAoaGV0ZXJvc2NlZGFzdGljaXR5IGFuZCBjb3JyZWxhdGlvbikKICAgIC0gZXN0aW1hdGVzICJkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20iIGZvciAkRiQgc3RhdGlzdGljcywgYW5kIGhlbmNlICRwJCB2YWx1ZXMsIGZvciBMTU1zIChidXQgc2VlIGFib3ZlKQotIGBsbWU0YCAoYWxzbyBTQVMgYFBST0MgTUlYRURgL2BOTE1JWEVEYCk6IAogICAgLSBmYXN0ZXN0CiAgICAtIGJlc3QgZm9yIGNyb3NzZWQgZGVzaWducyAoYWx0aG91Z2ggdGhleSBhcmUgcG9zc2libGUgaW4gYGxtZWApCiAgICAtIEdMTU1zCiAgICAtIGN1dHRpbmctZWRnZSAoZm9yIGJldHRlciBvciB3b3JzZSEpCiAgICAtIGxpa2VsaWhvb2QgcHJvZmlsZXMKICAgIC0gdXNlIGBsbWU0YCBmb3IgR0xNTXMsIG9yIGlmIHlvdSBoYXZlIGJpZyBkYXRhICh0aG91c2FuZHMgdG8gdGVucyBvZiB0aG91c2FuZHMgb2YgcmVjb3JkcykKClRoZSBmb2xsb3dpbmcgaXMgbW9kaWZpZWQgZnJvbSBhIGNvbnRyaWJ1dGlvbiBieSBLaW5nc2ZvcmQgSm9uZXMsIGZvdW5kIDIwMTAtMDMtMTYKCiMjIyBsaW5lYXIgYW5kIG5vbmxpbmVhciBtaXhlZCBtb2RlbHMKCi0gW2xtZV0oaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbG1lNC9pbmRleC5odG1sKSAtLSBMaW5lYXIgbWl4ZWQtZWZmZWN0cyBtb2RlbHMgdXNpbmcgUzQgY2xhc3NlcwotIGBsbW1gIC0tIExpbmVhciBtaXhlZCBtb2RlbHMKLSBgbmxtZWAgLS0gTGluZWFyIGFuZCBOb25saW5lYXIgTWl4ZWQgRWZmZWN0cyBNb2RlbHMKLSBgc2FicmVSYAotIFtyZWdyZXNzXShodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9yZWdyZXNzL2luZGV4Lmh0bWwpIExpbmVhciBtaXhlZCBtb2RlbHMKCiMjIyBHTE1NcwotIGdsbW1BSyAtLSBHZW5lcmFsaXplZCBMaW5lYXIgTWl4ZWQgTW9kZWxzCi0gTUFTUyAtLSBNYWluIFBhY2thZ2Ugb2YgVmVuYWJsZXMgYW5kIFJpcGxleSdzIE1BU1MgKHNlZSBmdW5jdGlvbiBnbG1tUFFMKQotIE1DTUNnbG1tIC0tIE1DTUMgR2VuZXJhbGlzZWQgTGluZWFyIE1peGVkIE1vZGVscwotIGxtZTQgKGdsbWVyKQotIGdsbW1NTAotIGdhbWxzcy5teAotIHNhYnJlUgogCiMjIyBBZGRpdGl2ZSBhbmQgZ2VuZXJhbGl6ZWQtYWRkaXRpdmUgbWl4ZWQgbW9kZWxzCi0gYW1lciAtLSBBZGRpdGl2ZSBtaXhlZCBtb2RlbHMgd2l0aCBsbWU0Ci0gZ2FtbTQgLS0gR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzIHVzaW5nIG1nY3YgYW5kIGxtZTQKLSBtZ2N2IChnYW1tIGZ1bmN0aW9uLCB2aWEgZ2xtbVBRTCBpbiBNQVNTIHBhY2thZ2UpCi0gZ2FtbHNzLm14CgojIyMgSGllcmFyY2hpY2FsIEdMTXMKLSBoZ2xtIC0tIGhnbG0gaXMgdXNlZCB0byBmaXQgaGllcmFyY2hpY2FsIGdlbmVyYWxpemVkIGxpbmVhciBtb2RlbHMKLSBIR0xNTU0gLS0gSGllcmFyY2hpY2FsIEdlbmVyYWxpemVkIExpbmVhciBNb2RlbHMKCiMjIyBkaWFnbm9zdGljIGFuZCBtb2RlbGluZyBmcmFtZXdvcmtzCi0gaW5mbHVlbmNlLk1FIC0tIFRvb2xzIGZvciBkZXRlY3RpbmcgaW5mbHVlbnRpYWwgZGF0YSBpbiBtaXhlZCBlZmZlY3RzIG1vZGVscwotIGFybSAtLSBEYXRhIEFuYWx5c2lzIFVzaW5nIFJlZ3Jlc3Npb24gYW5kIE11bHRpbGV2ZWwvSGllcmFyY2hpY2FsIE1vZGVscwotIHBhbW0gLS0gUG93ZXIgYW5hbHlzaXMgZm9yIHJhbmRvbSBlZmZlY3RzIGluIG1peGVkIG1vZGVscwotIFJMUnNpbSAtLSBFeGFjdCAoUmVzdHJpY3RlZCkgTGlrZWxpaG9vZCBSYXRpbyB0ZXN0cyBmb3IgbWl4ZWQgYW5kIGFkZGl0aXZlIG1vZGVscwotIG5wZGUgLS0gTm9ybWFsaXNlZCBwcmVkaWN0aW9uIGRpc3RyaWJ1dGlvbiBlcnJvcnMgZm9yIG5vbmxpbmVhciBtaXhlZC1lZmZlY3QgbW9kZWxzCi0gbXVsdGlsZXZlbCAtLSBNdWx0aWxldmVsIEZ1bmN0aW9ucyAocHN5Y2hvbG9neS1vcmllbnRlZDsgd2l0aGluLWdyb3VwIGFncmVlbWVudCwgcmFuZG9tIGdyb3VwIHJlc2FtcGxpbmcsIGV0Yy4pCi0gbGFuZ3VhZ2VSCi0gcGJrcnRlc3QgLS0gcGFyYW1ldHJpYyBib290c3RyYXAgYW5kIEtlbndhcmQtUm9nZXIgdGVzdHMKCiMjIyBkYXRhIGFuZCBleGFtcGxlcwotIE1FTVNTIC0tIERhdGEgc2V0cyBmcm9tIE1peGVkLWVmZmVjdHMgTW9kZWxzIGluIFMKLSBtbG1SZXYgLS0gRXhhbXBsZXMgZnJvbSBNdWx0aWxldmVsIE1vZGVsbGluZyBTb2Z0d2FyZSBSZXZpZXcKLSBTQVNtaXhlZCAtLSBEYXRhIHNldHMgZnJvbSAiU0FTIFN5c3RlbSBmb3IgTWl4ZWQgTW9kZWxzIgoKIyMjIGV4dGVuc2lvbnMKLSBsbWVTcGxpbmVzIC0tIGxtZVNwbGluZXMKLSBsbWVjIC0tIExpbmVhciBNaXhlZC1FZmZlY3RzIE1vZGVscyB3aXRoIENlbnNvcmVkIFJlc3BvbnNlcwotIGtpbnNoaXAgLS0gbWl4ZWQtZWZmZWN0cyBDb3ggbW9kZWxzLCBzcGFyc2UgbWF0cmljZXMsIGFuZCBtb2RlbGluZyBkYXRhIGZyb20gbGFyZ2UgcGVkaWdyZWVzCi0gY294bWUgLS0gTWl4ZWQgRWZmZWN0cyBDb3ggTW9kZWxzCi0gb3JkaW5hbCAtLSBSZWdyZXNzaW9uIE1vZGVscyBmb3IgT3JkaW5hbCBEYXRhCi0gcGhtbSAtLSBQcm9wb3J0aW9uYWwgSGF6YXJkcyBNaXhlZC1lZmZlY3RzIE1vZGVsIChQSE1NKQotIHBlZGlncmVlbW0gLS0gUGVkaWdyZWUtYmFzZWQgbWl4ZWQtZWZmZWN0cyBtb2RlbHMKLSAoc2VlIGFsc28gTUNNQ2dsbW0gZm9yIHBlZGlncmVlLWJhc2VkIGFwcHJvYWNoZXMpCi0gaGVhdnkgLS0gRXN0aW1hdGlvbiBpbiB0aGUgbGluZWFyIG1peGVkIG1vZGVsIHVzaW5nIGhlYXZ5LXRhaWxlZCBkaXN0cmlidXRpb25zCi0gR0xNTWFycCAtLSBHZW5lcmFsaXplZCBMaW5lYXIgTXVsdGlsZXZlbCBNb2RlbCB3aXRoIEFSKHApIEVycm9ycyBQYWNrYWdlCi0gZ2xtbWxhc3NvIC0tIHBlbmFsaXplZCBHTE1NIGZpdHRpbmcKLSBzcGF0aWFsQ292YXJpYW5jZSAtLSBzcGF0aWFsIGNvdmFyaWFuY2UgbWF0cml4IGNhbGN1bGF0aW9ucwoKIyMjIEludGVyZmFjZXMgdG8gb3RoZXIgc3lzdGVtcwotIGdsbW1CVUdTIC0tIEdlbmVyYWxpc2VkIExpbmVhciBNaXhlZCBNb2RlbHMgYW5kIFNwYXRpYWwgTW9kZWxzIHdpdGggQlVHUwotIEludGVyZmFjZXMgdG8gV2luQlVHUy9PcGVuQlVHUy9KQUdTIChyb2xsIHlvdXIgb3duIG1vZGVsIGZpbGUpOgogKiBSMldpbkJVR1MKICogcjJqYWdzCiAqIHJqYWdzCiAqIFJCdWdzCgojIyMgbW9kZWxpbmcgYmFzZWQgb24gTE1NcwoKLSBgbmxtZU9ERWAgLS0gTm9uLWxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsbGluZyBpbiBubG1lIHVzaW5nIGRpZmZlcmVudGlhbCBlcXVhdGlvbnMKLSBgbG9uZ1JQYXJ0YCAtLSBSZWN1cnNpdmUgcGFydGl0aW9uaW5nIG9mIGxvbmdpdHVkaW5hbCBkYXRhIHVzaW5nIG1peGVkLWVmZmVjdHMgbW9kZWxzCi0gYFBTTWAgLS0gTm9uLUxpbmVhciBNaXhlZC1FZmZlY3RzIG1vZGVsbGluZyB1c2luZyBTdG9jaGFzdGljIERpZmZlcmVudGlhbCBFcXVhdGlvbnMKCiMjIE9mZi1DUkFOIG1peGVkIG1vZGVsaW5nIHBhY2thZ2VzOgoKIyMjIFItZm9yZ2UgYW5kIEdpdGh1YjoKCi0gYGdsbW1BRE1CYCAoUi1mb3JnZSwgaW50ZXJmYWNlIHRvIEFEIE1vZGVsIEJ1aWxkZXIpCi0gYHNwaWRhYCwgYHAzZGAgKEdlb3JnZXMgTW9uZXR0ZSkKCiMjIyBPdGhlciBvcGVuIHNvdXJjZToKLSBbYmVybm9yXShodHRwOi8vd3d3LnN0YXQudW1uLmVkdS9nZXllci9iZXJub3IvIGJlcm5vcikgcGFja2FnZSAobG9naXQtbm9ybWFsIGZpdHRpbmcpLCBieSBZdW4gSnUgU3VuZyBhbmQgQ2hhcmxlcyBKLiBHZXllcgotIGBnbG1tYCAoaW4gSmltIExpbmRzZXkncyBgcmVwZWF0ZWRgIHBhY2thZ2U6IGF0IFtMaW5kc2V5J3Mgd2ViIHNpdGVdKGh0dHA6Ly93d3cuY29tbWFuc3Rlci5ldS9yY29kZS5odG1sKQoKCiMjIyBDb21tZXJjaWFsOgotIGBPcGVuTXhgIC0tIEFkdmFuY2VkIFN0cnVjdHVyYWwgRXF1YXRpb24gTW9kZWxpbmcKLSBgQVNSZW1sLVJgIChjb21tZXJjaWFsLCBidXQgMzAgZGF5cycgZnJlZSB1c2UvZnJlZSBsaWNlbnNlIGZvciBhY2FkZW1pYyBvciBkZXZlbG9waW5nLWNvdW50cnkgdXNlIGF2YWlsYWJsZSkuICBWZXJ5IGdvb2QgYXQgY29tcGxleCBMTU1zIChmYXN0LCBmbGV4aWJsZSBjb3ZhcmlhbmNlIHN0cnVjdHVyZXMsIGV0Yy4pLCBidXQgb25seSBvZmZlcnMgUFFMIGZvciBHTE1NcywgYW5kIHRoZSBtYW51YWwgc2F5czogCj4gd2UgY2Fubm90IHJlY29tbWVuZCB0aGUgdXNlIG9mIHRoaXMgdGVjaG5pcXVlIGZvciBnZW5lcmFsIHVzZS4gSXQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBhc3JlbWwoKSBmb3IgYWR2YW5jZWQgdXNlcnMuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IGl0cyB1c2UgYmUgYWNjb21wYW5pZWQgYnkgc29tZSBmb3JtIG9mIGNyb3NzLXZhbGlkYXRvcnkgYXNzZXNzbWVudCBmb3IgdGhlIHNwZWNpZmljIGRhdGFzZXQgY29uY2VybmVkLiIKUmVzb3VyY2VzOgotIFtzaG9ydCBSIHdpa2kgdHV0b3JpYWxdKGh0dHA6Ly9yd2lraS5zY2l2aWV3cy5vcmcvZG9rdS5waHA/aWQ9Z3VpZGVzOnR1dG9yaWFsczphc3JlbWwpCi0gW3JlZmVyZW5jZSBtYW51YWxdKGh0dHA6Ly93d3cudnNuaS5jby51ay9kb3dubG9hZHMvYXNyZW1sL3JlbGVhc2UzL2FzcmVtbC1SLnBkZiByZWZlcmVuY2UgbWFudWFsKSAoUERGKQotIEx1aXMgQXBpb2xhemEncyBbYXNyZW1sLXIgY29va2Jvb2tdKGh0dHA6Ly9hcGlvbGF6YS5uZXQvYXNyZW1sLXIvKQoKCiMjIFBhY2thZ2UgdmVyc2lvbnMgdXNlZAoKYGBge3Igc2Vzc2lvbmluZm99CnNlc3Npb25JbmZvKCkKYGBgCgojIyBUbyBkbwoKLSBhZGQgbGlua3MgdG8gYG1lckRlcml2YCBmb3Igc3RhbmRhcmQgZGV2cyBvZiB2YXJpYW5jZXMsIHJvYnVzdCBlc3RpbWF0ZXMuIE1vcmUgb24gUml6b3BvdWxvcyBwYWNrYWdlCi0gdXBkYXRlIHBhY2thZ2UgZGVzY3JpcHRpb25zOyBjcm9zcy1saW5rIHdpdGggW1Rhc2sgVmlld10oaHR0cDovL2Jib2xrZXIuZ2l0aHViLmlvL21peGVkbW9kZWxzLW1pc2MvTWl4ZWRNb2RlbHMuaHRtbCkgPyBgcmV0aGlua2luZ2AsIGBicm1zYCwgLi4uCi0gbW9yZSBvbiBwb3N0LWFuYWx5c2lzIChgYnJvb20oLm1peGVkKWAsIGBlbW1lYW5zYCwgYG11bHRjb21wYCwgLi4uKQotIG1vcmUgb24gY29uZmlkZW5jZSBpbnRlcnZhbHMsIHNpbXVsYXRpbmcgZnJvbSBjb25kaXRpb25hbCBkaXN0cmlidXRpb25zLCBldGMuKQoKIyBCaWJsaW9ncmFwaHkKCg==
    +
    LS0tCmF1dGhvcjogQmVuIEJvbGtlciBhbmQgb3RoZXJzCnRpdGxlOiBHTE1NIEZBUQpiaWJsaW9ncmFwaHk6IGdsbW0uYmliCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlYiAlWScpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICB0b2M6IHRydWUKLS0tCgo8IS0tIEdvb2dsZSB0YWcgKGd0YWcuanMpIC0tPgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1HLUtZMUpZMEM1M1MiPjwvc2NyaXB0Pgo8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwoKICBndGFnKCdjb25maWcnLCAnRy1LWTFKWTBDNTNTJyk7Cjwvc2NyaXB0PgoKYGBge3Igc2V0dXAsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2LmFyZ3MgPSBsaXN0KHBuZyA9IGxpc3QodHlwZSA9ICJjYWlybyIpKSkKbGlicmFyeShwYW5kZXIpCmxpYnJhcnkoQ2Fpcm8pCmBgYAoKYGBge3IgcGtncywgZXZhbD1GQUxTRSxlY2hvPUZBTFNFfQpwa2dzIDwtIGMoImxtZTQiLCJnbG1tQURNQiIsInNvcyIsImJsbWUiLCJSTFJzaW0iLCJnZ3Bsb3QyIiwgIk1FTVNTIikKaTEgPC0gaW5zdGFsbGVkLnBhY2thZ2VzKCkKcGtncyA8LSBzZXRkaWZmKHBrZ3MsIHJvd25hbWVzKGkxKSkKcmVwb3MgPC0gYygiaHR0cDovL2dsbW1hZG1iLnItZm9yZ2Uuci1wcm9qZWN0Lm9yZy9yZXBvcyIsCiAgICAgICAgICAgIGdldE9wdGlvbigicmVwb3MiKSkKaWYgKGxlbmd0aChwa2dzKT4wKSAKICAgIGluc3RhbGwucGFja2FnZXMocGtncyxyZXBvcz1yZXBvcywgdHlwZT0ic291cmNlIikKYGBgCgojIEludHJvZHVjdGlvbgoKVGhpcyBpcyBhbiBpbmZvcm1hbCBGQVEgbGlzdCBmb3IgdGhlIGByLXNpZy1taXhlZC1tb2RlbHNgIG1haWxpbmcgbGlzdC4KClRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25zIGZvciBtaXhlZCBtb2RlbGluZyBpbiBSIGFyZSAKCi0gKmxpbmVhciBtaXhlZCBtb2RlbHMqOiBgYW92KClgLCBgbmxtZTo6bG1lYFteMV0sIGBsbWU0OjpsbWVyYDsgYGJybXM6OmJybWAKLSAqZ2VuZXJhbGl6ZWQgbGluZWFyIG1peGVkIG1vZGVscyogKEdMTU1zKQogICAgLSBmcmVxdWVudGlzdDogYE1BU1M6OmdsbW1QUUxgLCBgbG1lNDo6Z2xtZXJgOyBgZ2xtbVRNQmAKICAgIC0gQmF5ZXNpYW46IGBNQ01DZ2xtbTo6TUNNQ2dsbW1gOyBgYnJtczo6YnJtYAotICpub25saW5lYXIgbWl4ZWQgbW9kZWxzKjogYG5sbWU6Om5sbWVgLCBgbG1lNDo6bmxtZXJgOyBgYnJtczo6YnJtYAotICpHTkxNTXMqOiBgYnJtczo6YnJtYAkKClteMV06IGluIFIsIGBmb286OmJhcmAgKG9yIGBmb286OmJhcigpYCkgZGVub3RlcyAiZnVuY3Rpb24gYGJhcmAgaW4gcGFja2FnZSBgZm9vYCIpLgoKQW5vdGhlciBxdWljay1hbmQtZGlydHkgd2F5IHRvIHNlYXJjaCBmb3IgbWl4ZWQtbW9kZWwgcmVsYXRlZCBwYWNrYWdlcyBvbiBDUkFOOgoKYGBge3IgYXZhaWwsY2FjaGU9VFJVRX0KZ3JlcCgibC4/bVttZV1bXnRdIixyb3duYW1lcyhhdmFpbGFibGUucGFja2FnZXMoKSksdmFsdWU9VFJVRSkKYGBgCgpUaGVyZSBhcmUgc29tZSBmYWxzZSBwb3NpdGl2ZXMgaGVyZSAoZS5nLiBgcGFsbWVycGVuZ3VpbnNgKTsgc2VlIFtoZXJlXShodHRwczovL3hrY2QuY29tLzEzMTMvKSBpZiB5b3UncmUgaW50ZXJlc3RlZCBpbiAicmVnZXggZ29sZiIuCgojIyBPdGhlciBzb3VyY2VzIG9mIGhlbHAKCi0gdGhlIG1haWxpbmcgbGlzdCBpcyBgci1zaWctbWl4ZWQtbW9kZWxzQHItcHJvamVjdC5vcmdgCiAgICAtIHNpZ24gdXAgW2hlcmVdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL21haWxtYW4vbGlzdGluZm8vci1zaWctbWl4ZWQtbW9kZWxzKQoJLSBhcmNoaXZlcyBbaGVyZV0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvcGlwZXJtYWlsL3Itc2lnLW1peGVkLW1vZGVscy8pCgktIG9yIEdvb2dsZSBzZWFyY2ggd2l0aCB0aGUgdGFnIGBzaXRlOmh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLXNpZy1taXhlZC1tb2RlbHMvYAotIFRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBbb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vYmJvbGtlci9taXhlZG1vZGVscy1taXNjL2Jsb2IvbWFzdGVyL2dsbW1GQVEucm1kKTsgdGhlIHJlbmRlcmVkIChIVE1MKSB2ZXJzaW9uIGxpdmVzIG9uIFtHaXRIdWIgcGFnZXNdKGh0dHA6Ly9iYm9sa2VyLmdpdGh1Yi5pby9taXhlZG1vZGVscy1taXNjL2dsbW1GQVEuaHRtbCkuCi0gU2VhcmNoaW5nIG9uIFN0YWNrT3ZlcmZsb3cgd2l0aCB0aGUgW1tyXSBbbWl4ZWQtbW9kZWxzXSB0YWdzXShodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zL3RhZ2dlZC9yJTIwbWl4ZWQtbW9kZWxzP21vZGU9YWxsKSwgb3Igb24gQ3Jvc3NWYWxpZGF0ZWQgd2l0aCB0aGUgW1ttaXhlZC1tb2RlbF0gdGFnXShodHRwOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zL3RhZ2dlZC9taXhlZC1tb2RlbCkgbWF5IGJlIGhlbHBmdWwgKHRoZXNlIHNpdGVzIGFsc28gaGF2ZSBhbiBgW2xtZTRdYCB0YWcpLgoKCioqRElTQ0xBSU1FUlM6KioKCi0gKEcpTE1NcyBhcmUgaGFyZCAtIGhhcmRlciB0aGFuIHlvdSBtYXkgdGhpbmsgYmFzZWQgb24gd2hhdCB5b3UgbWF5IGhhdmUgbGVhcm5lZCBpbiB5b3VyIHNlY29uZCBzdGF0aXN0aWNzIGNsYXNzLCB3aGljaCBwcm9iYWJseSBmb2N1c2VkIG9uIHBpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIHN1bXMgb2Ygc3F1YXJlcyB0ZXJtcyBhbmQgZGVncmVlcyBvZiBmcmVlZG9tIGZvciB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBvZiBhbiAkRiQgdGVzdC4gJ01vZGVybicgbWl4ZWQgbW9kZWwgYXBwcm9hY2hlcywgYWx0aG91Z2ggbW9yZSBwb3dlcmZ1bCAodGhleSBjYW4gaGFuZGxlIG1vcmUgY29tcGxleCBkZXNpZ25zLCBsYWNrIG9mIGJhbGFuY2UsIGNyb3NzZWQgcmFuZG9tIGZhY3RvcnMsIHNvbWUga2luZHMgb2Ygbm9uLU5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJlc3BvbnNlcywgZXRjLiksIGFsc28gcmVxdWlyZSBhIG5ldyBzZXQgb2YgY29uY2VwdHVhbCB0b29scy4gSW4gb3JkZXIgdG8gdXNlIHRoZXNlIHRvb2xzIHlvdSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBhIGdlbmVyYWwgYWNxdWFpbnRhbmNlIHdpdGggY2xhc3NpY2FsIG1peGVkLW1vZGVsIGV4cGVyaW1lbnRhbCBkZXNpZ25zIGJ1dCB5b3Ugc2hvdWxkIGFsc28sIHByb2JhYmx5LCByZWFkIHNvbWV0aGluZyBhYm91dCBtb2Rlcm4gbWl4ZWQgbW9kZWwgYXBwcm9hY2hlcy4gQGxpdHRlbGxfc2FzXzIwMDYgYW5kIEBwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDAgYXJlIHR3byBwbGFjZXMgdG8gc3RhcnQsIGFsdGhvdWdoIFBpbmhlaXJvIGFuZCBCYXRlcyBpcyBwcm9iYWJseSBtb3JlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgUi4gT3RoZXIgdXNlZnVsIHJlZmVyZW5jZXMgaW5jbHVkZSBAZ2VsbWFuX2RhdGFfMjAwNiAoZm9jdXNlZCBvbiBCYXllc2lhbiBtZXRob2RzKSBhbmQgQHp1dXJfbWl4ZWRfMjAwOS4gSWYgeW91IGFyZSBnb2luZyB0byB1c2UgZ2VuZXJhbGl6ZWQgbGluZWFyIG1peGVkIG1vZGVscywgeW91IHNob3VsZCB1bmRlcnN0YW5kIGdlbmVyYWxpemVkIGxpbmVhciBtb2RlbHMgKEBkb2Jzb25faW50cm9kdWN0aW9uXzIwMDgsIEBmYXJhd2F5X2V4dGVuZGluZ18yMDA2LCBhbmQgQE1jQ3VsbGFnaE5lbGRlcjE5ODkgYXJlIHN0YW5kYXJkIHJlZmVyZW5jZXM7IHRoZSBsYXN0IGlzIHRoZSBjYW5vbmljYWwgcmVmZXJlbmNlLCBidXQgYWxzbyB0aGUgbW9zdCBjaGFsbGVuZ2luZykuCi0gQWxsIG9mIHRoZSBpc3N1ZXMgdGhhdCBhcmlzZSB3aXRoIHJlZ3VsYXIgbGluZWFyIG9yIGdlbmVyYWxpemVkLWxpbmVhciBtb2RlbGluZyAoZS5nLjogaW5hZGVxdWFjeSBvZiBwLXZhbHVlcyBhbG9uZSBmb3IgdGhvcm91Z2ggc3RhdGlzdGljYWwgYW5hbHlzaXM7IG5lZWQgdG8gIHVuZGVyc3RhbmQgaG93IG1vZGVscyBhcmUgcGFyYW1ldGVyaXplZDsgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwcmluY2lwbGUgb2YgbWFyZ2luYWxpdHkgYW5kIGhvdyBpbnRlcmFjdGlvbnMgY2FuIGJlIHRyZWF0ZWQ7IGRhbmdlcnMgb2Ygb3ZlcmZpdHRpbmcsIHdoaWNoIGFyZSBub3QgbWl0aWdhdGVkIGJ5IHN0ZXB3aXNlIHByb2NlZHVyZXM7IHRoZSBub24tZXhpc3RlbmNlIG9mIGZyZWUgbHVuY2hlcykgYWxzbyBhcHBseSwgYW5kIGNhbiBhcHBseSBtb3JlIHNldmVyZWx5LCB0byBtaXhlZCBtb2RlbHMuCiogV2hlbiBTQVMgKG9yIFN0YXRhLCBvciBHZW5zdGF0L0FTLVJFTUwgb3IgLi4uKSBhbmQgUiBkaWZmZXIgaW4gdGhlaXIgYW5zd2VycywgUiBtYXkgbm90IGJlIHdyb25nLiBCb3RoIFNBUyBhbmQgUiBtYXkgYmUgYHJpZ2h0JyBidXQgcHJvY2VlZGluZyBpbiBhIGRpZmZlcmVudCB3YXkvYW5zd2VyaW5nIGRpZmZlcmVudCBxdWVzdGlvbnMvdXNpbmcgYSBkaWZmZXJlbnQgcGhpbG9zb3BoaWNhbCBhcHByb2FjaCAob3IgYm90aCBtYXkgYmUgd3JvbmcgLi4uKQotIFRoZSBhZHZpY2UgaW4gdGhpcyBGQVEgY29tZXMgd2l0aCAqKmFic29sdXRlbHkgbm8gd2FycmFudHkgb2YgYW55IHNvcnQqKi4KCiMgUmVmZXJlbmNlcwoKIyMgbGluZWFyIG1peGVkIG1vZGVscwoKIyMjIHdlYi9vcGVuCgotIFtVQ0xBIElEUkUgc3RhdGlzdGljYWwgY29uc3VsdGluZ10oaHR0cHM6Ly9zdGF0cy5pZHJlLnVjbGEuZWR1L290aGVyL211bHQtcGtnL2ludHJvZHVjdGlvbi10by1saW5lYXItbWl4ZWQtbW9kZWxzLykKLSBAYmFycl9sZWFybmluZ18yMDIwIENoYXB0ZXJzIDUtOAoKIyMjIGJvb2tzIChkZWFkLXRyZWUvY2xvc2VkKQoKLSBwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDA6IExNTSBvbmx5LgotIEB6dXVyX21peGVkXzIwMDk6IEZvY3VzZWQgb24gZWNvbG9neS4KLSBAZ2VsbWFuX2RhdGFfMjAwNjogTE1NIGFuZCBHTE1NOyBCYXllc2lhbjsgZXhhbXBsZXMgZnJvbSBzb2NpYWwgc2NpZW5jZS4gSW50ZXJtZWRpYXRlIG1hdGhlbWF0aWNzLgotIChSZXRoaW5raW5nKQoKIyBNb2RlbCBkZWZpbml0aW9uCgojIyBNb2RlbCBzcGVjaWZpY2F0aW9uCgpUaGUgZm9sbG93aW5nIGZvcm11bGEgZXh0ZW5zaW9ucyBmb3Igc3BlY2lmeWluZyByYW5kb20tZWZmZWN0cyBzdHJ1Y3R1cmVzIGluIFIgYXJlIHVzZWQgYnkgCgotIGBsbWU0YAotIGBubG1lYCAobmVzdGVkIGVmZmVjdHMgb25seSwgYWx0aG91Z2ggY3Jvc3NlZCBlZmZlY3RzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBtb3JlIHdvcmspCi0gYGdsbW1BRE1CYCBhbmQgYGdsbW1UTUJgIAoKYE1DTUNnbG1tYCB1c2VzIGEgZGlmZmVyZW50IHNwZWNpZmljYXRpb24sIGluaGVyaXRlZCBmcm9tIEFTLVJFTUwuCgooTW9kaWZpZWQgZnJvbSBSb2JpbiBKZWZmcmllcywgVUNMQTopCgpgYGB7ciBnbG1tX3N5bnRheCxlY2hvPUZBTFNFfQpzcGVjdGFiIDwtIHJlYWQudGFibGUoc2VwPSImIixoZWFkZXI9VFJVRSx0ZXh0PSIKZm9ybXVsYSAgICAgJiBtZWFuaW5nCmAoMXxncm91cClgICYgIHJhbmRvbSBncm91cCBpbnRlcmNlcHQKYCh4fGdyb3VwKWAgPSBgKDEreHxncm91cClgICYgcmFuZG9tIHNsb3BlIG9mIHggd2l0aGluIGdyb3VwIHdpdGggY29ycmVsYXRlZCBpbnRlcmNlcHQKYCgwK3h8Z3JvdXApYCA9IGAoLTEreHxncm91cClgICYgcmFuZG9tIHNsb3BlIG9mIHggd2l0aGluIGdyb3VwOiBubyB2YXJpYXRpb24gaW4gaW50ZXJjZXB0CmAoMXxncm91cCkgKyAoMCt4fGdyb3VwKWAgICYgdW5jb3JyZWxhdGVkIHJhbmRvbSBpbnRlcmNlcHQgYW5kIHJhbmRvbSBzbG9wZSB3aXRoaW4gZ3JvdXAKYCgxfHNpdGUvYmxvY2spYCA9IGAoMXxzaXRlKSsoMXxzaXRlOmJsb2NrKWAgJiBpbnRlcmNlcHQgdmFyeWluZyBhbW9uZyBzaXRlcyBhbmQgYW1vbmcgYmxvY2tzIHdpdGhpbiBzaXRlcyAobmVzdGVkIHJhbmRvbSBlZmZlY3RzKQpgc2l0ZSsoMXxzaXRlOmJsb2NrKWAgJiAqZml4ZWQqIGVmZmVjdCBvZiBzaXRlcyBwbHVzIHJhbmRvbSB2YXJpYXRpb24gaW4gaW50ZXJjZXB0IGFtb25nIGJsb2NrcyB3aXRoaW4gc2l0ZXMKYCh4fHNpdGUvYmxvY2spYCA9IGAoeHxzaXRlKSsoeHxzaXRlOmJsb2NrKWAgPSBgKDEgKyB4fHNpdGUpKygxK3h8c2l0ZTpibG9jaylgICYgc2xvcGUgYW5kIGludGVyY2VwdCB2YXJ5aW5nIGFtb25nIHNpdGVzIGFuZCBhbW9uZyBibG9ja3Mgd2l0aGluIHNpdGVzCmAoeDF8c2l0ZSkrKHgyfGJsb2NrKWAgJiB0d28gZGlmZmVyZW50IGVmZmVjdHMsIHZhcnlpbmcgYXQgZGlmZmVyZW50IGxldmVscwpgeCpzaXRlKyh4fHNpdGU6YmxvY2spYCAmIGZpeGVkIGVmZmVjdCB2YXJpYXRpb24gb2Ygc2xvcGUgYW5kIGludGVyY2VwdCB2YXJ5aW5nIGFtb25nIHNpdGVzIGFuZCByYW5kb20gdmFyaWF0aW9uIG9mIHNsb3BlIGFuZCBpbnRlcmNlcHQgYW1vbmcgYmxvY2tzIHdpdGhpbiBzaXRlcwpgKDF8Z3JvdXAxKSsoMXxncm91cDIpYCAmIGludGVyY2VwdCB2YXJ5aW5nIGFtb25nIGNyb3NzZWQgcmFuZG9tIGVmZmVjdHMgKGUuZy4gc2l0ZSwgeWVhcikiKQpzZXQuYWxpZ25tZW50KGRlZmF1bHQ9YygiY2VudHJlIiwibGVmdCIpKQpwYW5kZXIoc3BlY3RhYikKYGBgCgpPciBpbiBhIGxpdHRsZSBtb3JlIGRldGFpbDoKCmBgYHtyIGZ0YWIsZWNobz1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KZnRhYiA8LSBtYXRyaXgoYygizrJfMCArIM6yX3sxfVhfe2l9ICsgZV97c2l9IiwKICAgICAgICAgICAgICAgICAibi9hIChOb3QgYSBtaXhlZC1lZmZlY3RzIG1vZGVsKSIsCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97Uywwc30pICsgzrJfezF9WF9pICsgZV97c2l9IiwKICAgICAgICAgICAgICAgICAi4oi8IFggKyAoMeKIo1N1YmplY3QpIiwKICAgICAgICAgICAgICAgICAiKM6yXzAgKyBiX3tTLDBzfSkgKyAgKM6yX3sxfSArIGJfe1MsMXN9KSBYX2kgKyBlX3tzaX0iLAogICAgICAgICAgICAgICAgICJ+IFggKyAoMSArIFjiiKNTdWJqZWN0KSIsCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97Uywwc30gKyBiX3tJLDBpfSkgKyAozrJfezF9ICsgYl97Uywxc30pIFhfaSArIGVfe3NpfSIsCiAgICAgICAgICAgICAgICAgIuKIvCBYICsgKDEgKyBY4oijU3ViamVjdCkgKyAoMeKIo0l0ZW0pIiwKICAgICAgICAgICAgICAgICAiQXMgYWJvdmUsIGJ1dCAkU197MHN9JCwgJFNfezFzfSQgaW5kZXBlbmRlbnQiLAogICAgICAgICAgICAgICAgICLiiLwgWCArICgx4oijU3ViamVjdCkgKyAoMCArIFjiiKMgU3ViamVjdCkgKyAoMeKIo0l0ZW0pIiwgCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97Uywwc30gKyBiX3tJLDBpfSkgKyDOsl97MX1YX2kgKyBlX3tzaX0iLAogICAgICAgICAgICAgICAgICLiiLwgWCArICgx4oijU3ViamVjdCkgKyAoMeKIo0l0ZW0pIiwgCiAgICAgICAgICAgICAgICAgIijOsl8wICsgYl97SSwwaX0pICsgICjOsl97MX0gKyBiX3tTLDFzfSlYX2kgKyBlX3tzaX0iLAogICAgICAgICAgICAgICAgICLiiLwgWCArICgwICsgWOKIo1N1YmplY3QpICsgKDHiiKNJdGVtKSIpLAogICAgICAgICAgICAgICBieXJvdz1UUlVFLG5jb2w9MiwKICAgICAgICAgICAgICAgZGltbmFtZXM9bGlzdChOVUxMLGMoImVxdWF0aW9uIiwiZm9ybXVsYSIpKSkKZnRhYiA8LSBkYXRhLmZyYW1lKGZ0YWIsc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKZmYgPC0gIWdyZXBsKCJBcyBhYm92ZSIsZnRhYiRlcXVhdGlvbikKZnRhYiRlcXVhdGlvbltmZl0gPC0gc3ByaW50ZigiJCVzJCIsZnRhYiRlcXVhdGlvbltmZl0pCmZmIDwtICFncmVwbCgibi9hIixmdGFiJGZvcm11bGEpCmZ0YWIkZm9ybXVsYVtmZl0gPC0gc3ByaW50ZigiYCVzYCIsZnRhYiRmb3JtdWxhW2ZmXSkKcGFuZGVyOjpwYW5kZXIoZnRhYixqdXN0aWZ5PSJsZWZ0IikKYGBgCgpNb2RpZmllZCBmcm9tOiBodHRwOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEzMTY2L3JzLWxtZXItY2hlYXQtc2hlZXQ/bHE9MSAoTGl2aXVzKQoKClRoZSAqKm1hZ2ljKiogZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiB0aGUgW2VxdWF0aW9tYXRpYyBwYWNrYWdlXShodHRwczovL2dpdGh1Yi5jb20vZGF0YWxvcmF4L2VxdWF0aW9tYXRpYykgY2FuIGhhbmRsZSBtaXhlZCBtb2RlbHMgKGByZW1vdGVzOjppbnN0YWxsX2dpdGh1YigiZGF0YWxvcmF4L2VxdWF0aW9tYXRpYyIpYCksIGUuZy4KCmBgYHtyIGVxdWF0aW9tYXRpYywgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iYXNpcyJ9CmxpYnJhcnkobG1lNCkKbGlicmFyeShlcXVhdGlvbWF0aWMpCmZtMSA8LSBsbWVyKFJlYWN0aW9uIH4gRGF5cyArIChEYXlzfFN1YmplY3QpLCBzbGVlcHN0dWR5KQplcXVhdGlvbWF0aWM6OmV4dHJhY3RfZXEoZm0xKQpgYGAKCkl0IGRvZXNuJ3QgaGFuZGxlIEdMTU1zICh5ZXQpLCBidXQgeW91IGNvdWxkIGZpdCB0d28gZmFrZSBtb2RlbHMgJm1kYXNoOyBvbmUgTE1NIGxpa2UgeW91ciBHTE1NIGJ1dCB3aXRoIGEgR2F1c3NpYW4gcmVzcG9uc2UsIGFuZCBvbmUgR0xNIHdpdGggdGhlIHNhbWUgZmFtaWx5L2xpbmsgZnVuY3Rpb24gYXMgeW91ciBHTE1NIGJ1dCB3aXRob3V0IHRoZSByYW5kb20gZWZmZWN0cyAmbWRhc2g7IGFuZCBwdXQgdGhlIHBpZWNlcyB0b2dldGhlci4KCk1vcmUgcG9zc2libHkgdXNlZnVsIGxpbmtzOgoKLSBSZW5zZSBOaWV1d2VuaHVpcydzIFtibG9ncG9zdC9sZXNzb24gb24gbG1lNCBtb2RlbCBzcGVjaWZpY2F0aW9uXShodHRwOi8vd3d3LnJlbnNlbmlldXdlbmh1aXMubmwvci1zZXNzaW9ucy0xNi1tdWx0aWxldmVsLW1vZGVsLXNwZWNpZmljYXRpb24tbG1lNC8pCi0gQ3Jvc3NWYWxpZGF0ZWQncyBbbG1lciBjaGVhdCBzaGVldF0oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTMxNjYvcnMtbG1lci1jaGVhdC1zaGVldCkKLSBLcmlzdG9mZmVyIE1hZ251c3NvbidzIFtVc2luZyBSIGFuZCBsbWUvbG1lciB0byBmaXQgZGlmZmVyZW50IHR3by0gYW5kIHRocmVlLWxldmVsIGxvbmdpdHVkaW5hbCBtb2RlbHNdKGh0dHBzOi8vcnBzeWNob2xvZ2lzdC5jb20vci1ndWlkZS1sb25naXR1ZGluYWwtbG1lLWxtZXIpCgojIyBTaG91bGQgSSB0cmVhdCBmYWN0b3IgeHh4IGFzIGZpeGVkIG9yIHJhbmRvbT8KClRoaXMgaXMgaW4gZ2VuZXJhbCBhIGZhciBtb3JlIGRpZmZpY3VsdCBxdWVzdGlvbiB0aGFuIGl0IHNlZW1zIG9uIHRoZSBzdXJmYWNlLiBUaGVyZSBhcmUgbWFueSBjb21wZXRpbmcgcGhpbG9zb3BoaWVzIGFuZCBkZWZpbml0aW9ucy4gRm9yIGV4YW1wbGUsIGZyb20gQGdlbG1hbl9hbmFseXNpc18yMDA1OgoKPiBCZWZvcmUgZGlzY3Vzc2luZyB0aGUgdGVjaG5pY2FsIGlzc3Vlcywgd2UgYnJpZWZseSByZXZpZXcgd2hhdCBpcyBtZWFudCBieSBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdHMuIEl0IHR1cm5zIG91dCB0aGF0IGRpZmZlcmVudOKAlGluIGZhY3QsIGluY29tcGF0aWJsZeKAlGRlZmluaXRpb25zIGFyZSB1c2VkIGluIGRpZmZlcmVudCBjb250ZXh0cy4gW1NlZSBhbHNvIEtyZWZ0IGFuZCBkZSBMZWV1dyAoMTk5OCksIFNlY3Rpb24gMS4zLjMsIGZvciBhIGRpc2N1c3Npb24gb2YgdGhlIG11bHRpcGxpY2l0eSBvZiBkZWZpbml0aW9ucyBvZiBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdHMgYW5kIGNvZWZmaWNpZW50cywgYW5kIFJvYmluc29uICgxOTk4KSBmb3IgYSBoaXN0b3JpY2FsIG92ZXJ2aWV3Ll0gSGVyZSB3ZSBvdXRsaW5lIGZpdmUgZGVmaW5pdGlvbnMgdGhhdCB3ZSBoYXZlIHNlZW46IDEuIEZpeGVkIGVmZmVjdHMgYXJlIGNvbnN0YW50IGFjcm9zcyBpbmRpdmlkdWFscywgYW5kIHJhbmRvbSBlZmZlY3RzIHZhcnkuIEZvciBleGFtcGxlLCBpbiBhIGdyb3d0aCBzdHVkeSwgYSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIM6xaSBhbmQgZml4ZWQgc2xvcGUgzrIgY29ycmVzcG9uZHMgdG8gcGFyYWxsZWwgbGluZXMgZm9yIGRpZmZlcmVudCBpbmRpdmlkdWFscyBpLCBvciB0aGUgbW9kZWwgeWl0ID0gzrFpICsgzrJ0LiBLcmVmdCBhbmQgZGUgTGVldXcgWygxOTk4KSwgcGFnZSAxMl0gdGh1cyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZpeGVkIGFuZCByYW5kb20gY29lZmZpY2llbnRzLiAyLiBFZmZlY3RzIGFyZSBmaXhlZCBpZiB0aGV5IGFyZSBpbnRlcmVzdGluZyBpbiB0aGVtc2VsdmVzIG9yIHJhbmRvbSBpZiB0aGVyZSBpcyBpbnRlcmVzdCBpbiB0aGUgdW5kZXJseWluZyBwb3B1bGF0aW9uLiBTZWFybGUsIENhc2VsbGEgYW5kIE1jQ3VsbG9jaCBbKDE5OTIpLCBTZWN0aW9uIDEuNF0gZXhwbG9yZSB0aGlzIGRpc3RpbmN0aW9uIGluIGRlcHRoLiAzLiDigJxXaGVuIGEgc2FtcGxlIGV4aGF1c3RzIHRoZSBwb3B1bGF0aW9uLCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBpcyBmaXhlZDsgd2hlbiB0aGUgc2FtcGxlIGlzIGEgc21hbGwgKGkuZS4sIG5lZ2xpZ2libGUpIHBhcnQgb2YgdGhlIHBvcHVsYXRpb24gdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgaXMgcmFuZG9t4oCdIFtHcmVlbiBhbmQgVHVrZXkgKDE5NjApXS4gNC4g4oCcSWYgYW4gZWZmZWN0IGlzIGFzc3VtZWQgdG8gYmUgYSByZWFsaXplZCB2YWx1ZSBvZiBhIHJhbmRvbSB2YXJpYWJsZSwgaXQgaXMgY2FsbGVkIGEgcmFuZG9tIGVmZmVjdOKAnSBbTGFNb3R0ZSAoMTk4MyldLiA1LiBGaXhlZCBlZmZlY3RzIGFyZSBlc3RpbWF0ZWQgdXNpbmcgbGVhc3Qgc3F1YXJlcyAob3IsIG1vcmUgZ2VuZXJhbGx5LCBtYXhpbXVtIGxpa2VsaWhvb2QpIGFuZCByYW5kb20gZWZmZWN0cyBhcmUgZXN0aW1hdGVkIHdpdGggc2hyaW5rYWdlIFvigJxsaW5lYXIgdW5iaWFzZWQgcHJlZGljdGlvbuKAnSBpbiB0aGUgdGVybWlub2xvZ3kgb2YgUm9iaW5zb24gKDE5OTEpXS4gVGhpcyBkZWZpbml0aW9uIGlzIHN0YW5kYXJkIGluIHRoZSBtdWx0aWxldmVsIG1vZGVsaW5nIGxpdGVyYXR1cmUgW3NlZSwgZS5nLiwgU25pamRlcnMgYW5kIEJvc2tlciAoMTk5OSksIFNlY3Rpb24gNC4yXSBhbmQgaW4gZWNvbm9tZXRyaWNzLgoKQW5vdGhlciB1c2VmdWwgY29tbWVudCAodmlhIEtldmluIFdyaWdodCkgcmVpbmZvcmNpbmcgdGhlIGlkZWEgdGhhdCAicmFuZG9tIHZzLiBmaXhlZCIgaXMgbm90IGEgc2ltcGxlLCBjdXQtYW5kLWRyaWVkIGRlY2lzaW9uOiBmcm9tIEBzY2hhYmVuYmVyZ2VyX2NvbnRlbXBvcmFyeV8yMDAxLCBwLiA2Mjc6Cgo+IEJlZm9yZSBwcm9jZWVkaW5nIGZ1cnRoZXIgd2l0aCByYW5kb20gZmllbGQgbGluZWFyIG1vZGVscyB3ZSBuZWVkIHRvIHJlbWluZCB0aGUgcmVhZGVyIG9mIHRoZSBhZGFnZSB0aGF0IG9uZSBtb2RlbGVyJ3MgcmFuZG9tIGVmZmVjdCBpcyBhbm90aGVyIG1vZGVsZXIncyBmaXhlZCBlZmZlY3QuCgpAY2xhcmsyMDE1c2hvdWxkIGFkZHJlc3MgdGhpcyBxdWVzdGlvbiBmcm9tIGEgbW9zdGx5IGVjb25vbWV0cmljIHBlcnNwZWN0aXZlLCBmb2N1c2luZyBtb3N0bHkgb24gcHJhY3RpY2FsIHZhcmlhbmNlL2JpYXMvUk1TRSBjcml0ZXJpYS4KCk9uZSBwb2ludCBvZiBwYXJ0aWN1bGFyIHJlbGV2YW5jZSB0byAnbW9kZXJuJyBtaXhlZCBtb2RlbCBlc3RpbWF0aW9uIChyYXRoZXIgdGhhbiAnY2xhc3NpY2FsJyBtZXRob2Qtb2YtbW9tZW50cyBlc3RpbWF0aW9uKSBpcyB0aGF0LCBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGVyZSBtdXN0IGJlIGEgcmVhc29uYWJsZSBudW1iZXIgb2YgcmFuZG9tLWVmZmVjdHMgbGV2ZWxzIChlLmcuIGJsb2NrcykgLS0gbW9yZSB0aGFuIDUgb3IgNiBhdCBhIG1pbmltdW0uIFRoaXMgaXMgbm90IHN1cnByaXNpbmcgaWYgeW91IGNvbnNpZGVyIHRoYXQgcmFuZG9tIGVmZmVjdHMgZXN0aW1hdGlvbiBpcyB0cnlpbmcgdG8gZXN0aW1hdGUgYW4gYW1vbmctYmxvY2sgdmFyaWFuY2UuIEZvciBleGFtcGxlLCBmcm9tIEBDcmF3bGV5MjAwMiBwLiA2NzA6IAoKPiBBcmUgdGhlcmUgZW5vdWdoIGxldmVscyBvZiB0aGUgZmFjdG9yIGluIHRoZSBkYXRhIG9uIHdoaWNoIHRvIGJhc2UgYW4gZXN0aW1hdGUgb2YgdGhlIHZhcmlhbmNlIG9mIHRoZSBwb3B1bGF0aW9uIG9mIGVmZmVjdHM/IE5vLCBtZWFucyBbeW91IHNob3VsZCBwcm9iYWJseSB0cmVhdCB0aGUgdmFyaWFibGUgYXNdIGZpeGVkIGVmZmVjdHMuCgpTb21lIHJlc2VhcmNoZXJzICh3aG8gdHJlYXQgZml4ZWQgdnMgcmFuZG9tIGFzIGEgcGhpbG9zb3BoaWNhbCByYXRoZXIgdGhhbiBhIHByYWdtYXRpYyBkZWNpc2lvbikgb2JqZWN0IHRvIHRoaXMgYXBwcm9hY2guCgpBbHNvIHNlZSBhIHZlcnkgdGhvdWdodGZ1bCBjaGFwdGVyIGluIEBob2RnZXNfcmljaGx5XzIwMTYuCgpUcmVhdGluZyBmYWN0b3JzIHdpdGggc21hbGwgbnVtYmVycyBvZiBsZXZlbHMgYXMgcmFuZG9tIHdpbGwgaW4gdGhlIGJlc3QgY2FzZSAgbGVhZCB0byB2ZXJ5IHNtYWxsIGFuZC9vciBpbXByZWNpc2UgZXN0aW1hdGVzIG9mIHJhbmRvbSBlZmZlY3RzOyBpbiB0aGUgd29yc3QgY2FzZSBpdCB3aWxsIGxlYWQgdG8gdmFyaW91cyBudW1lcmljYWwgZGlmZmljdWx0aWVzIHN1Y2ggYXMgbGFjayBvZiBjb252ZXJnZW5jZSwgemVybyB2YXJpYW5jZSBlc3RpbWF0ZXMsIGV0Yy4uIChBIHNtYWxsIFtzaW11bGF0aW9uIGV4ZXJjaXNlXShodHRwczovcnB1YnMuY29tL2Jib2xrZXIvNDE4Nykgc2hvd3MgdGhhdCBhdCBsZWFzdCB0aGUgZXN0aW1hdGVzIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gYXJlIGRvd253YXJkbHkgYmlhc2VkIGluIHRoaXMgY2FzZTsgaXQncyBub3QgY2xlYXIgd2hldGhlci9ob3cgdGhpcyBiaWFzIHdvdWxkIGFmZmVjdCB0aGUgcG9pbnQgZXN0aW1hdGVzIG9mICBmaXhlZCBlZmZlY3RzIG9yIHRoZWlyIGVzdGltYXRlZCBjb25maWRlbmNlIGludGVydmFscy4pIEluIHRoZSBjbGFzc2ljYWwgbWV0aG9kLW9mLW1vbWVudHMgYXBwcm9hY2ggdGhlc2UgcHJvYmxlbXMgbWF5IG5vdCBhcmlzZSAoYmVjYXVzZSB0aGUgc3VtcyBvZiBzcXVhcmVzIGFyZSBhbHdheXMgd2VsbCBkZWZpbmVkIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byB1bml0cyksIGJ1dCB0aGUgdW5kZXJseWluZyBwcm9ibGVtcyBvZiBsYWNrIG9mIHBvd2VyIGFyZSB0aGVyZSBuZXZlcnRoZWxlc3MuCgoKVGhpZXJyeSBPbmtlbGlueCBoYXMgW2EgYmxvZyBwb3N0XShodHRwczovL3d3dy5tdXNjYXJkaW51cy5iZS8yMDE4LzA5L251bWJlci1yYW5kb20tZWZmZWN0LWxldmVscy8pIHdpdGggc29tZSBzaW11bGF0aW9ucyBvbiB0aGUgaW1wYWN0IG9mIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGFuZCBjb25jbHVkZXMgd2l0aCBhIGZldyByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBudW1iZXIgb2YgbGV2ZWxzIG9mIHRoZSBncm91cGluZyB2YXJpYWJsZSAkbl9zJDoKPiAtIGdldCAkbl9zID4gMTAwMCQgbGV2ZWxzIHdoZW4gYW4gYWNjdXJhdGUgZXN0aW1hdGUgb2YgdGhlIHJhbmRvbSBlZmZlY3QgdmFyaWFuY2UgaXMgY3J1Y2lhbC4gRS5nLiB3aGVuIGEgc2luZ2xlIG51bWJlciB3aWxsIGJlIHVzZSBmb3IgcG93ZXIgY2FsY3VsYXRpb25zLgo+IC0gZ2V0ICRuX3MgPiAxMDAkIGxldmVscyB3aGVuIGEgcmVhc29uYWJsZSBlc3RpbWF0ZSBvZiB0aGUgcmFuZG9tIGVmZmVjdCB2YXJpYW5jZSBpcyBzdWZmaWNpZW50LiBFLmcuIHBvd2VyIGNhbGN1bGF0aW9ucyB3aXRoIHNlbnNpdGl2aXR5IGFuYWx5c2lzIG9mIHRoZSByYW5kb20gZWZmZWN0IHZhcmlhbmNlLgo+IC0gZ2V0ICRuX3MgPiAyMCQgbGV2ZWxzIGZvciBhbiBleHBlcmltZW50YWwgc3R1ZHkKPiAtIGluIGNhc2UgJDEwIDwgbl9zIDwyMCQgeW91IHNob3VsZCB2YWxpZGF0ZSB0aGUgbW9kZWwgdmVyeSBjYXV0aW91cyBiZWZvcmUgdXNpbmcgdGhlIG91dHB1dAo+IC0gaW4gY2FzZSAkbl9zIDwgMTAkIGl0IGlzIHNhZmVyIHRvIHVzZSB0aGUgdmFyaWFibGUgYXMgYSBmaXhlZCBlZmZlY3QuCgpAb2JlcnByaWxsZXJfZml4ZWRfMjAyMSBhbHNvIHBlcmZvcm1lZCBhIHNpbXVsYXRpb24gc3R1ZHkgYW5kIGZvdW5kIHRoYXQgd2hpbGUgdGhlIGVzdGltYXRlcyBhcmUgc2ltaWxhciBmb3IgdHJlYXRpbmcgYSB2YXJpYWJsZSB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIGxldmVscyBhcyBmaXhlZCBvciByYW5kb20gYXJlIHNpbWlsYXIsIHRoZXJlIHdhcyBhbiBpbXBhY3Qgb24gVHlwZSAxIGFuZCBUeXBlIDIgZXJyb3IgcmF0ZXMuIFRoZXkgYWxzbyBmb3VuZCB0aGF0IHRoZSBwcmVjaXNlIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZSAoZS5nLiwgaW5jbHVzaW9uIG9mIHJhbmRvbSBzbG9wZXMpIGhhZCBhIGxhcmdlIGltcGFjdCBvbiB0aGVzZSBwcm9wZXJ0aWVzLgoKQWxzbyBzZWUgW3RoaXMgdGhyZWFkXShodHRwczovL3N0YXQuZXRoei5jaC9waXBlcm1haWwvci1zaWctbWl4ZWQtbW9kZWxzLzIwMTBxMi8wMDM3MDkuaHRtbCkgb24gdGhlIHItc2lnLW1peGVkLW1vZGVscyBtYWlsaW5nIGxpc3QgYW5kIFt0aGlzIHF1ZXN0aW9uXShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNzY0Ny93aGF0LWlzLXRoZS1taW5pbXVtLXJlY29tbWVuZGVkLW51bWJlci1vZi1ncm91cHMtZm9yLWEtcmFuZG9tLWVmZmVjdHMtZmFjdG9yKSBvbiBDcm9zc1ZhbGlkYXRlZC4KCiMjIE5lc3RlZCBvciBjcm9zc2VkPwoKPGEgaWQ9Im5lc3RlZF9vcl9jcm9zc2VkIj48L2E+CgotIFJlbGF0aXZlbHkgZmV3IG1peGVkIGVmZmVjdCBtb2RlbGluZyBwYWNrYWdlcyBjYW4gaGFuZGxlIGNyb3NzZWQgcmFuZG9tIGVmZmVjdHMsIGkuZS4gdGhvc2Ugd2hlcmUgb25lIGxldmVsIG9mIGEgcmFuZG9tIGVmZmVjdCBjYW4gYXBwZWFyIGluIGNvbmp1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBsZXZlbCBvZiBhbm90aGVyIGVmZmVjdC4gIChUaGlzIGRlZmluaXRpb24gaXMgY29uZnVzaW5nLCBhbmQgSSB3b3VsZCBoYXBwaWx5IGFjY2VwdCBhIGJldHRlciBvbmUuKSAgQSBjbGFzc2ljIGV4YW1wbGUgaXMgY3Jvc3NlZCB0ZW1wb3JhbCBhbmQgc3BhdGlhbCBlZmZlY3RzLiBJZiB0aGVyZSBpcyByYW5kb20gdmFyaWF0aW9uIGFtb25nIHRlbXBvcmFsIGJsb2NrcyAoZS5nLiB5ZWFycykgJydhbmQnJyByYW5kb20gdmFyaWF0aW9uIGFtb25nIHNwYXRpYWwgYmxvY2tzIChlLmcuIHNpdGVzKSwgJydhbmQnJyBpZiB0aGVyZSBpcyBhIGNvbnNpc3RlbnQgeWVhciBlZmZlY3QgYWNyb3NzIHNpdGVzIGFuZCAnJ3ZpY2UgdmVyc2EnJywgdGhlbiB0aGUgcmFuZG9tIGVmZmVjdHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgY3Jvc3NlZC4KLSBgbG1lNGAgZG9lcyBoYW5kbGVkIGNyb3NzZWQgZWZmZWN0cywgZWZmaWNpZW50bHkKLSBpZiB5b3UgbmVlZCB0byBkZWFsIHdpdGggY3Jvc3NlZCBSRXMgaW4gY29uanVuY3Rpb24gd2l0aCBzb21lIG9mIHRoZSBmZWF0dXJlcyB0aGF0IGBubG1lYCBvZmZlcnMgKGUuZy4gaGV0ZXJvc2NlZGFzdGljaXR5IG9mIHJlc2lkdWFscyB2aWEgYHdlaWdodHNgL2B2YXJTdHJ1Y3RgLCBjb3JyZWxhdGlvbiBvZiByZXNpZHVhbHMgdmlhIGBjb3JyZWxhdGlvbmAvYGNvclN0cnVjdGAsICBvciBpZiB5b3Ugd2FudCB0byB1c2VkIGNyb3NzZWQgUkVzIHdpdGggdGhlIGBnYW1sc3NgIHBhY2thZ2UsIHNlZSBwLiAxNjNmZiBvZiBAcGluaGVpcm9fbWl4ZWQtZWZmZWN0c18yMDAwIChzZWN0aW9uIDQuMi4yOiAgW0dvb2dsZSBib29rcyBsaW5rXShodHRwOi8vdGlueXVybC5jb20vY3Jvc3NlZFJFKSkuIEkgZ2l2ZSBhIHdvcmtlZCBleGFtcGxlIFtoZXJlXShodHRwczovL2dpc3QuZ2l0aHViLmNvbS9iYm9sa2VyLzgzYzFmZjAzNmQ0ODUwZDdkYzRjYTgzMmUzNTRmNmE4KS4gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIGEgY291cGxlIG9mIGhhY2tzIGFyZSBuZWNlc3NhcnkgdG8gZ2V0IHRoaXMgdG8gd29yazogKDEpIHRoZSBkYXRhIG11c3QgYmUgZXhwcmVzc2VkIGFzIGEgYGdyb3VwZWREYXRhYCBvYmplY3QgKGF0IGxlYXN0LCBJIGhhdmVuJ3QgbWFuYWdlZCB0byBnZXQgaXQgdG8gd29yayBpbiBhbnkgb3RoZXIgd2F5KTsgKDIpIHRoZSBjcm9zc2VkIGVmZmVjdHMgbXVzdCBiZSAqbmVzdGVkIHdpdGhpbiBhbm90aGVyIGdyb3VwaW5nIGZhY3RvciogLSBpbiB0aGUgZXhhbXBsZSBoZXJlIEkgZGVmaW5lIGEgZHVtbXkgZ3JvdXAsIHdoaWNoIGlzIGF3a3dhcmQgKGl0IG1ha2VzIHRoZSB2YXJpYW5jZSBjb21wb25lbnQgZm9yIHRoaXMgZ3JvdXAgYW5kIHRoZSByZXNpZHVhbCB2YXJpYW5jZSBqb2ludGx5IHVuaWRlbnRpZmlhYmxlKSwgYnV0IG90aGVyd2lzZSBzZWVtcyB0byB3b3JrIE9LLgotIEkgcmFyZWx5IGZpbmQgaXQgdXNlZnVsIHRvIHRoaW5rIG9mIGZpeGVkIGVmZmVjdHMgYXMgIm5lc3RlZCIgKGFsdGhvdWdoIG90aGVycyBkaXNhZ3JlZSk7IGlmIGZvciBleGFtcGxlIHRyZWF0bWVudHMgQSBhbmQgQiBhcmUgb25seSBtZWFzdXJlZCBpbiBibG9jayAxLCBhbmQgdHJlYXRtZW50cyBDIGFuZCBEIGFyZSBvbmx5IG1lYXN1cmVkIGluIGJsb2NrIDIsIG9uZSBzdGlsbCBhc3N1bWVzIChiZWNhdXNlIHRoZXkgYXJlIGZpeGVkIGVmZmVjdHMpIHRoYXQgZWFjaCB0cmVhdG1lbnQgd291bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgaWYgYXBwbGllZCBpbiB0aGUgb3RoZXIgYmxvY2suIChPbmUgbWlnaHQgbGlrZSB0byBlc3RpbWF0ZSB0cmVhdG1lbnQtYnktYmxvY2sgaW50ZXJhY3Rpb25zLCBidXQgaW4gdGhpcyBjYXNlIHRoZSBleHBlcmltZW50YWwgZGVzaWduIGRvZXNuJ3QgYWxsb3cgaXQ7IG9uZSB3b3VsZCBoYXZlIHRvIGhhdmUgbXVsdGlwbGUgdHJlYXRtZW50cyBtZWFzdXJlZCB3aXRoaW4gZWFjaCBibG9jaywgYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IGFsbCB0cmVhdG1lbnRzIGluIGV2ZXJ5IGJsb2NrLikgIE9uZSB3b3VsZCBjb2RlIHRoaXMgYW5hbHlzaXMgYXMgYHJlc3BvbnNlfnRyZWF0bWVudCsoMXxibG9jaylgIGluIGBsbWU0YC4gQWxzbywgaW4gdGhlIGNhc2Ugb2YgZml4ZWQgZWZmZWN0cywgY3Jvc3NlZCBhbmQgbmVzdGVkIHNwZWNpZmljYXRpb25zIGNoYW5nZSB0aGUgcGFyYW1ldGVyaXphdGlvbiBvZiB0aGUgbW9kZWwsIGJ1dCBub3QgYW55dGhpbmcgZWxzZSAoZS5nLiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXN0aW1hdGVkLCBsb2ctbGlrZWxpaG9vZCwgbW9kZWwgcHJlZGljdGlvbnMgYXJlIGFsbCBpZGVudGljYWwpLiAgVGhhdCBpcywgaW4gUidzIGBtb2RlbC5tYXRyaXhgIGZ1bmN0aW9uICh3aGljaCBpbXBsZW1lbnRzIGEgdmVyc2lvbiBvZiBXaWxraW5zb24tUm9nZXJzIG5vdGF0aW9uKSBgYSpiYCBhbmQgYGEvYmAgKHdoaWNoIGV4cGFuZCB0byBgMSthK2IrYTpiYCBhbmQgYDErYSthOmJgIHJlc3BlY3RpdmVseSkgZ2l2ZSBtb2RlbCBtYXRyaWNlcyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zLgotIFdoZXRoZXIgeW91IGV4cGxpY2l0bHkgc3BlY2lmeSBhIHJhbmRvbSBlZmZlY3QgYXMgbmVzdGVkIG9yIG5vdCBkZXBlbmRzIChpbiBwYXJ0KSBvbiB0aGUgd2F5IHRoZSBsZXZlbHMgb2YgdGhlIHJhbmRvbSBlZmZlY3RzIGFyZSBjb2RlZC4gSWYgdGhlICdsb3dlci1sZXZlbCcgcmFuZG9tIGVmZmVjdCBpcyBjb2RlZCB3aXRoIHVuaXF1ZSBsZXZlbHMsIHRoZW4gdGhlIHR3byBzeW50YXhlcyBgKDF8YS9iKWAgKG9yIGAoMXxhKSsoMXxhOmIpYCkgYW5kIGAoMXxhKSsoMXxiKWAgYXJlIGVxdWl2YWxlbnQuIElmIHRoZSBsb3dlci1sZXZlbCByYW5kb20gZWZmZWN0IGhhcyB0aGUgc2FtZSBsYWJlbHMgd2l0aGluIGVhY2ggbGFyZ2VyIGdyb3VwIChlLmcuIGJsb2NrcyAxLCAyLCAzLCA0IHdpdGhpbiBzaXRlcyBBLCBCLCBhbmQgQykgdGhlbiB0aGUgZXhwbGljaXQgbmVzdGluZyBgKDF8YS9iKWAgaXMgcmVxdWlyZWQuIEl0IHNlZW1zIHRvIGJlIGNvbnNpZGVyZWQgYmVzdCBwcmFjdGljZSB0byBjb2RlIHRoZSBuZXN0ZWQgbGV2ZWwgdW5pcXVlbHkgKGUuZy4gQTEsIEEyLCAuLi4sIEIxLCBCMiwgLi4uKSBzbyB0aGF0IGNvbmZ1c2lvbiBiZXR3ZWVuIG5lc3RlZCBhbmQgY3Jvc3NlZCBlZmZlY3RzIGlzIGxlc3MgbGlrZWx5LgoKIyMgKFdoZW4pIGNhbiBJIGluY2x1ZGUgYSBwcmVkaWN0b3IgYXMgYm90aCBmaXhlZCBhbmQgcmFuZG9tPwoKU2VlIFtibG9nIHBvc3QgYnkgVGhpZXJyeSBPbmtlbGlueF0oaHR0cHM6Ly93d3cubXVzY2FyZGludXMuYmUvMjAxNy8wOC9maXhlZC1hbmQtcmFuZG9tLykKCiMgTW9kZWwgZXh0ZW5zaW9ucwoKIyMgT3ZlcmRpc3BlcnNpb24KCjxhIGlkPSJvdmVyZGlzcGVyc2lvbiI+PC9hPgoKIyMjIFRlc3RpbmcgZm9yIG92ZXJkaXNwZXJzaW9uL2NvbXB1dGluZyBvdmVyZGlzcGVyc2lvbiBmYWN0b3IKCi0gd2l0aCB0aGUgdXN1YWwgY2F2ZWF0cywgcGx1cyBhIGZldyBleHRyYXMgLS0gY291bnRpbmcgZGVncmVlcyBvZiBmcmVlZG9tLCBldGMuIC0tIHRoZSB1c3VhbCBwcm9jZWR1cmUgb2YgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBzcXVhcmVkIFBlYXJzb24gcmVzaWR1YWxzIGFuZCBjb21wYXJpbmcgaXQgdG8gdGhlIHJlc2lkdWFsIGRlZ3JlZXMgb2YgZnJlZWRvbSBzaG91bGQgZ2l2ZSBhdCBsZWFzdCBhIGNydWRlIGlkZWEgb2Ygb3ZlcmRpc3BlcnNpb24uICBUaGUgZm9sbG93aW5nIGF0dGVtcHQgY291bnRzIGVhY2ggdmFyaWFuY2Ugb3IgY292YXJpYW5jZSBwYXJhbWV0ZXIgYXMgb25lIG1vZGVsIGRlZ3JlZSBvZiBmcmVlZG9tIGFuZCBwcmVzZW50cyB0aGUgc3VtIG9mIHNxdWFyZWQgUGVhcnNvbiByZXNpZHVhbHMsIHRoZSByYXRpbyBvZiAoU1NRIHJlc2lkdWFscy9yZGYpLCB0aGUgcmVzaWR1YWwgZGYsIGFuZCB0aGUgJHAkLXZhbHVlIGJhc2VkIG9uIHRoZSAoYXBwcm94aW1hdGVseSEhKSBhcHByb3ByaWF0ZSAkXGNoaV4yJCBkaXN0cmlidXRpb24uICoqRG8gUExFQVNFIG5vdGUgdGhlIHVzdWFsLCBhbmQgZXh0cmEsIGNhdmVhdHMgbm90ZWQgaGVyZTogdGhpcyBpcyBhbiBBUFBST1hJTUFURSBlc3RpbWF0ZSBvZiBhbiBvdmVyZGlzcGVyc2lvbiBwYXJhbWV0ZXIqKi4gRXZlbiBpbiB0aGUgR0xNIGNhc2UsIHRoZSBleHBlY3RlZCBkZXZpYW5jZSBwZXIgcG9pbnQgZXF1YWxpbmcgMSBpcyBvbmx5IHRydWUgYXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBpbmRpdmlkdWFsIGRldmlhdGVzIGFwcHJvYWNoZXMgbm9ybWFsaXR5LCBpLmUuIHRoZSB1c3VhbCAkXGxhbWJkYT41JCBydWxlcyBvZiB0aHVtYiBmb3IgUG9pc3NvbiB2YWx1ZXMgYW5kICRcdGV4dHJte21pbn0oTnAsIE4oMS1wKSkgPiA1JCBmb3IgYmlub21pYWwgdmFsdWVzIChlLmcuIHNlZSBAdmVuYWJsZXNfbW9kZXJuXzIwMDIsIFtwLiAyMDgtMjA5XShodHRwOi8vYm9va3MuZ29vZ2xlLmNvbS9ib29rcz9pZD05NzRjNHZLdXJOa0MmcGc9UEEyMDkpKS4gKEFuZCB0aGF0J3Mgd2l0aG91dCB0aGUgZXh0cmEgY29tcGxleGl0aWVzIGR1ZSB0byBHTE1NLCBpLmUuIHRoZSAiZWZmZWN0aXZlIiByZXNpZHVhbCBkZiBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIG1ha2UgdGhlIHN1bXMgb2Ygc3F1YXJlcyBjb252ZXJnZSBvbiBhICRcY2hpXjIkIGRpc3RyaWJ1dGlvbiAuLi4pCi0gUmVtZW1iZXIgdGhhdCAoMSkgb3ZlcmRpc3BlcnNpb24gaXMgaXJyZWxldmFudCBmb3IgbW9kZWxzIHRoYXQgZXN0aW1hdGUgYSBzY2FsZSBwYXJhbWV0ZXIgKGkuZS4gYWxtb3N0IGFueXRoaW5nIGJ1dCBQb2lzc29uIG9yIGJpbm9taWFsOiBHYXVzc2lhbiwgR2FtbWEsIG5lZ2F0aXZlIGJpbm9taWFsIC4uLikgYW5kICgyKSBvdmVyZGlzcGVyc2lvbiBpcyBub3QgZXN0aW1hYmxlIChhbmQgaGVuY2UgcHJhY3RpY2FsbHkgaXJyZWxldmFudCkgZm9yIEJlcm5vdWxsaSBtb2RlbHMgKD0gYmluYXJ5IGRhdGEgPSBiaW5vbWlhbCB3aXRoICROPTEkKS4KLSBUaGUgcmVjaXBlcyBiZWxvdyBtYXkgbmVlZCBhZGp1c3RtZW50IGZvciBzb21lIG9mIHRoZSBtb3JlIGNvbXBsZXggbW9kZWwgdHlwZXMgYWxsb3dlZCBieSBgZ2xtbVRNQmAgKGUuZy4gemVyby1pbmZsYXRpb24vdmFyaWFibGUgZGlzcGVyc2lvbiksIHdoZXJlIGl0J3MgbGVzcyBjbGVhciB3aGF0IHRvIG1lYXN1cmUgdG8gZXN0aW1hdGUgb3ZlcmRpc3BlcnNpb24uCgpUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHNob3VsZCB3b3JrIGZvciBhIHZhcmlldHkgb2YgbW9kZWwgdHlwZXMKKGF0IGxlYXN0IGBnbG1tQURNQmAsIGBnbG1tVE1CYCwgYGxtZTRgLCAuLi4pLgoKYGBge3Igb3ZlcmRpc3BfZnVufQpvdmVyZGlzcF9mdW4gPC0gZnVuY3Rpb24obW9kZWwpIHsKICAgIHJkZiA8LSBkZi5yZXNpZHVhbChtb2RlbCkKICAgIHJwIDwtIHJlc2lkdWFscyhtb2RlbCx0eXBlPSJwZWFyc29uIikKICAgIFBlYXJzb24uY2hpc3EgPC0gc3VtKHJwXjIpCiAgICBwcmF0IDwtIFBlYXJzb24uY2hpc3EvcmRmCiAgICBwdmFsIDwtIHBjaGlzcShQZWFyc29uLmNoaXNxLCBkZj1yZGYsIGxvd2VyLnRhaWw9RkFMU0UpCiAgICBjKGNoaXNxPVBlYXJzb24uY2hpc3EscmF0aW89cHJhdCxyZGY9cmRmLHA9cHZhbCkKfQpgYGAKCkV4YW1wbGU6CmBgYHtyIGxtZTQsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShsbWU0KQpsaWJyYXJ5KGdsbW1UTUIpCmBgYAoKYGBge3Igb3ZlcmRpc3BfZXgsY2FjaGU9VFJVRSxtZXNzYWdlPUZBTFNFfQpzZXQuc2VlZCgxMDEpICAKZCA8LSBkYXRhLmZyYW1lKHg9cnVuaWYoMTAwMCksCiAgICAgICAgICAgICAgICBmPWZhY3RvcihzYW1wbGUoMToxMCxzaXplPTEwMDAscmVwbGFjZT1UUlVFKSkpCnN1cHByZXNzTWVzc2FnZXMoZCR5IDwtIHNpbXVsYXRlKH54KygxfGYpLCBmYW1pbHk9cG9pc3NvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhPWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3cGFyYW1zPWxpc3QodGhldGE9MSxiZXRhPWMoMCwyKSkpW1sxXV0pCm0xIDwtIGdsbWVyKHl+eCsoMXxmKSxkYXRhPWQsZmFtaWx5PXBvaXNzb24pCm92ZXJkaXNwX2Z1bihtMSkKbTIgPC0gZ2xtbVRNQih5fngrKDF8ZiksZGF0YT1kLGZhbWlseT0icG9pc3NvbiIpCm92ZXJkaXNwX2Z1bihtMikKYGBgCgpUaGUgYGdvZmAgZnVuY3Rpb24gaW4gdGhlIGBhb2RzM2AgcHJvdmlkZXMgc2ltaWxhciBmdW5jdGlvbmFsaXR5CihpdCByZXBvcnRzIGJvdGggZGV2aWFuY2UtIGFuZCAkXGNoaV4yJC1iYXNlZCBlc3RpbWF0ZXMgb2YKb3ZlcmRpc3BlcnNpb24gYW5kIHRlc3RzKS4KCiMjIyBGaXR0aW5nIG1vZGVscyB3aXRoIG92ZXJkaXNwZXJzaW9uPwoKLSBxdWFzaWxpa2VsaWhvb2QgZXN0aW1hdGlvbjogW01BU1M6OmdsbW1QUUxdKGh0dHA6Ly9maW56aS5wc3ljaC51cGVubi5lZHUvUi9saWJyYXJ5L01BU1MvaHRtbC9nbG1tUFFMLmh0bWwpLiBRdWFzaS0gd2FzIGRlZW1lZCB1bnJlbGlhYmxlIGluIGBsbWU0YCwgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIChQYXJ0IG9mIHRoZSBwcm9ibGVtIHdhcyBxdWVzdGlvbmFibGUgbnVtZXJpY2FsIHJlc3VsdHMgaW4gc29tZSBjYXNlczsgdGhlIG90aGVyIHByb2JsZW0gd2FzIHRoYXQgREIgZmVsdCB0aGF0IGhlIGRpZCBub3QgaGF2ZSBhIHN1ZmZpY2llbnRseSBnb29kIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHRoZW9yZXRpY2FsIGZyYW1ld29yayB0aGF0IHdvdWxkIGV4cGxhaW4gd2hhdCB0aGUgYWxnb3JpdGhtIHdhcyBhY3R1YWxseSBlc3RpbWF0aW5nIGluIHRoaXMgY2FzZS4pIFtnZWVwYWNrOjpnZWVsZ21dKGh0dHA6Ly9maW56aS5wc3ljaC51cGVubi5lZHUvUi9saWJyYXJ5L2dlZXBhY2svaHRtbC9nZWVnbG0uaHRtbCkgbWF5IGJlIHdvcmthYmxlIChoYXZlbid0IHRyaWVkIGl0KQoKICAgIElmIHlvdSByZWFsbHkgd2FudCBxdWFzaS1saWtlbGlob29kIGFuYWx5c2lzIGZvciBgZ2xtZXJgIGZpdHMsIHlvdSBjYW4gZG8gaXQgeW91cnNlbGYgYnkgYWRqdXN0aW5nIHRoZQpjb2VmZmljaWVudCB0YWJsZSAtIGkuZS4sIGJ5IG11bHRpcGx5aW5nIHRoZSBzdGFuZGFyZCBlcnJvciBieSB0aGUgc3F1YXJlIHJvb3QKb2YgdGhlIGRpc3BlcnNpb24gZmFjdG9yIFteMl0gYW5kIHJlY29tcHV0aW5nIHRoZSAkWiQtIGFuZCAkcCQtdmFsdWVzCmFjY29yZGluZ2x5LCBhcyBmb2xsb3dzOgoKW14yXTogdGhlIGRpc3BlcnNpb24gZmFjdG9yIGlzIGVzdGltYXRlZCBvbiBhCnZhcmlhbmNlLCBzbyB3ZSBuZWVkIHRvIHRha2UgdGhlIHNxdWFyZSByb290IHRvIGFwcGx5IGl0IHRvIHRoZQpzdGFuZGFyZCBlcnJvcgoKYGBge3IgcXVhc2l9CiMjIGV4dHJhY3Qgc3VtbWFyeSB0YWJsZTsgeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZG8gdGhpcyB2aWEKIyMgIGJyb29tOjp0aWR5IG9yIGJyb29tLm1peGVkOjp0aWR5CnF1YXNpX3RhYmxlIDwtIGZ1bmN0aW9uKG1vZGVsLGN0YWI9Y29lZihzdW1tYXJ5KG1vZGVsKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoaT1vdmVyZGlzcF9mdW4obW9kZWwpWyJyYXRpbyJdKSB7CiAgICBxY3RhYiA8LSB3aXRoaW4oYXMuZGF0YS5mcmFtZShjdGFiKSwKICAgIHsgICBgU3RkLiBFcnJvcmAgPC0gYFN0ZC4gRXJyb3JgKnNxcnQocGhpKQogICAgICAgIGB6IHZhbHVlYCA8LSBFc3RpbWF0ZS9gU3RkLiBFcnJvcmAKICAgICAgICBgUHIoPnx6fClgIDwtIDIqcG5vcm0oYWJzKGB6IHZhbHVlYCksIGxvd2VyLnRhaWw9RkFMU0UpCiAgICB9KQogICAgcmV0dXJuKHFjdGFiKQp9CnByaW50Q29lZm1hdChxdWFzaV90YWJsZShtMSksZGlnaXRzPTMpCiMjIHRvIHVzZSB0aGlzIHdpdGggZ2xtbVRNQiwgd2UgbmVlZCB0byBzZXBhcmF0ZSBvdXQgdGhlCiMjICBjb25kaXRpb25hbCBjb21wb25lbnQgb2YgdGhlIHN1bW1hcnkKcHJpbnRDb2VmbWF0KHF1YXNpX3RhYmxlKG0yLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RhYj1jb2VmKHN1bW1hcnkobTIpKVtbImNvbmQiXV0pLAogICAgICAgICAgICAgZGlnaXRzPTMpCmBgYAoKQW5vdGhlciB2ZXJzaW9uLCB0aGlzIG9uZSB0aWR5dmVyc2UtY2VudHJpYzoKCmBgYHtyIHRpZHlxdWFzaSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShicm9vbS5taXhlZCkKbGlicmFyeShkcGx5cikKdGlkeV9xdWFzaSA8LSBmdW5jdGlvbihtb2RlbCwgcGhpPW92ZXJkaXNwX2Z1bihtb2RlbClbInJhdGlvIl0sCiAgICAgICAgICAgICAgICAgICAgICAgY29uZi5sZXZlbD0wLjk1KSB7CiAgICB0dCA8LSAodGlkeShtb2RlbCwgZWZmZWN0cz0iZml4ZWQiKQogICAgICAgICU+JSBtdXRhdGUoc3RkLmVycm9yPXN0ZC5lcnJvcipzcXJ0KHBoaSksCiAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWM9ZXN0aW1hdGUvc3RkLmVycm9yLAogICAgICAgICAgICAgICAgICAgcC52YWx1ZT0yKnBub3JtKGFicyhzdGF0aXN0aWMpLCBsb3dlci50YWlsPUZBTFNFKSkKICAgICkKICAgIHJldHVybih0dCkKfQp0aWR5X3F1YXNpKG0xKQp0aWR5X3F1YXNpKG0yKQpgYGAKClRoZXNlIGZ1bmN0aW9ucyBtYWtlIHNvbWUgc2ltcGxpZnlpbmcgYXNzdW1wdGlvbnM6ICgxKSB0aGlzIG92ZXJkaXNwZXJzaW9uIGNvbXB1dGF0aW9uIGlzIGFwcHJveGltYXRlCgpJbiB0aGlzIGNhc2UgdXNpbmcgcXVhc2ktbGlrZWxpaG9vZCBkb2Vzbid0IG1ha2UgbXVjaCBkaWZmZXJlbmNlLCBzaW5jZSB0aGUgZGF0YSB3ZSBzaW11bGF0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlIHdlcmUgUG9pc3Nvbi4pIEtlZXAgaW4gbWluZCB0aGF0IG9uY2UgeW91IHN3aXRjaCB0byBxdWFzaS1saWtlbGlob29kIHlvdSB3aWxsIGVpdGhlciBoYXZlIHRvIGVzY2hldyBpbmZlcmVudGlhbCBtZXRob2RzIHN1Y2ggYXMgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCwgcHJvZmlsZSBjb25maWRlbmNlIGludGVydmFscywgQUlDLCBldGMuLCBvciBtYWtlIG1vcmUgaGVyb2ljIGFzc3VtcHRpb25zIHRvIGNvbXB1dGUgInF1YXNpLSIgYW5hbG9ncyBvZiBhbGwgb2YgdGhlIGFib3ZlIChzdWNoIGFzIFFBSUMpLiAKCi0gb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdHMgKE9MUkU6IHRoaXMgYXBwcm9hY2ggc2hvdWxkIHdvcmsgaW4gbW9zdCBwYWNrYWdlcykuIElmIHlvdSB3YW50IHRvIGEgY2l0YXRpb24gZm9yIHRoaXMgYXBwcm9hY2gsIHRyeSBAZWxzdG9uX2FuYWx5c2lzXzIwMDEsIHdobyBjaXRlIEBsYXdzb25fZGlzZWFzZV8xOTk5OyBhcHBhcmVudGx5IHRoZXJlIGlzIGFsc28gYW4gZXhhbXBsZSBpbiBzZWN0aW9uIDEwLjUgb2YgQG1haW5kb25hbGRfZGF0YV8yMDEwLCBhbmQgKGFjY29yZGluZyB0byBhbiBSLXNpZy1taXhlZC1tb2RlbHMgcG9zdCkgdGhpcyBpcyBhbHNvIGRpc2N1c3NlZCBieSBAcmFiZWhlc2tldGhfbXVsdGlsZXZlbF8yMDA4LiBBbHNvIHNlZSBAYnJvd25lX3ZhcmlhbmNlXzIwMDUgZm9yIGFuIGV4YW1wbGUgaW4gdGhlIGJpbm9taWFsIGNvbnRleHQgKGkuZS4gbG9naXQtbm9ybWFsLWJpbm9taWFsIHJhdGhlciB0aGFuIGxvZ25vcm1hbC1Qb2lzc29uKS4gQWdyZXN0aSdzIGV4Y2VsbGVudCAoMjAwMikgYm9vayBAYWdyZXN0aV9jYXRlZ29yaWNhbF8yMDAyIGFsc28gZGlzY3Vzc2VzIHRoaXMgKHNlY3Rpb24gMTMuNSksIHJlZmVycmluZyBiYWNrIHRvIEBicmVzbG93X2V4dHJhcG9pc3Nvbl8xOTg0IGFuZCBAaGluZGVfY29tcG91bmRfMTk4Mi4gWyoqTm90ZXMqKjogKGEpIEkgaGF2ZW4ndCBjaGVja2VkIGFsbCB0aGVzZSByZWZlcmVuY2VzIG15c2VsZiwgKGIpIEkgY2FuJ3QgZmluZCB0aGUgcmVmZXJlbmNlIGFueSBtb3JlLCBidXQgSSBoYXZlIHNlZW4gaXQgc3RhdGVkIHRoYXQgb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdCBlc3RpbWF0aW9uIGlzIHByb2JhYmx5IGRvZGd5IGZvciBQUUwgYXBwcm9hY2hlcyBhcyB1c2VkIGluIEVsc3RvbiBldCBhbCAyMDAxXSAKLSBhbHRlcm5hdGl2ZSBkaXN0cmlidXRpb25zCiAgICAtIFBvaXNzb24tbG9nbm9ybWFsIG1vZGVsIGZvciBjb3VudHMgb3IgYmlub21pYWwtbG9naXQtTm9ybWFsIG1vZGVsIGZvciBwcm9wb3J0aW9ucyAoc2VlIGFib3ZlLCAib2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdHMiKQogICAgLSBuZWdhdGl2ZSBiaW5vbWlhbCBmb3IgY291bnRzIG9yIGJldGEtYmlub21pYWwgZm9yIHByb3BvcnRpb25zCiAgICAgICAgIC0gYGxtZTQ6OmdsbWVyLm5iKClgIHNob3VsZCBmaXQgYSBuZWdhdGl2ZSBiaW5vbWlhbCwgYWx0aG91Z2ggaXQgaXMgc29tZXdoYXQgc2xvdyBhbmQgZnJhZ2lsZSBjb21wYXJlZCB0byBzb21lIG9mIHRoZSBvdGhlciBtZXRob2RzIHN1Z2dlc3RlZCBoZXJlLiBgbG1lNGAgY2Fubm90IGZpdCBiZXRhLWJpbm9taWFsIG1vZGVscyAodGhlc2UgY2Fubm90IGJlIGZvcm11bGF0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBleHBvbmVudGlhbCBmYW1pbHkgb2YgZGlzdHJpYnV0aW9ucykKCSAgICAgLSBbZ2xtbVRNQl0oaHR0cHM6Ly9naXRodWIuY29tL2dsbW10bWIvZ2xtbVRNQi8pIHdpbGwgZml0IHR3byBwYXJhbWV0ZXJpemF0aW9ucyBvZiB0aGUgbmVnYXRpdmUgYmlub21pYWw6IGBmYW1pbHk9Im5iaW5vbTIiYCBnaXZlcyB0aGUgY2xhc3NpYyBwYXJhbWV0ZXJpemF0aW9uIHdpdGggJFxzaWdtYV4yPVxtdSgxK1xtdS9rKSQgKCJOQjIiIGluIEhhcmRpbiBhbmQgSGlsYmUncyB0ZXJtaW5vbG9neSkgd2hpbGUgYGZhbWlseT0ibmJpbm9tMSJgIGdpdmVzIGEgcGFyYW1ldGVyaXphdGlvbiB3aXRoICRcc2lnbWFeMj1ccGhpIFxtdSQsICRccGhpPjEkICgiTkIxIiB0byBIYXJkaW4gYW5kIEhpbGJlKS4gVGhlIGxhdHRlciBtaWdodCBhbHNvIGJlIGNhbGxlZCBhICJxdWFzaS1Qb2lzc29uIiBwYXJhbWV0ZXJpemF0aW9uIGJlY2F1c2UgaXQgbWF0Y2hlcyB0aGUgbWVhbi12YXJpYW5jZSByZWxhdGlvbnNoaXAgYXNzdW1lZCBieSBxdWFzaS1Qb2lzc29uIG1vZGVscywgaS5lLiB0aGUgdmFyaWFuY2UgaXMgc3RyaWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBtZWFuIChhbHRob3VnaCB0aGUgcHJvcG9ydGlvbmFsaXR5IGNvbnN0YW50IG11c3QgYmUgPjEsIGEgbGltaXRhdGlvbiB0aGF0IGRvZXMgbm90IGFwcGx5IHRvIHF1YXNpLWxpa2VsaWhvb2QgYXBwcm9hY2hlcykuIChbZ2xtbUFETUJdKGh0dHA6Ly9naXRodWIuY29tL2Jib2xrZXIvZ2xtbUFETUIvKSB3aWxsIGFsc28gZml0IHRoZXNlIG1vZGVscywgd2l0aCBgZmFtaWx5PSJuYmlub20iYCBmb3IgTkIyLCBidXQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2xtbVRNQi4pCgkgICAtIGBnbG1tVE1CYCBhbGxvd3MgYmV0YS1iaW5vbWlhbCBtb2RlbHMgKFtAaGFycmlzb25fY29tcGFyaXNvbl8yMDE1XSBzdWdnZXN0cyBjb21wYXJpbmcgYmV0YS1iaW5vbWlhbCB3aXRoIE9MUkUgbW9kZWxzIHRvIGFzc2VzcyByZWxpYWJpbGl0eSkKCSAgIC0gdGhlIGBicm1zYCBwYWNrYWdlIGhhcyBhIGBuZWdiaW5vbWlhbGAgZmFtaWx5IChubyBiZXRhLWJpbm9taWFsLCBidXQgaXQgZG9lcyBoYXZlIGEgd2lkZSByYW5nZSBvZiBvdGhlciBmYW1pbGllcykKLSBvdGhlciBwYWNrYWdlcy9hcHByb2FjaGVzIChsZXNzIHdpZGVseSB1c2VkLCBvciByZXF1aXJpbmcgYSBiaXQgbW9yZSBlZmZvcnQpCiAgICAtIGBnYW1sc3MubXg6Z2FtbHNzTlBgCiAgICAtIFdpbkJVR1MvSkFHUyAodmlhIFIyV2luQlVHUy9SamFncykKICAgIC0gQUQgTW9kZWwgQnVpbGRlciAocG9zc2libHkgdmlhIGBSMmFkbWJgIHBhY2thZ2UpIG9yIGBUTUJgCiAgICAtIGBnbmxtbWAgaW4gdGhlIGByZXBlYXRlZGAgcGFja2FnZSAoW29mZi1DUkFOXShodHRwOi8vd3d3LmNvbW1hbnN0ZXIuZXUvcmNvZGUuaHRtbCkpCiAgKiBbQVNSRU1MXShodHRwOi8vd3d3LmFzcmVtbC5jb20vc29mdHdhcmUvZ2Vuc3RhdC9odG1saGVscC9zZXJ2ZXIvR0xNTS5odG0pCgpOZWdhdGl2ZSBiaW5vbWlhbCBtb2RlbHMgaW4gYGdsbW1UTUJgIGFuZCBsb2dub3JtYWwtUG9pc3NvbiBtb2RlbHMgaW4gYGdsbWVyYCAob3IgYE1DTUNnbG1tYCkgYXJlIHByb2JhYmx5IHRoZSBiZXN0IHF1aWNrIGFsdGVybmF0aXZlcyBmb3Igb3ZlcmRpc3BlcnNlZCBjb3VudCBkYXRhLiBJZiB5b3UgbmVlZCB0byBleHBsb3JlIGFsdGVybmF0aXZlcyAoZGlmZmVyZW50IHZhcmlhbmNlLW1lYW4gcmVsYXRpb25zaGlwcywgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMpLCB0aGVuIGBBRE1CYCwgYFRNQmAsIGBXaW5CVUdTYCwgYFN0YW5gLCBgTklNQkxFYCBhcmUgdGhlIG1vc3QgZmxleGlibGUgYWx0ZXJuYXRpdmVzLgoKIyMjIFVuZGVyZGlzcGVyc2lvbgoKVW5kZXJkaXNwZXJzaW9uIChtdWNoICpsZXNzKiB2YXJpYWJpbGl0eSB0aGFuIGV4cGVjdGVkKSBpcyBhIGxlc3MgY29tbW9uIHByb2JsZW0gdGhhbiBvdmVyZGlzcGVyc2lvbi4KCi0gbWlsZCB1bmRlcmRpc3BlcnNpb24gaXMgc29tZXRpbWVzIGlnbm9yZWQsIHNpbmNlIGl0IHRlbmRzIGluIGdlbmVyYWwgdG8gbGVhZCB0byBjb25zZXJ2YXRpdmUgcmF0aGVyIHRoYW4gYW50aS1jb25zZXJ2YXRpdmUgcmVzdWx0cwotIHF1YXNpLWxpa2VsaWhvb2QgKGFuZCB0aGUgcXVhc2ktaGFjayBsaXN0ZWQgYWJvdmUpIGNhbiBoYW5kbGUgdW5kZXItIGFzIHdlbGwgYXMgb3ZlcmRpc3BlcnNpb24KLSBzb21lIG90aGVyIHNvbHV0aW9ucyBleGlzdCwgYnV0IGFyZSBsZXNzIHdpZGVseSBpbXBsZW1lbnRlZAogICAgLSBmb3IgZGlzdHJpYnV0aW9ucyB3aXRoIGEgc21hbGwgcmFuZ2UgKGUuZy4gbGl0dGVyIHNpemVzIG9mIGxhcmdlIG1hbW1hbHMpLCBvbmUgY2FuIHRyZWF0IHJlc3BvbnNlcyBhcyBvcmRpbmFsIChlLmcuIHVzaW5nIHRoZSBgb3JkaW5hbGAgcGFja2FnZSwgb3IgYE1DTUNnbG1tYCBvciBgYnJtc2AgZm9yIEJheWVzaWFuIHNvbHV0aW9ucykKICAgIC0gdGhlIENPTS1Qb2lzc29uIGRpc3RyaWJ1dGlvbiBhbmQgZ2VuZXJhbGl6ZWQgUG9pc3NvbiBkaXN0cmlidXRpb25zLCBpbXBsZW1lbnRlZCBpbiBgZ2xtbVRNQmAsIGNhbiBoYW5kbGUgdW5kZXJkaXNwZXJzaW9uIChKLiBIaWxiZSByZWNvbW1lbmRzIHRoZSBsYXR0ZXIgaW4gW3RoaXMgQ3Jvc3NWYWxpZGF0ZWQgYW5zd2VyXShodHRwczovL3N0YXRzLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy82NzM4NS93aGF0LWlzLXRoZS1hcHByb3ByaWF0ZS1tb2RlbC1mb3ItdW5kZXJkaXNwZXJzZWQtY291bnQtZGF0YSkpLiAoYFZHQU1gIGhhcyBhIGdlbmVyYWxpemVkIFBvaXNzb24gZGlzdHJpYnV0aW9uLCBidXQgZG9lc24ndCBoYW5kbGUgcmFuZG9tIGVmZmVjdHMuKQogICAgIAoKCiMjIEdhbW1hIEdMTU1zCgpXaGlsZSBvbmUgKHdlbGwsIE9LIEkpIHdvdWxkIG5haXZlbHkgdGhpbmsgdGhhdCBHTE1NcyB3aXRoIEdhbW1hIGRpc3RyaWJ1dGlvbnMgd291bGQgYmUganVzdCBhcyBlYXN5IChvciBoYXJkKSBhcyBhbnkgb3RoZXIgc29ydCBvZiBHTE1NcywgaXQgc2VlbXMgdGhhdCB0aGV5IGFyZSBpbiBmYWN0IGhhcmRlciB0byBpbXBsZW1lbnQuIEJhc2ljIHNpbXVsYXRlZCBleGFtcGxlcyBvZiBHYW1tYSBHTE1NcyBjYW4gZmFpbCBpbiBsbWU0IGRlc3BpdGUgYW5hbG9nb3VzIHByb2JsZW1zIHdpdGggUG9pc3NvbiwgYmlub21pYWwsIGV0Yy4gZGlzdHJpYnV0aW9ucy4gIFNvbHV0aW9uczoKLSB0aGUgZGVmYXVsdCBpbnZlcnNlIGxpbmsgc2VlbXMgcGFydGljdWxhcmx5IHByb2JsZW1hdGljOyB0cnkgb3RoZXIgbGlua3MgKGVzcGVjaWFsbHkgYGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKWApIGlmIHRoYXQgaXMgcG9zc2libGUvbWFrZXMgc2Vuc2UKLSBjb25zaWRlciB3aGV0aGVyIGEgbG9nbm9ybWFsIG1vZGVsIChpLmUuIGEgcmVndWxhciBMTU0gb24gbG9nZ2VkIGRhdGEpIHdvdWxkIHdvcmsvbWFrZXMgc2Vuc2UuCi0gQGxvX3RyYW5zZm9ybV8yMDE1IGFyZ3VlIHRoYXQgdGhlIEdhbW1hIGZhbWlseSB3aXRoIGFuICppZGVudGl0eSogbGluayBpcyBzdXBlcmlvciB0byBsb2dub3JtYWwgbW9kZWxzIGZvciByZWFjdGlvbi10aW1lIGRhdGEuIEkgKEJNQikgZG9uJ3QgZmluZCB0aGVpciBhcmd1bWVudCBwYXJ0aWN1bGFybHkgY29udmluY2luZywgYnV0IGxvdHMgb2YgcGVvcGxlIHdhbnQgdG8gZG8gdGhpcy4gVW5mb3J0dW5hdGVseSB0aGlzIGlzIHRlY2huaWNhbGx5IGNoYWxsZW5naW5nIChzZWUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9sbWU0L2xtZTQvaXNzdWVzLzU3MykpLCBiZWNhdXNlIGl0IGlzIGxpa2VseSB0aGF0IHNvbWUgImlsbGVnYWwiIHZhbHVlcyAocHJlZGljdGVkIHJlc3BvbnNlcyAkXGxlIDAkKSB3aWxsIG9jY3VyIHdoaWxlIGZpdHRpbmcgdGhlIG1vZGVsLCBldmVuIGlmIHRoZSBmaW5hbCBmaXR0ZWQgbW9kZWwgbWFrZXMgbm8gaW1wb3NzaWJsZSBwcmVkaWN0aW9ucy4gVGh1cyBzb21ldGhpbmcgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgbW9kZWwtZml0dGluZyBtYWNoaW5lcnkgdG9sZXJhbnQgb2Ygc3VjaCB2YWx1ZXMgKGkuZS4gcmV0dXJuaW5nIGBOQWAgZm9yIHRoZXNlIG1vZGVsIGV2YWx1YXRpb25zLCBvciBjbGFtcGluZyBpbGxlZ2FsIHZhbHVlcyB0byB0aGUgY29uc3RyYWluZWQgc3BhY2Ugd2l0aCBhbiBhcHByb3ByaWF0ZSBzbW9vdGggcGVuYWx0eSBmdW5jdGlvbikuCgpHYW1tYSBtb2RlbHMgY2FuIGJlIGZpdHRlZCBieSBhIHdpZGUgdmFyaWV0eSBvZiBwbGF0Zm9ybXMgKGBsbWU0OjpnbG1lcmAsIGBNQVNTOjpnbG1tUFFMYCwgYGdsbW1BRE1CYCwgYGdsbW1UTUJgLCBgTWl4ZWRNb2RlbHMuamxgLCBgTUNNQ2dsbW1gLCBgYnJtc2AgLi4uIG5vdCBzdXJlIGFib3V0IG90aGVycy4KCiMjIEJldGEgR0xNTXMKClByb3BvcnRpb24gZGF0YSB3aGVyZSB0aGUgZGVub21pbmF0b3IgKGUuZy4gbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uKSBpcyBub3Qga25vd24gY2FuIGJlIG1vZGVsZWQgdXNpbmcgYSBCZXRhIGRpc3RyaWJ1dGlvbi4gQHNtaXRoc29uX2JldHRlcl8yMDA2IGlzIGEgZ29vZCBpbnRyb2R1Y3Rpb24gZm9yIG5vbi1zdGF0aXN0aWNpYW5zICgqbm90KiBpbiB0aGUgbWl4ZWQtbW9kZWwgY2FzZSksIGFuZCB0aGUgYGJldGFyZWdgIHBhY2thZ2UgW0BjcmliYXJpLW5ldG9fYmV0YV8yMDA5XSBoYW5kbGVzICpub24qLW1peGVkIEJldGEgcmVncmVzc2lvbnMuIFRoZSBgZ2xtbVRNQmAgYW5kIGBicm1zYCBwYWNrYWdlcyBoYW5kbGUgQmV0YSBtaXhlZCBtb2RlbHMgKGBicm1zYCBhbHNvIGhhbmRsZXMgemVyby1pbmZsYXRlZCBhbmQgemVyby1vbmUgaW5mbGF0ZWQgbW9kZWxzKS4KCiMjIFplcm8taW5mbGF0aW9uCgpTZWUgZS5nLiBAbWFydGluX3plcm9fMjAwNSBvciBAd2FydG9uX21hbnlfMjAwNSAoIm1hbnkgemVyb3MgZG9lcyBub3QgbWVhbiB6ZXJvIGluZmxhdGlvbiIpIG9yIEB6dXVyX3plcm8tdHJ1bmNhdGVkXzIwMDkgZm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gb24gemVyby1pbmZsYXRpb24uCgojIyMgQ291bnQgZGF0YQoKLSBgTUNNQ2dsbW1gIGhhbmRsZXMgemVyby10cnVuY2F0ZWQsIHplcm8taW5mbGF0ZWQsIGFuZCB6ZXJvLWFsdGVyZWQgbW9kZWxzLCBhbHRob3VnaCBzcGVjaWZ5aW5nIHRoZSBtb2RlbHMgaXMgYSBsaXR0bGUgYml0IHRyaWNreTogc2VlIFNlY3Rpb25zIDUuMyB0byA1LjUgb2YgdGhlIFtDb3Vyc2VOb3RlcyB2aWduZXR0ZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL01DTUNnbG1tL3ZpZ25ldHRlcy9Db3Vyc2VOb3Rlcy5wZGYpCi0gYGdsbW1BRE1CYCBoYW5kbGVzIAogICAgLSB6ZXJvLWluZmxhdGVkIG1vZGVscyAod2l0aCBhIHNpbmdsZSB6ZXJvLWluZmxhdGlvbiBwYXJhbWV0ZXIgLS0gaS5lLiwgdGhlIGxldmVsIG9mIHplcm8taW5mbGF0aW9uIGlzIGFzc3VtZWQgY29uc3RhbnQgYWNyb3NzIHRoZSB3aG9sZSBkYXRhIHNldCkKICAgIC0gdHJ1bmNhdGVkIFBvaXNzb24gYW5kIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbnMgKHdoaWNoIGFsbG93cyB0d28tc3RhZ2UgZml0dGluZyBvZiBodXJkbGUgbW9kZWxzKQotIGBnbG1tVE1CYCBoYW5kbGVzIGEgdmFyaWV0eSBvZiBaLUkgYW5kIFotVCBtb2RlbHMgKGFsbG93cyBjb3ZhcmlhdGVzLCBhbmQgcmFuZG9tIGVmZmVjdHMsIGluIHRoZSB6ZXJvLWFsdGVyYXRpb24gbW9kZWwpCi0gYGJybXNgIGRvZXMgdG9vCi0gc28gZG9lcyBgR0xNTWFkYXB0aXZlYAotIEdhdmluIFNpbXBzb24gaGFzIGEgW2RldGFpbGVkIHdyaXRldXBdKGh0dHA6Ly93d3cuZnJvbXRoZWJvdHRvbW9mdGhlaGVhcC5uZXQvMjAxNy8wNS8wNC9jb21wYXJlLW1nY3Ytd2l0aC1nbG1tVE1CLykgc2hvd2luZyB0aGF0IGBtZ2N2OjpnYW0oKWAgY2FuIGRvIHNpbXBsZSBtaXhlZCBtb2RlbHMgKFBvaXNzb24sIG5vdCBOQikgd2l0aCB6ZXJvLWluZmxhdGlvbiwgYW5kIGNvbXBhcmluZyBgbWdjdmAgd2l0aCBgZ2xtbVRNQmAgcmVzdWx0cwotIGBnYW1sc3NOUGAgaW4gdGhlIGBnYW1sc3MubXhgIHBhY2thZ2Ugc2hvdWxkIGhhbmRsZSB6ZXJvLWluZmxhdGlvbiwgYW5kIHRoZSBgZ2FtbHNzLnRyYCBwYWNrYWdlIHNob3VsZCBoYW5kbGUgdHJ1bmNhdGVkIChpLmUuIGh1cmRsZSkgbW9kZWxzIC0tIGJ1dCBJIGhhdmVuJ3QgdHJpZWQgdGhlbQotIHJvbGwteW91ci1vd246IEFETUIvUjJhZG1iLCBXaW5CVUdTL1IyV2luQlVHUywgVE1CLCBTdGFuLCAuLi4gCgojIyMgQ29udGludW91cyBkYXRhCgpDb250aW51b3VzIGRhdGEgYXJlIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBtaXh0dXJlIG1vZGVsIGZvciB6ZXJvLWluZmxhdGVkIGRhdGEgaXMgbGVzcyByZWxldmFudCwgYmVjYXVzZSBvYnNlcnZhdGlvbnMgdGhhdCBhcmUgZXhhY3RseSB6ZXJvIG9jY3VyIHdpdGggKnByb2JhYmlsaXR5KiAoYnV0IG5vdCBwcm9iYWJpbGl0eSBkZW5zaXR5KSB6ZXJvLiBUaGVyZSBhcmUgdHdvIGNhc2VzIG9mIGludGVyZXN0OgoKIyMjIyBQcm9iYWJpbGl0eSBkZW5zaXR5IG9mICR4JCB6ZXJvIG9yIGluZmluaXRlCgpJbiB0aGlzIGNhc2UgemVybyBpcyBhIHByb2JsZW1hdGljIG9ic2VydmF0aW9uIGZvciB0aGUgZGlzdHJpYnV0aW9uOyBpdCdzIGVpdGhlciBpbXBvc3NpYmxlIG9yIGluZmluaXRlbHkgKGxvY2FsbHkpIGxpa2VseS4gU29tZSBleGFtcGxlczoKCi0gR2FtbWEgZGlzdHJpYnV0aW9uOiBwcm9iYWJpbGl0eSBkZW5zaXR5IGF0IHplcm8gaXMgaW5maW5pdGUgKGlmIHNoYXBlPDEpIG9yIHplcm8gKGlmIHNoYXBlPjEpOyBpdCdzIGZpbml0ZSBvbmx5IGZvciBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gKHNoYXBlPT0xKQotIExvZ25vcm1hbCBkaXN0cmlidXRpb246IHRoZSBwcm9iYWJpbGl0eSBkZW5zaXR5IGF0IHplcm8gaXMgemVyby4KLSBCZXRhIGRpc3RyaWJ1dGlvbjogdGhlIHByb2JhYmlsaXR5IGRlbnNpdGllcyBhdCAwIGFuZCAxIGFyZSB6ZXJvIChpZiB0aGUgY29ycmVzcG9uZGluZyBzaGFwZSBwYXJhbWV0ZXIgaXMgPjEpIG9yIGluZmluaXRlIChpZiBzaGFwZTwxKQoKVGhlIGJlc3Qgc29sdXRpb24gZGVwZW5kcyB2ZXJ5IG11Y2ggb24gdGhlIGRhdGEtZ2VuZXJhdGluZyBtZWNoYW5pc20uCgotIElmIHRoZSBiYWQgKDAvMSkgdmFsdWVzIGFyZSBnZW5lcmF0ZWQgYnkgcm91bmRpbmcgKGUuZy4gcHJvcG9ydGlvbnMgdGhhdCBhcmUgdG9vIGNsb3NlIHRvIHRoZSBib3VuZGFyaWVzIGFyZSByZXBvcnRlZCBhcyBiZWluZyBvbiB0aGUgYm91bmRhcmllcyksIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byAic3F1ZWV6ZSIgdGhlc2UgaW4gc2xpZ2h0bHksIGUuZy4gJHkgXHRvICh5ICthKS8yYSQgZm9yIHNvbWUgc2Vuc2libGUgdmFsdWUgb2YgJGEkIFtAc21pdGhzb25fYmV0dGVyXzIwMDZdCi0gSWYgeW91IHRoaW5rIHRoYXQgemVybyB2YWx1ZXMgYXJlIGdlbmVyYXRlZCBieSBhIHNlcGFyYXRlIHByb2Nlc3MsIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byBmaXQgYSBCZXJub3VsbGkgbW9kZWwgdG8gdGhlIHplcm8vbm9uLXplcm8gZGF0YSwgdGhlbiBhICpjb25kaXRpb25hbCogY29udGludW91cyBtb2RlbCBmb3IgdGhlIG5vbi16ZXJvIHZhbHVlczsgdGhpcyBpcyBlZmZlY3RpdmVseSBhICpodXJkbGUgbW9kZWwqLgotIHlvdSBtaWdodCBoYXZlICpjZW5zb3JlZCogZGF0YSB3aGVyZSBhbGwgdmFsdWVzIGJlbG93IGEgY2VydGFpbiBsaW1pdCAoZS5nLiBhIGRldGVjdGlvbiBsaW1pdCkgYXJlIHJlY29yZGVkIGFzIHplcm8uIFRoZSBUaGUgW2xtZWMgcGFja2FnZV0oaHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1sbWVjKSBoYW5kbGVzICpsaW5lYXIqIG1peGVkIG1vZGVsczsgYGJybXNgIGFuZCBgR0xNTWFkYXB0aXZlYCBib3RoIHByb3ZpZGUgc3VwcG9ydCBmb3IgY2Vuc29yZWQgZGF0YSBpbiBtaXhlZCBtb2RlbHMuCi0gVGhlIGBjcGxtYCBhbmQgYGdsbW1UTUJgIHBhY2thZ2VzIGhhbmRsZXMgJ1R3ZWVkaWUgY29tcG91bmQgUG9pc3NvbiBsaW5lYXIgbW9kZWxzJywgd2hpY2ggaW4gYSBwYXJ0aWN1bGFyIHJhbmdlIG9mIHBhcmFtZXRlcnMgYWxsb3dzIGZvciBza2V3ZWQgY29udGludW91cyByZXNwb25zZXMgd2l0aCBhIHNwaWtlIGF0IHplcm8KCiMjIyMgUHJvYmFiaWxpdHkgZGVuc2l0eSBvZiAkeCQgcG9zaXRpdmUgYW5kIGZpbml0ZQoKSW4gdGhpcyBjYXNlIChlLmcuIGEgc3Bpa2Ugb2YgemVyb3MgaW4gdGhlIGNlbnRlciBvZiBhbiBvdGhlcndpc2UgY29udGludW91cyBkaXN0cmlidXRpb24pLCB0aGUgaHVyZGxlIG1vZGVsIHByb2JhYmx5IG1ha2VzIHRoZSBtb3N0IHNlbnNlLgoKIyMjIFRlc3RzIGZvciB6ZXJvLWluZmxhdGlvbgoKLSB5b3UgY2FuIHVzZSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBiZXR3ZWVuIHRoZSByZWd1bGFyIGFuZCB6ZXJvLWluZmxhdGVkIHZlcnNpb24gb2YgdGhlIG1vZGVsLCBidXQgYmUgYXdhcmUgb2YgYm91bmRhcnkgaXNzdWVzIChzZWFyY2ggImJvdW5kYXJ5IiBlbHNld2hlcmUgb24gdGhpcyBwYWdlIC4uLikgLS0gdGhlIG51bGwgdmFsdWUgKG5vIHplcm8gaW5mbGF0aW9uKSBpcyBvbiB0aGUgYm91bmRhcnkgb2YgdGhlIGZlYXNpYmxlIHNwYWNlCi0geW91IGNhbiB1c2UgQUlDIG9yIHZhcmlhdGlvbnMsIHdpdGggdGhlIHNhbWUgY2F2ZWF0cwotIHlvdSBjYW4gdXNlIFZ1b25nJ3MgdGVzdCwgd2hpY2ggaXMgb2Z0ZW4gcmVjb21tZW5kZWQgZm9yIHRlc3RpbmcgemVyby1pbmZsYXRpb24gaW4gR0xNcywgYmVjYXVzZSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgdGhlIHZhcmlvdXMgbW9kZWwgZmxhdm9ycyB1bmRlciBjb25zaWRlcmF0aW9uIChodXJkbGUgdnMgemVyby1pbmZsYXRlZCB2cyAidmFuaWxsYSIpIGFyZSBub3QgbmVzdGVkLiBWdW9uZydzIHRlc3QgaXMgaW1wbGVtZW50ZWQgKGFuZCByZWZlcmVuY2VkKSBpbiB0aGUgYHBzY2xgIHBhY2thZ2UsIGJ1dCBub3QgZm9yIChHKUxNTXMuIEhvd2V2ZXIsIHRoZSBgbm9ubmVzdGAgcGFja2FnZSBwcm92aWRlcyBhbiBleGFtcGxlIChpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgbWVyRGVyaXZgIHBhY2thZ2UpIGZvciB1c2luZyBpdHMgYHZ1b25ndGVzdGAgZnVuY3Rpb24gd2l0aCBgbWVyTW9kYCBvYmplY3RzLiAoTWF5IGFsc28gd29yayB3aXRoIGBnbG1tVE1CYCwgaGF2ZW4ndCB0cmllZCBpdCAuLi4pCi0gdHdvIHVudGVzdGVkIGJ1dCByZWFzb25hYmxlIGFwcHJvYWNoZXM6CiAgICAtICB1c2UgYSBgc2ltdWxhdGUoKWAgbWV0aG9kIGlmIGl0IGV4aXN0cyB0byBjb25zdHJ1Y3QgYSBzaW11bGF0ZWQgZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHplcm9zIGV4cGVjdGVkIG92ZXJhbGwgZnJvbSB5b3VyIG1vZGVsLCBhbmQgY29tcGFyZSBpdCB0byB0aGUgb2JzZXJ2ZWQgcHJvcG9ydGlvbiBvZiB6ZXJvcyBpbiB0aGUgZGF0YSBzZXQKICAgIC0gY29tcHV0ZSB0aGUgcHJvYmFiaWxpdHkgb2YgYSB6ZXJvIGZvciBlYWNoIG9ic2VydmF0aW9uLiAgT24gdGhlIGJhc2lzIG9mIChjb25kaXRpb25hbGx5KSBpbmRlcGVuZGVudCBCZXJub3VsbGkgdHJpYWxzLCBjb21wdXRlIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgemVyb3MgYW5kIHRoZSBjb25maWRlbmNlIGludGVydmFscyAtLSBjb21wYXJlIGl0IHdpdGggdGhlIG9ic2VydmVkIG51bWJlci4KCiMjIFNwYXRpYWwgYW5kIHRlbXBvcmFsIGNvcnJlbGF0aW9uIG1vZGVscywgaGV0ZXJvc2NlZGFzdGljaXR5ICgiUi1zaWRlIiBtb2RlbHMpCgpJbiBgbmxtZWAgdGhlc2Ugc28tY2FsbGVkICoqUi1zaWRlKiogKFIgZm9yICJyZXNpZHVhbCIpIHN0cnVjdHVyZXMgYXJlIGFjY2Vzc2libGUgdmlhIHRoZSBgd2VpZ2h0c2AvYFZhclN0cnVjdGAgKGhldGVyb3NjZWRhc3RpY2l0eSkgYW5kIGBjb3JyZWxhdGlvbmAvYGNvclN0cnVjdGAgKHNwYXRpYWwgb3IgdGVtcG9yYWwgY29ycmVsYXRpb24pIGFyZ3VtZW50cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIGV4dGVuc2lvbiBpcyBhIGJpdCBoYXJkZXIgdGhhbiBpdCBtaWdodCBzZWVtLiBJbiBMTU1zIGl0IGlzIGEgbmF0dXJhbCBleHRlbnNpb24gdG8gYWxsb3cgdGhlIHJlc2lkdWFsIGVycm9yIHRlcm1zIHRvIGJlIGNvbXBvbmVudHMgb2YgYSBzaW5nbGUgbXVsdGl2YXJpYXRlIG5vcm1hbCBkcmF3OyBpZiB0aGF0IE1WTiBkaXN0cmlidXRpb24gaXMgdW5jb3JyZWxhdGVkIGFuZCBob21vc2NlZGFzdGljIChpLmUuIHByb3BvcnRpb25hbCB0byBhbiBpZGVudGl0eSBtYXRyaXgpIHdlIGdldCB0aGUgY2xhc3NpYyBtb2RlbCwgYnV0IHdlIGNhbiBpbiBwcmluY2lwbGUgYWxsb3cgaXQgdG8gYmUgY29ycmVsYXRlZCBhbmQvb3IgaGV0ZXJvc2NlZGFzdGljLgoKSXQgaXMgbm90IHRvbyBoYXJkIHRvIGRlZmluZSBtYXJnaW5hbCBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVzIHRoYXQgZG9uJ3QgbWFrZSBzZW5zZS4gIE9uZSBjbGFzcyBvZiByZWFzb25hYmx5IHNlbnNpYmxlIG1vZGVscyBpcyB0byBhbHdheXMgYXNzdW1lIGFuIG9ic2VydmF0aW9uLWxldmVsIHJhbmRvbSBlZmZlY3QgKGFzIE1DTUNnbG1tIGRvZXMgZm9yIGNvbXB1dGF0aW9uYWwgcmVhc29ucykgYW5kIHRvIGFsbG93IHRoYXQgcmFuZG9tIGVmZmVjdCB0byBiZSBNVk4gb24gdGhlIGxpbmsgc2NhbGUgKHNvIHRoYXQgdGhlIGZ1bGwgbW9kZWwgaXMgbG9nbm9ybWFsLVBvaXNzb24sIGxvZ2l0LW5vcm1hbCBiaW5vbWlhbCwgZXRjLiwgZGVwZW5kaW5nIG9uIHRoZSBsaW5rIGZ1bmN0aW9uIGFuZCBmYW1pbHkpLgoKRm9yIGV4YW1wbGUsIGEgcmVsYXRpdmVseSBzaW1wbGUgUG9pc3NvbiBtb2RlbCB3aXRoIHNwYXRpYWxseSBjb3JyZWxhdGVkIGVycm9ycyBtaWdodCBsb29rIGxpa2UgdGhpczoKCiQkClxiZWdpbntzcGxpdH0KXGV0YSAmIFxzaW0gXHRleHRybXtNVk59KGEgKyBiIHgsIFxTaWdtYSkgXFwKXFNpZ21hX3tpan0gJiA9IFxzaWdtYV4yIFxleHAoLWRfe2lqfS9zKSBcXAp5X2kgJiBcc2ltIFx0ZXh0cm17UG9pc3Nvbn0oXGxhbWJkYT1cZXhwKFxldGFfaSkpClxlbmR7c3BsaXR9CiQkCgpUaGF0IGlzLCB0aGUgbWFyZ2luYWwgZGlzdHJpYnV0aW9ucyBvZiB0aGUgcmVzcG9uc2UgdmFsdWVzIGFyZSBQb2lzc29uLWxvZ25vcm1hbCwgYnV0IG9uIHRoZSBsaW5rIChsb2cpIHNjYWxlIHRoZSBsYXRlbnQgTm9ybWFsIHZhcmlhYmxlcyB1bmRlcmx5aW5nIHRoZSByZXNwb25zZSBhcmUgKm11bHRpdmFyaWF0ZSogbm9ybWFsLCB3aXRoIGEgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggZGVzY3JpYmVkIGJ5IGFuIGV4cG9uZW50aWFsIHNwYXRpYWwgY29ycmVsYXRpb24gZnVuY3Rpb24gd2l0aCBzY2FsZSBwYXJhbWV0ZXIgJHMkLgoKSG93IGNhbiBvbmUgYWNoaWV2ZSB0aGlzPwoKLSBUaGVzZSB0eXBlcyBvZiBtb2RlbHMgYXJlIG5vdCBpbXBsZW1lbnRlZCBpbiBgbG1lNGAsIGZvciBlaXRoZXIgTE1NcyBvciBHTE1NczsgdGhleSBhcmUgZmFpcmx5IGxvdyBwcmlvcml0eSwgYW5kIGl0IGlzIGhhcmQgdG8gc2VlIGhvdyB0aGV5IGNvdWxkIGJlIGltcGxlbWVudGVkIGZvciBHTE1NcyAodGhlIGVxdWl2YWxlbnQgZm9yIExNTXMgaXMgdGVkaW91cyBidXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCB0byBpbXBsZW1lbnQpLgotIEZvciBMTU1zLCB5b3UgY2FuIHVzZSB0aGUgc3BhdGlhbC90ZW1wb3JhbCBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGJ1aWx0IGludG8gKG4pbG1lCi0gWW91IGNhbiB1c2UgdGhlIHNwYXRpYWwvdGVtcG9yYWwgY29ycmVsYXRpb24gc3RydWN0dXJlcyBhdmFpbGFibGUgZm9yIChuKWxtZSwgd2hpY2ggaW5jbHVkZSBiYXNpYyBnZW9zdGF0aXN0aWNhbCAoc3BhY2UpIGFuZCBBUk1BLXR5cGUgKHRpbWUpIG1vZGVscy4gCmBgYHtyIGZpbmRjb3JzLGV2YWw9RkFMU0V9CmxpYnJhcnkoc29zKQpmaW5kRm4oImNvclN0cnVjdCIpCmBgYApmaW5kcyBhZGRpdGlvbmFsIHBvc3NpYmlsaXRpZXMgaW4gdGhlIGByYW1wc2AgKGV4dGVuZGVkIGdlb3N0YXRpc3RpY2FsKSBhbmQgYGFwZWAgKHBoeWxvZ2VuZXRpYykgcGFja2FnZXMuCgotIFlvdSBjYW4gdXNlIHRoZXNlIHN0cnVjdHVyZXMgaW4gR0xNTXMgdmlhIGBNQVNTOjpnbG1tUFFMYCAoc2VlIERvcm1hbm4gZXQgYWwuKQotIGdlZXBhY2s6OmdlZWdsbQotIGdlb1IsIGdlb1JnbG0gKHBvd2VyIHRvb2xzKTsgdGhlc2UgYXJlIG1vc3RseSBkZXNpZ25lZCBmb3IgZml0dGluZyBzcGF0aWFsIHJhbmRvbSBmaWVsZCBHTE1NcyB2aWEgTUNNQyAtLSBub3Qgc3VyZSB0aGF0IHRoZXkgZG8gcmFuZG9tIGVmZmVjdHMgb3RoZXIgdGhhbiB0aGUgc3BhdGlhbCByYW5kb20gZWZmZWN0Ci0gW1ItSU5MQV0oaHR0cDovL3ItaW5sYS5vcmcpIChzdXBlci1wb3dlciB0b29sKQotIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBBRCBNb2RlbCBCdWlsZGVyIHRvIGZpdCBzcGF0aWFsIEdMTU1zLCBhcyBzaG93biBpbiB0aGVzZSBbQUQgTW9kZWwgQnVpbGRlciBleGFtcGxlc10oaHR0cDovL2FkbWItcHJvamVjdC5vcmcvZXhhbXBsZXMvc3BhdGlhbC1tb2RlbHMpOyB0aGlzIGNhcGFiaWxpdHkgaXMgbm90IGluIHRoZSBgZ2xtbUFETUJgIHBhY2thZ2UgKGFuZCBtYXkgbm90IGJlIGZvciBhIHdoaWxlISksIGJ1dCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBydW4gQUQgTW9kZWwgQnVpbGRlciB2aWEgdGhlIFIyYWRtYiBwYWNrYWdlIChyZXF1aXJlcyBpbnN0YWxsaW5nIC0tIGFuZCBsZWFybmluZyEgQURNQikKLSBbZ2VvQlVHU10oaHR0cDovL21hdGhzdGF0LmhlbHNpbmtpLmZpL29wZW5idWdzL01hbnVhbHMvR2VvQlVHUy9NYW51YWwuaHRtbCksIHRoZSBnZW9zdGF0aXN0aWNhbC9zcGF0aWFsIGNvcnJlbGF0aW9uIG1vZHVsZSBmb3IgV2luQlVHUywgaXMgYW5vdGhlciBhbHRlcm5hdGl2ZSAoYnV0IGFnYWluIHJlcXVpcmVzIGdvaW5nIG91dHNpZGUgb2YgUikKCiMjIFBlbmFsaXphdGlvbi9oYW5kbGluZyBjb21wbGV0ZSBzZXBhcmF0aW9uCgoqQ29tcGxldGUgc2VwYXJhdGlvbiogb2NjdXJzIGluIGEgYmluYXJ5LXJlc3BvbnNlIG1vZGVsIHdoZW4gdGhlcmUgaXMKc29tZSBsaW5lYXIgY29tYmluYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBwZXJmZWN0bHkgc2VwYXJhdGVzIGZhaWx1cmVzCmZyb20gc3VjY2Vzc2VzIC0gZm9yIGV4YW1wbGUsIHdoZW4gYWxsIG9mIHRoZSBvYnNlcnZhdGlvbnMgYXJlIHplcm8KZm9yIHNvbWUgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZiBjYXRlZ29yaWVzLiBUaGUgc3ltcHRvbXMgb2YgdGhpcwpwcm9ibGVtIGFyZSB1bnJlYWxpc3RpY2FsbHkgbGFyZ2UgcGFyYW1ldGVyIGVzdGltYXRlczsgcmlkaWN1bG91c2x5CmxhcmdlIFdhbGQgc3RhbmRhcmQgZXJyb3JzICh0aGUgKkhhdWNrLURvbm5lciBlZmZlY3QqKTsgYW5kIHZhcmlvdXMKd2FybmluZ3MuCgpJbiBwYXJ0aWN1bGFyLCBiaW5vbWlhbCBgZ2xtZXIoKWAgbW9kZWxzIHdpdGggY29tcGxldGUgc2VwYXJhdGlvbiBjYW4gbGVhZCB0bwoiRG93bmRhdGVkIFZ0ViBpcyBub3QgcG9zaXRpdmUgZGVmaW5pdGUiIChlLmcuIHNlZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2xtZTQvbG1lNC9pc3N1ZXMvNDgzKSkgb3IgIlBJUkxTIHN0ZXAtaGFsdmluZ3MgZmFpbGVkIHRvIHJlZHVjZSBkZXZpYW5jZSBpbiBwd3Jzc1VwZGF0ZSIgZXJyb3JzIChlLmcuIHNlZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2xtZTQvbG1lNC9pc3N1ZXMvMTc5I2lzc3VlY29tbWVudC00MjQ0NDUxODcpKS4gUm91Z2hseSBzcGVha2luZywgdGhlIGNvbXBsZXRlIHNlcGFyYXRpb24gaXMgbGlrZWx5IHRvIGFwcGVhciBldmVuIGlmIG9uZSBjb25zaWRlcnMgb25seSB0aGUgZml4ZWQgZWZmZWN0cyBwYXJ0IG9mIHRoZSBtb2RlbCAoY291bnRlcmFyZ3VtZW50cyBvciBjb3VudGVyZXhhbXBsZXMgd2VsY29tZSEpLCBzdWdnZXN0aW5nIHR3byBxdWljay1hbmQtZGlydHkgZGlhZ25vc3RpYyBtZXRob2RzLiBJZiBgZml4ZWRfZm9ybWAgaXMgdGhlIGZvcm11bGEgaW5jbHVkaW5nIG9ubHkgdGhlIGZpeGVkIGVmZmVjdHM6CgotIGBzdW1tYXJ5KGcxIDwtIGdsbShmaXhlZF9mb3JtLCBmYW1pbHk9Ymlub21pYWwsIGRhdGE9Li4uKSlgIHdpbGwgc2hvdyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHN5bXB0b21zOgogICAgIC0gd2FybmluZ3MgdGhhdCBgZ2xtLmZpdDogZml0dGVkIHByb2JhYmlsaXRpZXMgbnVtZXJpY2FsbHkgMCBvciAxIG9jY3VycmVkYAogICAgIC0gcGFyYW1ldGVyIGVzdGltYXRlcyBvZiBsYXJnZSBtYWduaXR1ZGUgKGUuZy4gYGFueShhYnMoZzEkY29lZmZpY2llbnRzKT44KWAsIGFzc3VtaW5nIHRoYXQgcHJlZGljdG9ycyBhcmUgZWl0aGVyIGNhdGVnb3JpY2FsIG9yIHNjYWxlZCB0byBoYXZlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgJFxhcHByb3ggMSQpCgkgLSBleHRyZW1lbHkgbGFyZ2UgV2FsZCBzdGFuZGFyZCBlcnJvcnMsIGFuZCBsYXJnZSBwLXZhbHVlcyAoKkhhdWNrLURvbm5lciBlZmZlY3QqKQoJIC0gdGhlIGBkZXRlY3RzZXBhcmF0aW9uYCBwYWNrYWdlIGhhcyBhIG1ldGhvZCBmb3IgZGV0ZWN0aW5nIGNvbXBsZXRlIHNlcGFyYXRpb246IGBsaWJyYXJ5KCJkZXRlY3RzZXBhcmF0aW9uIik7IHVwZGF0ZShnMSxtZXRob2Q9ImRldGVjdF9zZXBhcmF0aW9uIilgLiBUaGlzIHNob3VsZCBzYXkgd2hldGhlciBjb21wbGV0ZSBzZXBhcmF0aW9uIG9jY3VycywgYW5kIGluIHdoaWNoIChjb21iaW5hdGlvbnMgb2YpIHZhcmlhYmxlcywgZS5nLgoKYGBgClNlcGFyYXRpb246IFRSVUUgCkV4aXN0ZW5jZSBvZiBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGVzCihJbnRlcmNlcHQpICAgICAgaGVpZ2h0IAogICAgICAgIEluZiAgICAgICAgIEluZiAKMDogZmluaXRlIHZhbHVlLCBJbmY6IGluZmluaXR5LCAtSW5mOiAtaW5maW5pdHkKYGBgCgpJZiBjb21wbGV0ZSBzZXBhcmF0aW9uIGlzIG9jY3VycmluZyBiZXR3ZWVuIGNhdGVnb3JpZXMgb2YgYSBzaW5nbGUgY2F0ZWdvcmljYWwgZml4ZWQtZWZmZWN0IHByZWRpY3RvciB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIGxldmVscywgb25lIG9wdGlvbiB3b3VsZCBiZSB0byB0cmVhdCB0aGlzIGZpeGVkIGVmZmVjdCBhcyBhIHJhbmRvbSBlZmZlY3QsIHdoaWNoIHdpbGwgYWxsb3cgc29tZSBkZWdyZWUgb2Ygc2hyaW5rYWdlIHRvIHRoZSBtZWFuLiAoSXQgbWlnaHQgYmUgcmVhc29uYWJsZSB0byBzcGVjaWZ5IHRoZSB2YXJpYW5jZSBvZiB0aGlzIHRlcm0gKmEgcHJpb3JpKiB0byBhIGxhcmdlIHZhbHVlIFttaW5pbWFsIHNocmlua2FnZV0sIHJhdGhlciB0aGFuIHRyeWluZyB0byBlc3RpbWF0ZSBpdCBmcm9tIHRoZSBkYXRhLikKCigqKlRPRE8qKjogd29ya2VkIGV4YW1wbGUpCgpUaGUgZ2VuZXJhbCBhcHByb2FjaCB0byBoYW5kbGluZyBjb21wbGV0ZSBzZXBhcmF0aW9uIGluIGxvZ2lzdGljIHJlZ3Jlc3Npb24KaXMgY2FsbGVkICpwZW5hbGl6ZWQgcmVncmVzc2lvbio7IGl0J3MgYXZhaWxhYmxlIGluIHRoZSBgYnJnbG1gLApgYnJnbG0yYCwgYGxvZ2lzdGZgLCBhbmQgYHJtc2AgcGFja2FnZXMuIEhvd2V2ZXIsIHRoZXNlIHBhY2thZ2VzCmRvbid0IGhhbmRsZSBtaXhlZCBtb2RlbHMsIHNvIHRoZSBiZXN0IGF2YWlsYWJsZSAqZ2VuZXJhbCogYXBwcm9hY2ggaXMgdG8KdXNlIGEgQmF5ZXNpYW4gbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBzZXQgYSBwcmlvciBvbiB0aGUgZml4ZWQgZWZmZWN0cywKZS5nLiBhIEdhdXNzaWFuIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDM7IHRoaXMgY2FuIGJlIGRvbmUKaW4gYW55IG9mIHRoZSBCYXllc2lhbiBHTE1NIHBhY2thZ2VzIChlLmcuIGBibG1lYCwgYE1DTUNnbG1tYCwgYGJybXNgLCAuLi4pCihTZWUgW3N1cHBsZW1lbnRhcnkgbWF0ZXJpYWwgZm9yIEZveCBldCBhbC4gMjAxNl0oaHR0cDovL2Jib2xrZXIuZ2l0aHViLmlvL21peGVkbW9kZWxzLW1pc2MvZWNvc3RhdHNfY2hhcC5odG1sI2RpZ3Jlc3Npb24tY29tcGxldGUtc2VwYXJhdGlvbikgZm9yIGEgd29ya2VkIGV4YW1wbGUuKQoKIyMgTm9uLUdhdXNzaWFuIHJhbmRvbSBlZmZlY3RzCgpJJ20gbm90IGF3YXJlIG9mIGVhc3kgd2F5cyB0byBmaXQgbWl4ZWQgbW9kZWxzIHdpdGggbm9uLUdhdXNzaWFuIHJhbmRvbSBlZmZlY3RzIGRpc3RyaWJ1dGlvbnMgaW4gUiAoaS5lLiwgY29udmVuaWVudCwgZmxleGlibGUsIHdlbGwtdGVzdGVkIGltcGxlbWVudGF0aW9ucykuIEBtY2N1bGxvY2hfbWlzc3BlY2lmeWluZ18yMDExIGRpc2N1c3NlcyB3aGVuIHRoaXMgbWlzc3BlY2lmaWNhdGlvbiBtYXkgYmUgaW1wb3J0YW50LiBbVGhpcyBwcmVzZW50YXRpb25dKGh0dHBzOi8vbmlhc3JhLnVvdy5lZHUuYXUvY29udGVudC9ncm91cHMvcHVibGljL0B3ZWIvQGluZi9AbWF0aC9kb2N1bWVudHMvbW0vdW93MjM2Mjk2LnBkZikgZGlzY3Vzc2VzIHZhcmlvdXMgYXBwcm9hY2hlcyB0byBzb2x2aW5nIHRoZSBwcm9ibGVtIChlLmcuIHVzaW5nIGEgR2FtbWEgcmF0aGVyIHRoYW4gYSBOb3JtYWwgZGlzdHJpYnV0aW9uIG9mIFJFcyBpbiBsb2ctbGluayAgbW9kZWxzKS4gVGhlIGBzcGFNTWAgcGFja2FnZSBpbXBsZW1lbnRzIEgtbGlrZWxpaG9vZCBtb2RlbHMgW0BsZWVfZ2VuZXJhbGl6ZWRfMjAxN10sIGFuZCBjbGFpbXMgdG8gYWxsb3cgYSByYW5nZSBvZiByYW5kb20tZWZmZWN0cyBkaXN0cmlidXRpb25zIChwZXJoYXBzIG5vdCB3ZWxsIHRlc3RlZCB0aG91Z2ggLi4uKQoKSW4gcHJpbmNpcGxlIHlvdSBjYW4gaW1wbGVtZW50IGFueSByYW5kb20tZWZmZWN0cyBkaXN0cmlidXRpb24geW91IHdhbnQgaW4gYSBmdWxseSBjYXBhYmxlIEJheWVzaWFuIG1vZGVsaW5nIGxhbmd1YWdlIChlLmcuIEpBR1MvU3Rhbi9QeU1DL2V0Yy4pOyBzZWUgZS5nLiBbdGhpcyBTdGFja092ZXJmbG93IGFuc3dlcl0oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDU2NTY3MTQvdXNlci1kZWZpbmVkLXJhbmRvbS1pbnRlcmNlcHQtZGlzdHJpYnV0aW9uLWZvci1nbG1lciksIHdoaWNoIHVzZXMgdGhlIGByZXRoaW5raW5nYCBwYWNrYWdlJ3MgaW50ZXJmYWNlIHRvIFN0YW4uCgojIEVzdGltYXRpb24gCgojIyBXaGF0IG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBmaXQgKGVzdGltYXRlKSBHTE1Ncz8KCihhZGFwdGVkIGZyb20gQm9sa2VyIGV0IGFsIFRSRUUgMjAwOSkKCmBgYHtyIGdsbW10YWIsZWNobz1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KbWV0aHRhYiA8LSByZWFkLnRhYmxlKHNlcD0ifCIsaGVhZGVyPVRSVUUsdGV4dD0iCk1ldGhvZCB8IEFkdmFudGFnZXMgfCBEaXNhZHZhbnRhZ2VzIHwgUGFja2FnZXMKUGVuYWxpemVkIHF1YXNpLWxpa2VsaWhvb2QgfCBGbGV4aWJsZSwgd2lkZWx5IGltcGxlbWVudGVkIHwgTGlrZWxpaG9vZCBpbmZlcmVuY2UgbWF5IGJlIGluYXBwcm9wcmlhdGU7IGJpYXNlZCBmb3IgbGFyZ2UgdmFyaWFuY2Ugb3Igc21hbGwgbWVhbnMgfCBQUk9DIEdMSU1NSVggKFNBUyksIEdMTU0gKEdlblN0YXQpLCBnbG1tUFFMIChSOk1BU1MpLCBBU1JFTUwtUgpMYXBsYWNlIGFwcHJveGltYXRpb24gfCBNb3JlIGFjY3VyYXRlIHRoYW4gUFFMIHwgU2xvd2VyIGFuZCBsZXNzIGZsZXhpYmxlIHRoYW4gUFFMIHwgZ2xtZXIgKFI6bG1lNCxsbWU0YSksIGdsbW0uYWRtYiAoUjpnbG1tQURNQiksIElOTEEsIGdsbW1UTUIsIEFEIE1vZGVsIEJ1aWxkZXIsIEhMTSAKR2F1c3MtSGVybWl0ZSBxdWFkcmF0dXJlIHwgTW9yZSBhY2N1cmF0ZSB0aGFuIExhcGxhY2UgfCBTbG93ZXIgdGhhbiBMYXBsYWNlOyBsaW1pdGVkIHRvIDLigJEzIHJhbmRvbSBlZmZlY3RzIHwgUFJPQyBOTE1JWEVEIChTQVMpLCBnbG1lciAoUjpsbWU0LCBsbWU0YSksIGdsbW1NTCAoUjpnbG1tTUwpLCB4dGxvZ2l0IChTdGF0YSkKTWFya292IGNoYWluIE1vbnRlIENhcmxvIHwgSGlnaGx5IGZsZXhpYmxlLCBhcmJpdHJhcnkgbnVtYmVyIG9mIHJhbmRvbSBlZmZlY3RzOyBhY2N1cmF0ZSB8IFNsb3csIHRlY2huaWNhbGx5IGNoYWxsZW5naW5nLCBCYXllc2lhbiBmcmFtZXdvcmsgfCBNQ01DZ2xtbSAoUjpNQ01DZ2xtbSksIHJzdGFuYXJtIChSKSwgYnJtcyAoUiksIE1DTUNwYWNrIChSKSwgV2luQlVHUy9PcGVuQlVHUyAoUiBpbnRlcmZhY2U6IEJSdWdzL1IyV2luQlVHUyksIEpBR1MgKFIgaW50ZXJmYWNlOiByamFncy9SMmphZ3MpLCBBRCBNb2RlbCBCdWlsZGVyIChSIGludGVyZmFjZTogUjJhZG1iKSwgZ2xtbS5hZG1iIChwb3N0IGhvYyBNQ01DIGFmdGVyIExhcGxhY2UgZml0KSAoUjpnbG1tQURNQikiCikKc2V0LmFsaWdubWVudChkZWZhdWx0PSJsZWZ0IikKcGFuZGVyKG1ldGh0YWIsc3BsaXQudGFibGU9SW5mKQpgYGAKCiMjIFRyb3VibGVzaG9vdGluZwoKLSBkb3VibGUtY2hlY2sgdGhlIG1vZGVsIHNwZWNpZmljYXRpb24gYW5kIHRoZSBkYXRhIGZvciBtaXN0YWtlcwotIGNlbnRlciBhbmQgc2NhbGUgY29udGludW91cyBwcmVkaWN0b3IgdmFyaWFibGVzIChlLmcuIHdpdGggYHNjYWxlKClgKQotIHRyeSBhbGwgYXZhaWxhYmxlIG9wdGltaXplcnMgKGUuZy4gc2V2ZXJhbCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIEJPQllRQSBhbmQgTmVsZGVyLU1lYWQsIEwtQkZHUy1CIGZyb20gIGBvcHRpbWAsIGBubG1pbmIoKWAsIC4uLikuICBXaGlsZSB0aGlzIHdpbGwgb2YgY291cnNlIGJlIHNsb3cgZm9yIGxhcmdlIGZpdHMsIHdlIGNvbnNpZGVyIGl0IHRoZSBnb2xkIHN0YW5kYXJkOyBpZiBhbGwgb3B0aW1pemVycyBjb252ZXJnZSB0byB2YWx1ZXMgdGhhdCBhcmUgcHJhY3RpY2FsbHkgZXF1aXZhbGVudCAoaXQncyB1cCB0byB0aGUgdXNlciB0byBkZWNpZGUgd2hhdCAicHJhY3RpY2FsbHkgZXF1aXZhbGVudCBtZWFucyBmb3IgdGhlaXIgY2FzZSIpLCB0aGVuIHdlIHdvdWxkIGNvbnNpZGVyIHRoZSBtb2RlbCBmaXQgdG8gYmUgZ29vZCBlbm91Z2guIEZvciBleGFtcGxlOgpgYGB7ciBhbGxmaXQsZXZhbD1GQUxTRX0KbW9kZWxmaXQuYWxsIDwtIGxtZTQ6OmFsbEZpdChtb2RlbCkKc3MgPC0gc3VtbWFyeShtb2RlbGZpdC5hbGwpCmBgYAoKIyMjIENvbnZlcmdlbmNlIHdhcm5pbmdzCgpNb3N0IG9mIHRoZSBjdXJyZW50IGFkdmljZSBhYm91dCB0cm91Ymxlc2hvb3RpbmcgYGxtZTRgIGNvbnZlcmdlbmNlIHByb2JsZW1zIGNhbiBiZSBmb3VuZCBpbiB0aGUgaGVscCBwYWdlIGA/Y29udmVyZ2VuY2VgLiBUaGF0IHBhZ2UgZXhwbGFpbnMgdGhhdCB0aGUgY29udmVyZ2VuY2UgdGVzdHMgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBgbG1lNGAgKDEuMS0xMSwgRmVicnVhcnkgMjAxNikgZ2VuZXJhdGUgbG90cyBvZiBmYWxzZSBwb3NpdGl2ZXMuIFdlIGFyZSBjb25zaWRlcmluZyByYWlzaW5nIHRoZSBncmFkaWVudCB3YXJuaW5nIHRocmVzaG9sZCB0byAwLjAxIGluIGZ1dHVyZSByZWxlYXNlcyBvZiBgbG1lNGAuIEluIGFkZGl0aW9uIHRvIHRoZSBnZW5lcmFsIHRyb3VibGVzaG9vdGluZyB0aXBzIGFib3ZlOgoKLSBkb3VibGUtY2hlY2sgdGhlIEhlc3NpYW4gY2FsY3VsYXRpb24gd2l0aCB0aGUgbW9yZSBleHBlbnNpdmUgUmljaGFyZHNvbiBleHRyYXBvbGF0aW9uIG1ldGhvZCAoc2VlIGV4YW1wbGVzKQotIHJlc3RhcnQgdGhlIGZpdCBmcm9tIHRoZSBhcHBhcmVudCBvcHRpbXVtLCBvciBmcm9tIGEgcG9pbnQgcGVydHVyYmVkIHNsaWdodGx5IGF3YXkgZnJvbSB0aGUgb3B0aW11bSAoYGdldE1FKG1vZGVsLGMoInRoZXRhIiwiYmV0YSIpKWAgc2hvdWxkIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIGluIGEgZm9ybSBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIHRoZSBgc3RhcnRgIHBhcmFtZXRlcikKLSBhIGNvbW1vbiBlcnJvciBpcyB0byBzcGVjaWZ5IGFuIG9mZnNldCB0byBhIGxvZy1saW5rIG1vZGVsIGFzIGEgcmF3IHNlYXJjaGluZy1lZmZvcnQgdmFsdWUsIGkuZS4gYG9mZnNldChlZmZvcnQpYCByYXRoZXIgdGhhbiBgb2Zmc2V0KGxvZyhlZmZvcnQpKWAuIFdoaWxlIHRoZSBpbnRlbnRpb24gaXMgdG8gZml0IGEgbW9kZWwgd2hlcmUgJFx0ZXh0cm17Y291bnRzfSBccHJvcHRvIFx0ZXh0cm17ZWZmb3J0fSQsIHNwZWNpZnlpbmcgYG9mZnNldChlZmZvcnQpYCBsZWFkcyB0byBhIG1vZGVsIHdoZXJlICRcdGV4dHJte2NvdW50c30gXHByb3B0byBcZXhwKFx0ZXh0cm17ZWZmb3J0fSkkIGluc3RlYWQ7IGBleHAoZWZmb3J0KWAgaXMgb2Z0ZW4gYSBodWdlIChhbmQgbW9kZWwtZGVzdGFiaWxpemluZykgbnVtYmVyLgoKPGEgaWQ9InNpbmd1bGFyLWZpdCI+PC9hPgo8YSBpZD0iemVyby12YXJpYW5jZSI+PC9hPgoKPCEtLSBwcmVzZXJ2ZSBsaW5rIGJhc2VkIG9uIHByZXZpb3VzIHNlY3Rpb24gdGl0bGUgLS0+CjxhIGlkID0gInNpbmd1bGFyLW1vZGVscy1yYW5kb20tZWZmZWN0LXZhcmlhbmNlcy1lc3RpbWF0ZWQtYXMtemVyby1vci1jb3JyZWxhdGlvbnMtZXN0aW1hdGVkLWFzLS0tMSI+PC9hPgoKIyMjIFNpbmd1bGFyIGZpdHMKCkl0IGlzIHZlcnkgY29tbW9uIGZvciBvdmVyZml0dGVkIG1peGVkIG1vZGVscyB0byByZXN1bHQgaW4gc2luZ3VsYXIgZml0cy4gVGVjaG5pY2FsbHksIHNpbmd1bGFyaXR5IG1lYW5zIHRoYXQgdGhlIHJhbmRvbSBlZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGlzIG9mICpsZXNzIHRoYW4gZnVsbCByYW5rKi4gVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBkZXNjcmliZSB0aGlzLCBmcm9tIG1vcmUgdG8gbGVzcyB0ZWNobmljYWw6CgotIHNvbWUgb2YgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBhcmUgemVybywgb3IgZWZmZWN0aXZlbHkgemVybzsKLSBzb21lIGNvbWJpbmF0aW9ucyBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHJhbmRvbS1lZmZlY3RzIHZlY3RvciBhcmUgcGVyZmVjdGx5IG11bHRpY29sbGluZWFyOwotIHNvbWUgbGluZWFyIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBvZiB0aGUgcmFuZG9tLWVmZmVjdHMgdmVjdG9yIGhhdmUgemVybyB2YXJpYW5jZTsKLSBhbiAkbiBcdGltZXMgbiQgY292YXJpYW5jZSBtYXRyaXggY29ycmVzcG9uZHMgdG8gYW4gJG4kLWRpbWVuc2lvbmFsIGVsbGlwc29pZCB3aGVyZSB0aGUgbGVuZ3RocyBvZiB0aGUgbWFqb3IgYXhlcyBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBlaWdlbnZhbHVlczsgdGhlIGVsbGlwc29pZCBpcyAiZmxhdCIgaW4gc29tZSBkaXJlY3Rpb25zLCBlLmcuIGFuIGVsbGlwc2UgaGFzIGNvbGxhcHNlZCB0byBhIGxpbmUgc2VnbWVudAoKLSBJbiBzaW1wbGUgY2FzZXMgd2hlcmUgYSByYW5kb20gZWZmZWN0IHRlcm0gaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgdmFyaWFuY2UgKCpzY2FsYXIqIHJhbmRvbSBlZmZlY3RzKSwgdGhpcyBpcyByZWZsZWN0ZWQgaW4gYSB2YXJpYW5jZSBlc3RpbWF0ZSB0aGF0IGlzIHplcm8gb3IgbmVhciB6ZXJvLiBGdW5jdGlvbnMgc3VjaCBhcyBgbmxtZTo6bG1lKClgIG9yIGBnbG1tVE1CKClgIHRoYXQgZXN0aW1hdGUgdmFyaWFuY2VzIG9uIHRoZSBsb2cgc2NhbGUgd2lsbCBvZnRlbiAqbm90KiByZXBvcnQgYSBzaW5ndWxhciBmaXQsIGJ1dCB3aWxsIGluc3RlYWQgcmV0dXJuIGEgdmVyeSBzbWFsbCB2YWx1ZSAoMWUtNiBvciBsZXNzKSBmb3IgdGhlIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlOyBvbiB0aGUgbG9nIHNjYWxlLCB0aGlzIHdpbGwgY29ycmVzcG9uZCB0byBhIHBhcmFtZXRlciBlc3RpbWF0ZSB0aGF0IGlzIGEgbGFyZ2UgbmVnYXRpdmUgbnVtYmVyICZtZGFzaDsgYW5kLCB1c3VhbGx5LCB3YXJuaW5ncyBhYm91dCBub24tcG9zaXRpdmUtZGVmaW5pdGUgSGVzc2lhbnMgb3IgKGluIHRoZSBjYXNlIG9mIGBsbWUoKWApIHJpZGljdWxvdXNseSBsYXJnZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHJldHVybmVkIGJ5IGBpbnRlcnZhbHMoKWAuCi0gSW4gdGhlIGNhc2Ugb2YgYSB0d28tZGltZW5zaW9uYWwgcmFuZG9tIGVmZmVjdCAoc3VjaCBhcyBhIHJhbmRvbS1zbG9wZXMgbW9kZWwpLCB0aGlzIHR5cGljYWxseSBjb3JyZXNwb25kcyB0byBhIHBlcmZlY3QgKCsvLSAxKSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBzbG9wZSBhbmQgaW50ZXJjZXB0Ci0gaW4gaGlnaGVyLWRpbWVuc2lvbmFsIHJhbmRvbSBlZmZlY3RzIChzdWNoIGFzIHRoZSByYW5kb20gZWZmZWN0IG9mIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgd2l0aCBtb3JlIHRoYW4gdHdvIGxldmVscywgb3IgYSByYW5kb20tc2xvcGVzIG1vZGVsIHdpdGggbW9yZSB0aGFuIG9uZSBjb3ZhcmlhdGUpLCBpdCdzIHByZXR0eSBtdWNoIGltcG9zc2libGUgdG8gc2VlIGF0IGEgZ2xhbmNlIHRoYXQgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGlzIHNpbmd1bGFyLiBFeHRyYWN0aW5nIHRoZSBSRSBjb3ZhcmlhbmNlIG1hdHJpeCBhbmQgY29tcHV0aW5nIGl0cyBlaWdlbnZhbHVlcyAodGhpcyBpcyB3aGF0IGByZVBDQWAgaW4gdGhlIGBsbWU0YCBwYWNrYWdlIGRvZXMpIHdpbGwgdGVsbCB5b3UuIEluIHRoZSBwYXJ0aWN1bGFyIGNhc2Ugb2YgYGxtZTRgLCBzaW5ndWxhcml0eSBpcyBkZXRlY3RhYmxlIGJ5IHNlZWluZyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSAkXGJvbGRzeW1ib2wgXHRoZXRhJCAodmFyaWFuY2UtY292YXJpYW5jZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uKSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byBkaWFnb25hbCBlbGVtZW50cyBhcmUgKG5lYXIpIHplcm87IHRoaXMgaXMgd2hhdCBgP2lzU2luZ3VsYXJgIGRvZXMuCgpTaW5ndWxhciBmaXRzIGNvbW1vbmx5IG9jY3VyIGluIHR3byBzY2VuYXJpb3M6CgotIHNtYWxsIG51bWJlcnMgb2YgcmFuZG9tLWVmZmVjdCBsZXZlbHMgKGUuZy4gPDUpLCBhcyBpbGx1c3RyYXRlZCBpbiBbdGhlc2Ugc2ltdWxhdGlvbnNdKGh0dHA6Ly9ycHVicy5jb20vYmJvbGtlci80MTg3KSBhbmQgZGlzY3Vzc2VkIChpbiBhIHNvbWV3aGF0IGRpZmZlcmVudCwgQmF5ZXNpYW4gY29udGV4dCkgYnkgQGdlbG1hbl9wcmlvcl8yMDA2LgotIGNvbXBsZXggcmFuZG9tLWVmZmVjdHMgbW9kZWxzLCBlLmcuIG1vZGVscyBvZiB0aGUgZm9ybSBgKGZ8ZylgIHdoZXJlIGBmYCBpcyBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHdpdGggYSByZWxhdGl2ZWx5IGxhcmdlIG51bWJlciBvZiBsZXZlbHMsIG9yIG1vZGVscyB3aXRoIHNldmVyYWwgZGlmZmVyZW50IHJhbmRvbS1zbG9wZXMgdGVybXMuCgotIEluIGBNQ01DZ2xtbWAsIHNpbmd1bGFyIG9yIG5lYXItc2luZ3VsYXIgZml0cyB3aWxsIHByb3Zva2UgYW4gZXJyb3IgYW5kIGEgcmVxdWlyZW1lbnQgdG8gc3BlY2lmeSBhIHN0cm9uZ2VyIHByaW9yLgoKQXQgcHJlc2VudCB0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIHN0cm9uZyBvcGluaW9ucyBhYm91dCBob3cgdG8gcmVzb2x2ZSBzdWNoIHByb2JsZW1zLCB3aGljaCBhcmUgc29tZXRpbWVzIGNvbmZsYXRlZCB3aXRoIHRoZSBnZW5lcmFsIHByb2JsZW0gb2YgaG93IHRvIGRlY2lkZSBvbiB0aGUgYXBwcm9wcmlhdGUgY29tcGxleGl0eSBvZiB0aGUgcmFuZG9tLWVmZmVjdHMgY29tcG9uZW50IG9mIGEgbW9kZWwuIEJyaWVmbHk6CgotIElmIGEgdmFyaWFuY2UgY29tcG9uZW50IGlzIHplcm8sIGRyb3BwaW5nIGl0IGZyb20gdGhlIG1vZGVsIHdpbGwgaGF2ZSBubyBlZmZlY3Qgb24gYW55IG9mIHRoZSBlc3RpbWF0ZWQgcXVhbnRpdGllcyAoYWx0aG91Z2ggaXQgd2lsbCBhZmZlY3QgdGhlIEFJQywgYXMgdGhlIHZhcmlhbmNlIHBhcmFtZXRlciBpcyBjb3VudGVkIGV2ZW4gdGhvdWdoIGl0IGhhcyBubyBlZmZlY3QpLiBAcGFzY2hfaW50ZXJzcGVjaWZpY18yMDEzIGdpdmVzIG9uZSBleGFtcGxlIHdoZXJlIHJhbmRvbSBlZmZlY3RzIHdlcmUgZHJvcHBlZCBiZWNhdXNlIHRoZSB2YXJpYW5jZSBjb21wb25lbnRzIHdlcmUgY29uc2lzdGVudGx5IGVzdGltYXRlZCBhcyB6ZXJvLiBDb252ZXJzZWx5LCBpZiBvbmUgY2hvb3NlcyBmb3IgcGhpbG9zb3BoaWNhbCBncm91bmRzIHRvIHJldGFpbiB0aGVzZSAKcGFyYW1ldGVycywgaXQgd29uJ3QgY2hhbmdlIGFueSBvZiB0aGUgYW5zd2Vycy4KLSBAYmFycl9yYW5kb21fMjAxMyBzdWdnZXN0IGFsd2F5cyBzdGFydGluZyB3aXRoIHRoZSBtYXhpbWFsIG1vZGVsIChpLmUuIHRoZSBtb3N0IHJhbmRvbS1lZmZlY3RzIGNvbXBvbmVudCBvZiB0aGUgbW9kZWwgdGhhdCBpcyAqdGhlb3JldGljYWxseSogaWRlbnRpZmlhYmxlIGdpdmVuIHRoZSBleHBlcmltZW50YWwgZGVzaWduKSBhbmQgdGhlbiBkcm9wcGluZyB0ZXJtcyB3aGVuIHNpbmd1bGFyaXR5IG9yIG5vbi1jb252ZXJnZW5jZSBvY2N1cnMgKHBsZWFzZSBzZWUgdGhlIHBhcGVyIGZvciBkZXRhaWxlZCByZWNvbW1lbmRhdGlvbnMgLi4uKQotIEBtYXR1c2NoZWtfYmFsYW5jaW5nXzIwMTcgYW5kIEBiYXRlc19wYXJzaW1vbmlvdXNfMjAxNSBkaXNhZ3JlZSwgc3VnZ2VzdGluZyB0aGF0IG1vZGVscyBzaG91bGQgYmUgc2ltcGxpZmllZCAqYSBwcmlvcmkqIHdoZW5ldmVyIHBvc3NpYmxlLiBJbiBwYXJ0aWN1bGFyLCB0aGV5IHN1Z2dlc3QgJHAkLXZhbHVlLWJhc2VkIHN0ZXB3aXNlIHJlZHVjdGlvbiBvZiB0aGUgcmFuZG9tIGVmZmVjdHMgbW9kZWwgdXNpbmcgYSBsb29zZSAkcCQtdmFsdWUgY3JpdGVyaW9uIChlLmcuICRcYWxwaGFfe1x0ZXh0IExSVH0gPSAwLjIkKS4gVGhleSBhbHNvIHByb3ZpZGUgW3Rvb2xzXShodHRwczovL2dpdGh1Yi5jb20vZG1iYXRlcy9SZVBzeWNoTGluZykgZm9yIGRpYWdub3NpbmcgYW5kIG1pdGlnYXRpbmcgc2luZ3VsYXJpdHkuCi0gT25lIGFsdGVybmF0aXZlIChzdWdnZXN0ZWQgYnkgUm9iZXJ0IExhQnVkZGUpIGZvciB0aGUgc21hbGwtbnVtYmVycy1vZi1sZXZlbHMgc2NlbmFyaW8gaXMgdG8gImZpdCB0aGUgbW9kZWwgd2l0aCB0aGUgcmFuZG9tIGZhY3RvciBhcyBhIGZpeGVkIGVmZmVjdCwgZ2V0IHRoZSBsZXZlbCBjb2VmZmljaWVudHMgaW4gdGhlIHN1bSB0byB6ZXJvIGZvcm0sIGFuZCB0aGVuIGNvbXB1dGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzLiIgVGhpcyBpcyBhcHByb3ByaWF0ZSBmb3IgdXNlcnMgd2hvIGFyZSAoYSkgcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4gbWVhc3VyaW5nIHZhcmlhdGlvbiAoaS5lLiB0aGUgcmFuZG9tIGVmZmVjdHMgYXJlIG5vdCBqdXN0IG51aXNhbmNlIHBhcmFtZXRlcnMsIGFuZCB0aGUgdmFyaWFiaWxpdHkgW3JhdGhlciB0aGFuIHRoZSBlc3RpbWF0ZWQgdmFsdWVzIGZvciBlYWNoIGxldmVsXSBpcyBvZiBzY2llbnRpZmljIGludGVyZXN0KSwgKGIpIHVuYWJsZSBvciB1bndpbGxpbmcgdG8gdXNlIG90aGVyIGFwcHJvYWNoZXMgKGUuZy4gTUNNQyB3aXRoIGhhbGYtQ2F1Y2h5IHByaW9ycyBpbiBXaW5CVUdTKSwgKGMpIHVuYWJsZSBvciB1bndpbGxpbmcgdG8gY29sbGVjdCBtb3JlIGRhdGEuIEZvciB0aGUgc2ltcGxlc3QgY2FzZSAoYmFsYW5jZWQsIG9ydGhvZ29uYWwsIG5lc3RlZCBkZXNpZ25zIHdpdGggbm9ybWFsIGVycm9ycykgdGhlc2UgZXN0aW1hdGVzIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgc2hvdWxkIGVxdWFsIHRoZSBjbGFzc2ljYWwgbWV0aG9kLW9mLW1vbWVudHMgZXN0aW1hdGVzLgotIEJheWVzaWFuIGFwcHJvYWNoZXMgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIGluZm9ybWF0aXZlIHByaW9yIHRoYXQgYXZvaWRzIHNpbmd1bGFyaXR5LgogICAgLSBUaGUgYGJsbWVgIHBhY2thZ2UgW0BjaHVuZ19ub25kZWdlbmVyYXRlXzIwMTNdIHByb3ZpZGVzIGEgd3JhcHBlciBmb3IgdGhlIGBsbWU0YCBtYWNoaW5lcnkgdGhhdCBhZGRzIGEgcGFydGljdWxhciBmb3JtIG9mIHdlYWsgcHJpb3IgdG8gZ2V0IGFuIGFwcHJveGltYXRlIGEgQmF5ZXNpYW4gbWF4aW11bSAqYSBwb3N0ZXJpb3JpKiBlc3RpbWF0ZSB0aGF0IGF2b2lkcyBzaW5ndWxhcml0eS4KICAgIC0gVGhlIGBNQ01DZ2xtbWAgcGFja2FnZSBhbGxvd3MgZm9yIHByaW9ycyBvbiB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXgKCS0gVGhlIGByc3RhbmFybWAgYW5kIGBicm1zYCBwYWNrYWdlcyBwcm92aWRlIHdyYXBwZXJzIGZvciB0aGUgU3RhbiBIYW1pbHRvbmlhbiBNQ01DIGVuZ2luZSB0aGF0IGZpdCBHTE1NcyB2aWEgYGxtZTRgIHN5bnRheCwgYWdhaW4gYWxsb3dpbmcgYSB2YXJpZXR5IG9mIHByaW9ycyB0byBiZSBzZXQuCgojIyMgU2V0dGluZyByZXNpZHVhbCB2YXJpYW5jZXMgdG8gYSBmaXhlZCB2YWx1ZSAoemVybyBvciBvdGhlcikKCkZvciBzb21lIHByb2JsZW1zIGl0IHdvdWxkIGJlIGNvbnZlbmllbnQgdG8gYmUgYWJsZSB0byBzZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlIHRlcm0gdG8gemVybywgb3IgYSBmaXhlZCB2YWx1ZS4gVGhpcyBpcyBkaWZmaWN1bHQgaW4gYGxtZTRgLCBiZWNhdXNlIHRoZSBtb2RlbCBpcyBwYXJhbWV0ZXJpemVkIGludGVybmFsbHkgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSByZXNpZHVhbCB2YXJpYW5jZSBpcyBwcm9maWxlZCBvdXQgKGkuZS4sIGNhbGN1bGF0ZWQgZGlyZWN0bHkgZnJvbSBhIHJlc2lkdWFsIGRldmlhbmNlIHRlcm0pIGFuZCB0aGUgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2VzIGFyZSBzY2FsZWQgYnkgdGhlIHJlc2lkdWFsIHZhcmlhbmNlLgoKW1NlYXJjaGluZyB0aGUgci1zaWctbWl4ZWQtbW9kZWxzIGxpc3QgZm9yICJmaXggcmVzaWR1YWwgdmFyaWFuY2UiXShodHRwczovL3d3dy5nb29nbGUuY2Evc2VhcmNoP3E9c2l0ZSUzQSUyRiUyRnN0YXQuZXRoei5jaCUyRnBpcGVybWFpbCUyRnItc2lnLW1peGVkLW1vZGVscyUyRitmaXgrcmVzaWR1YWwrdmFyaWFuY2UpCgotIFRoaXMgaXMgZG9uZSBpbiB0aGUgYG1ldGFmb3JgIHBhY2thZ2UsIGZvciBtZXRhLWFuYWx5dGljIG1vZGVscwotIFlvdSBjYW4gdXNlIHRoZSBgYmxtZWAgcGFja2FnZSB0byBmaXggdGhlIHJlc2lkdWFsIHZhcmlhbmNlOiBmcm9tIFZpbmNlbnQgRG9yaWUsCmBgYApsaWJyYXJ5KGJsbWUpCmJsbWVyKGZvcm11bGEgPSB5IH4gMSArICgxIHwgZ3JvdXApLCB3ZWlnaHRzID0gViwKICAgICAgcmVzaWQucHJpb3IgPSBwb2ludCgxLjApLCBjb3YucHJpb3IgPSBOVUxMKQpgYGAKVGhpcyBzZXRzIHRoZSByZXNpZHVhbCB2YXJpYW5jZSB0byAxLjAuICBZb3UgKmNhbm5vdCogdXNlIHRoaXMgdG8gbWFrZSBpdApleGFjdGx5IHplcm8sIGJ1dCB5b3UgY2FuIG1ha2UgaXQgdmVyeSBzbWFsbCAoYW5kIGV4cGVyaW1lbnQgd2l0aCBzZXR0aW5nCml0IHRvIGRpZmZlcmVudCBzbWFsbCB2YWx1ZXMsIGUuZy4gMC4wMDEgdnMgMC4wMDAxLCB0byBzZWUgaG93IHNlbnNpdGl2ZQp0aGUgcmVzdWx0cyBhcmUpLgotIFNpbWlsYXJseSwgeW91IGNhbiBmaXggdGhlIHJlc2lkdWFsIHZhcmlhbmNlIHRvIGEgc21hbGwgcG9zaXRpdmUgdmFsdWUgaW4gYFtuXWxtZWAgdmlhIHRoZSBgY29udHJvbCgpYCBhcmd1bWVudCBbQGhlaXN0ZXJrYW1wX3VwZGF0ZV8yMDE3XToKYGBge3IgbG1lX3p2YXIscmVzdWx0cz0iaGlkZSJ9Cm5sbWU6OmxtZShSZWFjdGlvbn5EYXlzLHJhbmRvbT1+MXxTdWJqZWN0LAogICAgICAgICAgZGF0YT1sbWU0OjpzbGVlcHN0dWR5LAogICAgICAgICAgY29udHJvbD1saXN0KHNpZ21hPTFlLTgpKQpgYGAKLSB0aGUgYGdsbW1UTUJgIHBhY2thZ2UgY2FuIHNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2UgdG8gKGFwcHJveGltYXRlbHkpIHplcm8sIGJ5IHNwZWNpZnlpbmcgYGRpc3Bmb3JtdWxhID0gfjBgIChpbiBmYWN0IHRoZSB2YWx1ZSBjYW4gYmUgc2V0IHZpYSBgZ2xtbVRNQkNvbnRyb2woemVyb2Rpc3BfdmFsPS4uLilgOyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBgbG9nKHNxcnQoLk1hY2hpbmUkZG91YmxlLmVwcykpYCkKLSBUaGVyZSBpcyBhbiBbcnJCbHVwTWV0aG9kNiBwYWNrYWdlXShodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPXJyQmx1cE1ldGhvZDYpIG9uIENSQU4gKCJSZS1wYXJhbWV0cml6YXRpb24gb2YgbWl4ZWQgbW9kZWwgZm9ybXVsYXRpb24gdG8gYWxsb3cgZm9yIGEgZml4ZWQgcmVzaWR1YWwgdmFyaWFuY2Ugd2hlbiB1c2luZyBSUi1CTFVQIGZvciBnZW5vbVtlXXdpZGUgZXN0aW1hdGlvbiBvZiBtYXJrZXIgZWZmZWN0cyIpLCBidXQgaXQgc2VlbXMgZmFpcmx5IHNwZWNpYWwtcHVycG9zZS4KLSBpdCBtaWdodCBiZSBwb3NzaWJsZSAqaW4gcHJpbmNpcGxlKiB0byBhZGFwdCBgbG1lNGAncyBpbnRlcm5hbCBgZGV2ZnVuMigpYCBmdW5jdGlvbiAodXNlZCBpbiB0aGUgbGlrZWxpaG9vZCBwcm9maWxpbmcgY29tcHV0YXRpb24gZm9yIExNTXMpLCB3aGljaCB1c2VzIGEgc3BlY2lmaWVkIHZhbHVlIG9mIHRoZSByZXNpZHVhbCBzdGFuZGFyZCBkZXZpYXRpb24gaW4gY29tcHV0aW5nIGxpa2VsaWhvb2QsIGJ1dCBhcyBAYmF0ZXNfZml0dGluZ18yMDE1IHNheToKCj4gVGhlIHJlc3VsdGluZyBmdW5jdGlvbiBpcyBub3QgdXNlZnVsIGZvciBnZW5lcmFsIG5vbmxpbmVhciBvcHRpbWl6YXRpb24g4oCUIG9uZSBjYW4gZWFzaWx5IHdhbmRlciBpbnRvIHBhcmFtZXRlciByZWdpbWVzIGNvcnJlc3BvbmRpbmcgdG8gaW5mZWFzaWJsZSAobm9uLXBvc2l0aXZlIHNlbWlkZWZpbml0ZSkgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaWNlcyDigJQgYnV0IGl0IHNlcnZlcyBmb3IgbGlrZWxpaG9vZCBwcm9maWxpbmcsIHdoZXJlIG9uZSBmb2NhbCBwYXJhbWV0ZXIgaXMgdmFyaWVkIGF0IGEgdGltZSBhbmQgdGhlIG9wdGltaXphdGlvbiBvdmVyIHRoZSBvdGhlciBwYXJhbWV0ZXJzIGlzIGxpa2VseSB0byBzdGFydCBjbG9zZSB0byBhbiBvcHRpbXVtLgoKIyMjIE90aGVyIHByb2JsZW1zL2BsbWU0YCBlcnJvciBtZXNzYWdlcwoKTW9zdCBvZiB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2VzIGFyZSByZWxhdGl2ZWx5IHVudXN1YWwsIGFuZCBoYXBwZW4gbW9zdGx5IHdpdGggY29tcGxleC9sYXJnZS91bnN0YWJsZSBtb2RlbHMuIFRoZXJlIGlzIG9mdGVuIG5vIHNpbXBsZSBmaXg7IHRoZSBzdGFuZGFyZCBzdWdnZXN0aW9ucyBmb3IgdHJvdWJsZXNob290aW5nIGFyZSAoMSkgdHJ5IHJlc2NhbGluZyBhbmQvb3IgY2VudGVyaW5nIHByZWRpY3RvcnM7ICgyKSBzZWUgaWYgYSBzaW1wbGVyIG1vZGVsIGNhbiBiZSBtYWRlIHRvIHdvcms7ICgzKSBsb29rIGZvciBzZXZlcmUgbGFjayBvZiBiYWxhbmNlIGFuZC9vciBjb21wbGV0ZSBzZXBhcmF0aW9uIGluIHRoZSBkYXRhIHNldC4KCi0gYFBJUkxTIHN0ZXAtaGFsdmluZ3MgZmFpbGVkIHRvIHJlZHVjZSBkZXZpYW5jZSBpbiBwd3Jzc1VwZGF0ZWAKCS0gdGhpcyBjYW4gYWxzbyBvY2N1ciBkdWUgdG8gY29tcGxldGUgb3IgcXVhc2ktY29tcGxldGUgc2VwYXJhdGlvbiAoc2VlIFtQZW5hbGl6YXRpb24vaGFuZGxpbmcgY29tcGxldGUgc2VwYXJhdGlvbl0oI3BlbmFsaXphdGlvbmhhbmRsaW5nLWNvbXBsZXRlLXNlcGFyYXRpb24pCiAgICAtIFdoZW4gdXNpbmcgYGxtZTRgIHRvIGZpdCBHTE1NcyB3aXRoIGxpbmsgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGF1dG9tYXRpY2FsbHkgY29uc3RyYWluIHRoZSByZXNwb25zZSB0byB0aGUgYWxsb3dhYmxlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb25hbCBmYW1pbHkgKGUuZy4gYmlub21pYWwgbW9kZWxzIHdpdGggYSBsb2cgbGluaywgd2hlcmUgdGhlIGVzdGltYXRlZCBwcm9iYWJpbGl0eSBjYW4gYmUgPjEsIG9yIGludmVyc2UtR2FtbWEgbW9kZWxzLCB3aGVyZSB0aGUgZXN0aW1hdGVkIG1lYW4gY2FuIGJlIG5lZ2F0aXZlKSwgaXQgaXMgbm90IHVudXN1YWwgdG8gZ2V0IHRoaXMgZXJyb3IuICBUaGlzIG9jY3VycyBiZWNhdXNlIGBsbWU0YCBkb2Vzbid0IGRvIGFueXRoaW5nIHRvIGNvbnN0cmFpbiB0aGUgcHJlZGljdGVkIHZhbHVlcywgc28gYE5hTmAgdmFsdWVzIHBvcCB1cCwgd2hpY2ggYXJlbid0IGhhbmRsZWQgZ3JhY2VmdWxseS4gSWYgcG9zc2libGUsIHN3aXRjaCB0byBhIGxpbmsgZnVuY3Rpb24gdG8gb25lIHRoYXQgY29uc3RyYWlucyB0aGUgcmVzcG9uc2UgKGUuZy4gbG9naXQgbGluayBmb3IgYmlub21pYWwgb3IgbG9nIGxpbmsgZm9yIEdhbW1hKS4KCS0gb3RoZXJ3aXNlIHRoaXMgbWVzc2FnZSBvZnRlbiBvY2N1cnMgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgZWxzZSB3cm9uZyB3aXRoIHRoZSBtb2RlbCBvciBkYXRhLCBlLmcuIAoJICAgICAgLSBbYSBtb2RlbCBmaXR0ZWQgdG8gdW5kZXJkaXNwZXJzZWQgZGF0YSBpbmNsdWRlcyBib3RoIGEgbmVnYXRpdmUgYmlub21pYWwgcmVzcG9uc2UgYW5kIG9ic2VydmF0aW9uLWxldmVsIHJhbmRvbSBlZmZlY3RzXShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODAzNjMzNC91c2luZy1nbG1lci1uYi10aGUtZXJyb3ItbWVzc2FnZW1heHN0ZXBoYWxmaXQtcGlybHMtc3RlcC1oYWx2aW5ncy1mYWlsZWQtdCkKCQkgIC0gW25lZ2F0aXZlIHJlc3BvbnNlIHZhbHVlcyBmb3IgYSBsaW5rIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCBhbGxvdyB0aGVtXShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzUzMzgyNS9lcnJvci1tYXhzdGVwaGFsZml0LXBpcmxzLXN0ZXAtaGFsdmluZ3MtZmFpbGVkLXRvLXJlZHVjZS1kZXZpYW5jZS1pbi1wd3Jzc3VwZCkKLSBgRG93bmRhdGVkIFZ0ViBpcyBub3QgcG9zaXRpdmUgZGVmaW5pdGVgOiBubyBzcGVjaWZpYyBhZHZpY2UsIHNlZSBnZW5lcmFsIHN1Z2dlc3Rpb25zIGFib3ZlCi0gYGNvbnZlcmdlbmNlIGNvZGUgMyBmcm9tIGJvYnlxYTogYm9ieXFhIC0tIGEgdHJ1c3QgcmVnaW9uIHN0ZXAgZmFpbGVkIHRvIHJlZHVjZSBxYDogYWdhaW4gbm8gc3BlY2lmaWMgYWR2aWNlIGFib3V0IGZpeGluZyB0aGlzLCBhbHRob3VnaCB0aGVyZSBpcyBhIFt1c2VmdWwgZGlzY3Vzc2lvbiBvZiB0aGUgbWVhbmluZyBvZiB0aGUgZXJyb3IgbWVzc2FnZSBvbiBDcm9zc1ZhbGlkYXRlZF0oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvODk5NDUvbWVhbmluZy1vZi1hLWNvbnZlcmdlbmNlLXdhcm5pbmctaW4tZ2xtZXIpCgojIyBSRU1MIGZvciBHTE1NcwoKLSBXaGlsZSByZXN0cmljdGVkIG1heGltdW0gbGlrZWxpaG9vZCAoUkVNTCkgcHJvY2VkdXJlcyAoW1dpa2lwZWRpYV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZXN0cmljdGVkX21heGltdW1fbGlrZWxpaG9vZCkgYXJlIHdlbGwgZXN0YWJsaXNoZWQgZm9yIGxpbmVhciBtaXhlZCBtb2RlbHMsIGl0IGlzIGxlc3MgY2xlYXIgaG93IG9uZSBzaG91bGQgZGVmaW5lIGFuZCBjb21wdXRlIHRoZSBlcXVpdmFsZW50IGNyaXRlcmlhIChpbnRlZ3JhdGluZyBvdXQgdGhlIGVmZmVjdHMgb2YgZml4ZWQgcGFyYW1ldGVycykgZm9yIEdMTU1zLiBAbWlsbGFyX21heGltdW1fMjAxMSBhbmQgQGJlcmdlcl9pbnRlZ3JhdGVkXzE5OTkgYXJlIHBvc3NpYmxlIHN0YXJ0aW5nIHBvaW50cyBpbiB0aGUgcGVlci1yZXZpZXdlZCBsaXRlcmF0dXJlLCBhbmQgdGhlcmUgYXJlIG1haWxpbmctbGlzdCBkaXNjdXNzaW9ucyBvZiB0aGVzZSBpc3N1ZXMgW2hlcmVdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLXNpZy1taXhlZC1tb2RlbHMvMjAwOXExLzAwMjEwNC5odG1sKSBhbmQgW2hlcmVdKGh0dHA6Ly9saXN0cy5hZG1iLXByb2plY3Qub3JnL3BpcGVybWFpbC91c2Vycy8yMDExLUp1bmUvMDAxMjI0Lmh0bWwpLgotIEF0dGVtcHRpbmcgdG8gdXNlIGBSRU1MPVRSVUVgIHdpdGggYGdsbWVyYCB3aWxsIHByb2R1Y2UgdGhlIHdhcm5pbmcgYGV4dHJhIGFyZ3VtZW50KHMpIOKAmFJFTUzigJkgZGlzcmVnYXJkZWRgCi0gYGdsbW1UTUJgIGFsbG93cyBgUkVNTD1UUlVFYCBmb3IgR0xNTXMgKGl0IHVzZXMgdGhlIExhcGxhY2UgYXBwcm94aW1hdGlvbiB0byBpbnRlZ3JhdGUgb3ZlciB0aGUgZml4ZWQgZWZmZWN0IHBhcmFtZXRlcnMpLCBzaW5jZSB2ZXJzaW9uIDAuMi4yIAoKIyBNb2RlbCBkaWFnbm9zdGljcwoKIyBJbmZlcmVuY2UgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCgojIyBUZXN0aW5nIGh5cG90aGVzZXMKCiMjIyBXaGF0IGFyZSB0aGUgcC12YWx1ZXMgbGlzdGVkIGJ5IGBzdW1tYXJ5KGdsbWVyZml0KWAgZXRjLj8gIEFyZSB0aGV5IHJlbGlhYmxlPwoKQnkgZGVmYXVsdCwgaW4ga2VlcGluZyB3aXRoIHRoZSB0cmFkaXRpb24gaW4gYW5hbHlzaXMgb2YgZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVscywgYGxtZTRgIGFuZCBzaW1pbGFyIHBhY2thZ2VzIGRpc3BsYXkgdGhlIFdhbGQgWi1zdGF0aXN0aWNzIGZvciBlYWNoIHBhcmFtZXRlciBpbiB0aGUgbW9kZWwgc3VtbWFyeS4gVGhlc2UgaGF2ZSBvbmUgYmlnIGFkdmFudGFnZTogdGhleSdyZSBjb252ZW5pZW50IHRvIGNvbXB1dGUuICBIb3dldmVyLCB0aGV5IGFyZSBhc3ltcHRvdGljIGFwcHJveGltYXRpb25zLCBhc3N1bWluZyBib3RoIHRoYXQgKDEpIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBtdWx0aXZhcmlhdGUgbm9ybWFsIChvciBlcXVpdmFsZW50bHkgdGhhdCB0aGUgbG9nLWxpa2VsaWhvb2Qgc3VyZmFjZSBpcyBxdWFkcmF0aWMpIGFuZCB0aGF0ICgyKSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBsb2ctbGlrZWxpaG9vZCBpcyAocHJvcG9ydGlvbmFsIHRvKSAkXGNoaV4yJC4gIFRoZSBzZWNvbmQgYXBwcm94aW1hdGlvbiBpcyBkaXNjdXNzZWQgZnVydGhlciB1bmRlciAiRGVncmVlcyBvZiBmcmVlZG9tIi4gIFRoZSBmaXJzdCBhc3N1bXB0aW9uIHVzdWFsbHkgcmVxdWlyZXMgYW4gZXZlbiBncmVhdGVyIGxlYXAgb2YgZmFpdGgsIGFuZCBpcyBrbm93biB0byBjYXVzZSBwcm9ibGVtcyBpbiBzb21lIGNvbnRleHRzIChmb3IgYmlub21pYWwgbW9kZWxzIGZhaWx1cmVzIG9mIHRoaXMgYXNzdW1wdGlvbiBhcmUgY2FsbGVkIHRoZSAqSGF1Y2stRG9ubmVyIGVmZmVjdCopLCBlc3BlY2lhbGx5IHdpdGggZXh0cmVtZS12YWx1ZWQgcGFyYW1ldGVycy4KCiMjIyBNZXRob2RzIGZvciB0ZXN0aW5nIHNpbmdsZSBwYXJhbWV0ZXJzCgpGcm9tIHdvcnN0IHRvIGJlc3Q6CgotIFdhbGQgJFokLXRlc3RzCi0gKipGb3IgYmFsYW5jZWQsIG5lc3RlZCBMTU1zKiogd2hlcmUgZGVncmVlcyBvZiBmcmVlZG9tIGNhbiBiZSBjb21wdXRlZCBhY2NvcmRpbmcgdG8gY2xhc3NpY2FsIHJ1bGVzOiBXYWxkICR0JC10ZXN0cyAKLSBMaWtlbGlob29kIHJhdGlvIHRlc3QsIGVpdGhlciBieSBzZXR0aW5nIHVwIHRoZSBtb2RlbCBzbyB0aGF0IHRoZSBwYXJhbWV0ZXIgY2FuIGJlIGlzb2xhdGVkL2Ryb3BwZWQgKHZpYSBgYW5vdmFgIG9yIGBkcm9wMWAsIG9yIHZpYSBjb21wdXRpbmcgbGlrZWxpaG9vZCBwcm9maWxlcwotIE1hcmtvdiBjaGFpbiBNb250ZSBDYXJsbyAoTUNNQykgb3IgcGFyYW1ldHJpYyBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMKCiMjIyBUZXN0cyBvZiBlZmZlY3RzIChpLmUuIHRlc3RpbmcgdGhhdCBzZXZlcmFsIHBhcmFtZXRlcnMgYXJlIHNpbXVsdGFuZW91c2x5IHplcm8pCgpGcm9tIHdvcnN0IHRvIGJlc3Q6CgotIFdhbGQgY2hpLXNxdWFyZSB0ZXN0cyAoZS5nLiBgY2FyOjpBbm92YWApCi0gTGlrZWxpaG9vZCByYXRpbyB0ZXN0ICh2aWEgYGFub3ZhYCBvciBgZHJvcDFgKQotICoqRm9yIGJhbGFuY2VkLCBuZXN0ZWQgTE1NcyoqIHdoZXJlIGRmIGNhbiBiZSBjb21wdXRlZDogY29uZGl0aW9uYWwgRi10ZXN0cyAKLSAqKkZvciBMTU1zKio6IGNvbmRpdGlvbmFsIEYtdGVzdHMgd2l0aCBkZiBjb3JyZWN0aW9uIChlLmcuIEtlbndhcmQtUm9nZXIgaW4gYHBia3J0ZXN0YCBwYWNrYWdlOiBzZWUgbm90ZXMgb24gSy1SIGV0YyBbYmVsb3ddKCNkZGYpLiAKLSBNQ01DIG9yIHBhcmFtZXRyaWMsIG9yIG5vbnBhcmFtZXRyaWMsIGJvb3RzdHJhcCBjb21wYXJpc29ucyAobm9ucGFyYW1ldHJpYyBib290c3RyYXBwaW5nIG11c3QgYmUgaW1wbGVtZW50ZWQgY2FyZWZ1bGx5IHRvIGFjY291bnQgZm9yIGdyb3VwaW5nIGZhY3RvcnMpCgojIyMgSXMgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCByZWxpYWJsZSBmb3IgbWl4ZWQgbW9kZWxzPwoKLSBJdCBkZXBlbmRzLgotIE5vdCBmb3IgZml4ZWQgZWZmZWN0cyBpbiBmaW5pdGUtc2l6ZSBjYXNlcyAoc2VlIEBwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDApOiBtYXkgZGVwZW5kIG9uICdkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20nIChudW1iZXIgb2YgZ3JvdXBzKSBhbmQvb3IgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgLSB0b3RhbCBudW1iZXIgb2YgcGFyYW1ldGVycwotIENvbmRpdGlvbmFsIEYtdGVzdHMgYXJlIHByZWZlcnJlZCBmb3IgTE1NcywgKippZioqIGRlbm9taW5hdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbSBhcmUga25vd24KCjxhIGlkPSJkZGYiPjwvYT4KCiMjIyBXaHkgZG9lc24ndCBgbG1lNGAgZGlzcGxheSBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20vcCB2YWx1ZXM/ICBXaGF0IG90aGVyIG9wdGlvbnMgZG8gSSBoYXZlPwoKVGhlcmUgaXMgYW4gW1IgRkFRIGVudHJ5XShodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnL2RvYy9GQVEvUi1GQVEuaHRtbCNXaHktYXJlLXBfMDAyZHZhbHVlcy1ub3QtZGlzcGxheWVkLXdoZW4tdXNpbmctbG1lcl8wMDI4XzAwMjlfMDAzZikgb24gdGhpcyB0b3BpYywgd2hpY2ggbGlua3MgdG8gYSBbbWFpbGluZyBsaXN0IHBvc3RdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLWhlbHAvMjAwNi1NYXkvMDk0NzY1Lmh0bWwpIGJ5IERvdWcgQmF0ZXMgKHRoZXJlIGlzIGFsc28gYSB2b2x1bWlub3VzIFttYWlsaW5nIGxpc3QgdGhyZWFkXShodHRwOi8vcndpa2kuc2Npdmlld3Mub3JnL2Rva3UucGhwP2lkPWd1aWRlczpsbWVyLXRlc3RzKSByZXByb2R1Y2VkIG9uIHRoZSBSIHdpa2kpLiBUaGUgYm90dG9tIGxpbmUgaXMgCgotIEZvciBzcGVjaWFsIGNhc2VzIHRoYXQgY29ycmVzcG9uZCB0byBjbGFzc2ljYWwgZXhwZXJpbWVudGFsIGRlc2lnbnMgKGkuZS4gYmFsYW5jZWQgZGVzaWducyB0aGF0IGFyZSBuZXN0ZWQsIHNwbGl0LXBsb3QsIHJhbmRvbWl6ZWQgYmxvY2ssIGV0Yy4pIC4uLiB3ZSBjYW4gc2hvdyB0aGF0IHRoZSBudWxsIGRpc3RyaWJ1dGlvbnMgb2YgcGFydGljdWxhciByYXRpb3Mgb2Ygc3VtcyBvZiBzcXVhcmVzIGZvbGxvdyBhbiAkRiQgZGlzdHJpYnV0aW9uIHdpdGgga25vd24gbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20gKGFuZCBoZW5jZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBvZiBwYXJ0aWN1bGFyIGNvbnRyYXN0cyBhcmUgdC1kaXN0cmlidXRlZCB3aXRoIGtub3duIGRmKS4gSW4gbW9yZSBjb21wbGljYXRlZCBzaXR1YXRpb25zICh1bmJhbGFuY2VkLCBHTE1NcywgY3Jvc3NlZCByYW5kb20gZWZmZWN0cywgbW9kZWxzIHdpdGggdGVtcG9yYWwgb3Igc3BhdGlhbCBjb3JyZWxhdGlvbiwgZXRjLikgaXQgaXMgbm90IGluIGdlbmVyYWwgY2xlYXIgdGhhdCB0aGUgbnVsbCBkaXN0cmlidXRpb24gb2YgdGhlIGNvbXB1dGVkIHJhdGlvIG9mIHN1bXMgb2Ygc3F1YXJlcyBpcyByZWFsbHkgYW4gRiBkaXN0cmlidXRpb24sIGZvciAqYW55KiBjaG9pY2Ugb2YgZGVub21pbmF0b3IgZGVncmVlcyBvZiBmcmVlZG9tLgotIEZvciBlYWNoIHNpbXBsZSBkZWdyZWVzLW9mLWZyZWVkb20gcmVjaXBlIHRoYXQgaGFzIGJlZW4gc3VnZ2VzdGVkICh0cmFjZSBvZiB0aGUgaGF0IG1hdHJpeCwgZXRjLikgdGhlcmUgc2VlbXMgdG8gYmUgYXQgbGVhc3Qgb25lIGZhaXJseSBzaW1wbGUgY291bnRlcmV4YW1wbGUgd2hlcmUgdGhlIHJlY2lwZSBmYWlscyBiYWRseSAoZS5nLiBzZWUgW3RoaXMgci1oZWxwIHRocmVhZCBmcm9tIFNlcHRlbWJlciAyMDA2XShodHRwczovL3N0YXQuZXRoei5jaC9waXBlcm1haWwvci1oZWxwLzIwMDYtU2VwdGVtYmVyLzExMjQ5NS5odG1sKSkuCi0gV2hlbiB0aGUgcmVzcG9uc2VzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgdGhlIGRlc2lnbiBpcyBiYWxhbmNlZCwgbmVzdGVkIGV0Yy4gKGkuZS4gdGhlIGNsYXNzaWNhbCBMTU0gc2l0dWF0aW9uKSwgdGhlIHNjYWxlZCBkZXZpYW5jZXMgYW5kIGRpZmZlcmVuY2VzIGluIGRldmlhbmNlcyBhcmUgZXhhY3RseSAkRiQtZGlzdHJpYnV0ZWQgYW5kIGxvb2tpbmcgYXQgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gKGkuZS4sIHdoaWNoIHRyZWF0bWVudHMgdmFyeS9hcmUgcmVwbGljYXRlZCBhdCB3aGljaCBsZXZlbHMpIHRlbGxzIHVzIHdoYXQgdGhlIHJlbGV2YW50IGRlZ3JlZXMgb2YgZnJlZWRvbSBhcmUgKHNlZSAiZGYgYWx0ZXJuYXRpdmVzIiBiZWxvdykKLSBUd28gYXBwcm9hY2hlcyB0byBhcHByb3hpbWF0aW5nIGRmIChTYXR0ZXJ0aHdhaXRlIGFuZCBLZW53YXJkLVJvZ2VyKSBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gUiwgU2F0dGVydGh3YWl0ZSBpbiBgbG1lclRlc3RgIGFuZCBLZW53YXJkLVJvZ2VyIGluIGBwYmtydGVzdGAgKGFzIGBLUm1vZGNvbXBgKSAodmFyaW91cyBwYWNrYWdlcyBzdWNoIGFzIGBsbWVyVGVzdGAsIGBlbW1lYW5zYCwgYGNhcmAsIGV0Yy4sIGltcG9ydCBgcGJrcnRlc3Q6OmdldF9MYl9kZGZgKS4KICAgIC0gSy1SIGlzIHByb2JhYmx5IHRoZSBtb3N0IHJlbGlhYmxlIG9wdGlvbiBbQHNjaGFhbGplX2FkZXF1YWN5XzIwMDJdLCBhbHRob3VnaCBpdCBtYXkgYmUgcHJvaGliaXRpdmVseSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGZvciBsYXJnZSBkYXRhIHNldHMuCiAgICAtIEstUiB3YXMgZGVyaXZlZCBmb3IgTE1NcyAoYW5kIGZvciBSRU1MPykgaW4gcGFydGljdWxhciwgaXQgaXNuJ3QgY2xlYXIgaG93IGl0IHdvdWxkIGFwcGx5IHRvIEdMTU1zLiBAc3Ryb3VwX3JldGhpbmtpbmdfMjAxNCBzdGF0ZXMgKHJlZmVyZW5jaW5nIEBzdHJvdXBfbm9uLW5vcm1hbF8yMDEzKSB0aGF0IEstUiBhY3R1YWxseSB3b3JrcyByZWFzb25hYmx5IHdlbGwgZm9yIEdMTU1zIChLLVIgaXMgbm90IGltcGxlbWVudGVkIGluIFIgZm9yIEdMTU1zOyBTdHJvdXAgc3VnZ2VzdHMgdGhhdCBhIHBzZXVkby1saWtlbGlob29kIFtAd29sZmluZ2VyX2dlbmVyYWxpemVkXzE5OTNdIGFwcHJvYWNoIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBpbXBsZW1lbnQgSy1SIGZvciBHTE1Ncyk6CgogICAgICAgID4gTm90aWNlIHRoZSBub24taW50ZWdlciB2YWx1ZXMgb2YgdGhlIGRlbm9taW5hdG9yIGRmLiBUaGV5LCBhbmQgdGhlICRGJCBhbmQgJHAkIHZhbHVlcywgcmVmbGVjdCB0aGUgcHJvY2VkdXJlIGRldmVsb3BlZCBieSBLZW53YXJkIGFuZCBSb2dlciAoMjAwOSkgdG8gYWNjb3VudCBmb3IgdGhlIGVmZmVjdCBvZiB0aGUgY292YXJpYW5jZSAgc3RydWN0dXJlIG9uIGRlZ3JlZXMgb2YgZnJlZWRvbSBhbmQgc3RhbmRhcmQgZXJyb3JzLiBBbHRob3VnaCB0aGUgS2Vud2FyZOKAk1JvZ2VyIGFkanVzdG1lbnQgd2FzIGRlcml2ZWQgZm9yIHRoZSBMTU0gd2l0aCBub3JtYWxseSBkaXN0cmlidXRlZCBkYXRhIGFuZCBpcyBhbiBhZCBob2MgcHJvY2VkdXJlIGZvciBHTE1NcyB3aXRoIG5vbi1ub3JtYWwgZGF0YSwgaW5mb3JtYWwgc2ltdWxhdGlvbiBzdHVkaWVzIGNvbnNpc3RlbnRseSBoYXZlIHN1Z2dlc3RlZCB0aGF0IHRoZSBhZGp1c3RtZW50IGlzIGFjY3VyYXRlLiBUaGUgS2Vud2FyZC1Sb2dlciBhZGp1c3RtZW50IHJlcXVpcmVzIHRoYXQgdGhlIFNBUyBHTElNTUlYIGRlZmF1bHQgY29tcHV0aW5nIGFsZ29yaXRobSwgcHNldWRvLWxpa2VsaWhvb2QsIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIExhcGxhY2UgYWxnb3JpdGhtIHVzZWQgdG8gb2J0YWluIEFJQ0Mgc3RhdGlzdGljcy4gU3Ryb3VwICgyMDEzYikgZm91bmQgdGhhdCBmb3IgYmlub21pYWwgYW5kIFBvaXNzb24gR0xNTXMsIHBzZXVkby1saWtlbGlob29kIHdpdGggdGhlIEtlbndhcmTigJNSb2dlciBhZGp1c3RtZW50IHlpZWxkcyBiZXR0ZXIgVHlwZSBJIGVycm9yIGNvbnRyb2wgdGhhbiBMYXBsYWNlIHdoaWxlIHByZXNlcnZpbmcgdGhlIEdMTU3igJlzIGFkdmFudGFnZSB3aXRoIHJlc3BlY3QgdG8gcG93ZXIgYW5kIGFjY3VyYWN5IGluIGVzdGltYXRpbmcgdHJlYXRtZW50IG1lYW5zLgoJCi0gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IGlzc3VlcyBhdCBwbGF5IGluIGZpbml0ZS1zaXplIChzbWFsbC1zYW1wbGUpIGFkanVzdG1lbnRzLCB3aGljaCBhcHBseSBzbGlnaHRseSBkaWZmZXJlbnRseSB0byBMTU1zIGFuZCBHTE1Ncy4KICAgICAtICBXaGVuIHRoZSBkYXRhIGRvbid0IGZpdCBpbnRvIHRoZSBjbGFzc2ljYWwgZnJhbWV3b3JrIChjcm9zc2VkLCB1bmJhbGFuY2VkLCBSLXNpZGUgZWZmZWN0cyksIHdlIG1pZ2h0IHN0aWxsIGd1ZXNzIHRoYXQgdGhlIGRldmlhbmNlcyBldGMuIGFyZSBhcHByb3hpbWF0ZWx5IEYtZGlzdHJpYnV0ZWQgYnV0IHRoYXQgd2UgZG9uJ3Qga25vdyB0aGUgcmVhbCBkZWdyZWVzIG9mIGZyZWVkb20gLS0gdGhpcyBpcyB3aGF0IHRoZSBTYXR0ZXJ0aHdhaXRlLCBLZW53YXJkLVJvZ2VyLCBGYWktQ29ybmVsaXVzLCBldGMuIGFwcHJveGltYXRpb25zIGFyZSBzdXBwb3NlZCB0byBkby4KICAgICAtIFdoZW4gdGhlIHJlc3BvbnNlcyBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChhcyBpbiBHTE1zIGFuZCBHTE1NcyksIGFuZCB3aGVuIHRoZSBzY2FsZSBwYXJhbWV0ZXIgaXMgbm90IGVzdGltYXRlZCAoYXMgaW4gc3RhbmRhcmQgUG9pc3Nvbi0gYW5kIGJpbm9taWFsLXJlc3BvbnNlIG1vZGVscyksIHRoZW4gdGhlIGRldmlhbmNlIGRpZmZlcmVuY2VzIGFyZSBvbmx5IGFzeW1wdG90aWNhbGx5IEYtIG9yIGNoaS1zcXVhcmUtZGlzdHJpYnV0ZWQgKGkuZS4gbm90IGZvciBvdXIgcmVhbCwgZmluaXRlLXNpemUgc2FtcGxlcykuICBJbiBzdGFuZGFyZCBHTE0gcHJhY3RpY2UsIHdlIHVzdWFsbHkgaWdub3JlIHRoaXMgcHJvYmxlbTsgdGhlcmUgaXMgc29tZSBsaXRlcmF0dXJlIG9uIGZpbml0ZS1zaXplIGNvcnJlY3Rpb25zIGZvciBHTE1zIHVuZGVyIHRoZSBydWJyaWNzIG9mICJCYXJ0bGV0dCBjb3JyZWN0aW9ucyIgYW5kICJoaWdoZXIgb3JkZXIgYXN5bXB0b3RpY3MiIChzZWUgQE1jQ3VsbGFnaE5lbGRlcjE5ODksIEBjb3JkZWlyb19pbXByb3ZlZF8xOTk0LCBAY29yZGVpcm9fbm90ZV8xOTk4IGFuZCB0aGUgYGNvbmRgIHBhY2thZ2UgKFtvbiBDUkFOXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9wYWNrYWdlPWNvbmQpKSBbd2hpY2ggd29ya3Mgd2l0aCBHTE1zLCBub3QgR0xNTXNdKSwgYnV0IGl0J3MgcmFyZWx5IHVzZWQuICAoVGhlIGJpYXMgY29ycmVjdGlvbi9GaXJ0aCBhcHByb2FjaCBpbXBsZW1lbnRlZCBpbiB0aGUgYGJyZ2xtYCBwYWNrYWdlIGF0dGVtcHRzIHRvIGFkZHJlc3MgdGhlIHByb2JsZW0gb2YgZmluaXRlLXNpemUgYmlhcywgbm90IGZpbml0ZS1zaXplIG5vbi1jaGktc3F1YXJlZG5lc3Mgb2YgdGhlIGRldmlhbmNlIGRpZmZlcmVuY2VzLikKICAgIC0gV2hlbiB0aGUgc2NhbGUgcGFyYW1ldGVyIGluIGEgR0xNIGlzIGVzdGltYXRlZCByYXRoZXIgdGhhbiBmaXhlZCAoYXMgaW4gR2FtbWEgb3IgcXVhc2ktbGlrZWxpaG9vZCBtb2RlbHMpLCBpdCBpcyBzb21ldGltZXMgcmVjb21tZW5kZWQgdG8gdXNlIGFuICRGJCB0ZXN0IHRvIGFjY291bnQgZm9yIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgc2NhbGUgcGFyYW1ldGVyIChlLmcuIEB2ZW5hYmxlc19tb2Rlcm5fMjAwMiByZWNvbW1lbmQgYGFub3ZhKC4uLix0ZXN0PSJGIilgIGZvciBxdWFzaS1saWtlbGlob29kIG1vZGVscykKICAgIC0gQ29tYmluaW5nIHRoZXNlIGlzc3Vlcywgb25lIGhhcyB0byBsb29rIHByZXR0eSBoYXJkIGZvciBpbmZvcm1hdGlvbiBvbiBzbWFsbC1zYW1wbGUgb3IgZmluaXRlLXNpemUgY29ycmVjdGlvbnMgZm9yIEdMTU1zOiBAZmVuZ19zbWFsbF8yMDA0IGFuZCBAYmVsbF9zbWFsbF8yMDEwIGxvb2sgbGlrZSBnb29kIHN0YXJ0aW5nIHBvaW50cywgYnV0IGl0J3Mgbm90IGF0IGFsbCB0cml2aWFsLgoKIyMjIyBEZiBhbHRlcm5hdGl2ZXM6CgotIHVzZSBNQVNTOjpnbG1tUFFMICh1c2VzIG9sZCBgbmxtZWAgcnVsZXMgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IHRvIFNBUyAnaW5uZXItb3V0ZXInLyd3aXRoaW4tYmV0d2VlbicgcnVsZXMpIGZvciBHTE1Ncywgb3IgYChuKWxtZWAgZm9yIExNTXMKLSBHdWVzcyB0aGUgZGVub21pbmF0b3IgZGYgZnJvbSBzdGFuZGFyZCBydWxlcyAoZm9yIHN0YW5kYXJkIGRlc2lnbnMsIGUuZy4gc2VlIEBHb3RlbGxpRWxsaXNvbjIwMDQpIGFuZCBhcHBseSB0aGVtIHRvICR0JCBvciAkRiQgdGVzdHMKLSBSdW4gdGhlIG1vZGVsIGluIGBsbWVgIChpZiBwb3NzaWJsZSkgYW5kIHVzZSB0aGUgZGVub21pbmF0b3IgZGYgcmVwb3J0ZWQgdGhlcmUgKHdoaWNoIGZvbGxvdyBhIHNpbXBsZSAnaW5uZXItb3V0ZXInIHJ1bGUgd2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIGNhbm9uaWNhbCBhbnN3ZXIgZm9yIHNpbXBsZS9vcnRob2dvbmFsIGRlc2lnbnMpLCBhcHBsaWVkIHRvICR0JCBvciAkRiQgdGVzdHMuICBGb3IgdGhlIGV4cGxpY2l0IHNwZWNpZmljYXRpb24gb2YgdGhlIHJ1bGVzIHRoYXQgYGxtZWAgdXNlcywgc2VlIHBhZ2UgOTEgb2YgUGluaGVpcm8gYW5kIEJhdGVzICgqdGhpcyBwYWdlIHdhcyBwcmV2aW91c2x5IGF2YWlsYWJsZSBvbiBbR29vZ2xlIEJvb2tzXShodHRwOi8vdGlueXVybC5jb20vbnR5Z3EzKSwgYnV0IHRoZSBsaW5rIGlzIG5vIGxvbmdlciB1c2VmdWwsIHNvIGhlcmUgYXJlIHRoZSByZWxldmFudCBwYXJhZ3JhcGhzKik6Cgo+IFRoZXNlIGNvbmRpdGlvbmFsIHRlc3RzIGZvciBmaXhlZC1lZmZlY3RzIHRlcm1zIHJlcXVpcmUgZGVub21pbmF0b3IgZGVncmVlcyBvZiBmcmVlZG9tLiBJbiB0aGUgY2FzZSBvZiB0aGUgY29uZGl0aW9uYWwgJEYkLXRlc3RzLCB0aGUgbnVtZXJhdG9yIGRlZ3JlZXMgb2YgZnJlZWRvbSBhcmUgYWxzbyByZXF1aXJlZCwgYmVpbmcgZGV0ZXJtaW5lZCBieSB0aGUgdGVybSBpdHNlbGYuIFRoZSBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20gYXJlIGRldGVybWluZWQgYnkgdGhlIGdyb3VwaW5nIGxldmVsIGF0IHdoaWNoIHRoZSB0ZXJtIGlzIGVzdGltYXRlZC4gQSB0ZXJtIGlzIGNhbGxlZCBpbm5lciByZWxhdGl2ZSB0byBhIGZhY3RvciBpZiBpdHMgdmFsdWUgY2FuIGNoYW5nZSB3aXRoaW4gYSBnaXZlbiBsZXZlbCBvZiB0aGUgZ3JvdXBpbmcgZmFjdG9yLiBBIHRlcm0gaXMgb3V0ZXIgdG8gYSBncm91cGluZyBmYWN0b3IgaWYgaXRzIHZhbHVlIGRvZXMgbm90IGNoYW5nZXMgd2l0aGluIGxldmVscyBvZiB0aGUgZ3JvdXBpbmcgZmFjdG9yLiBBIHRlcm0gaXMgc2FpZCB0byBiZSBlc3RpbWF0ZWQgYXQgbGV2ZWwgJGkkLCBpZiBpdCBpcyBpbm5lciB0byB0aGUgJGktMSRzdCBncm91cGluZyBmYWN0b3IgYW5kIG91dGVyIHRvIHRoZSAkaSR0aCBncm91cGluZyBmYWN0b3IuIEZvciBleGFtcGxlLCB0aGUgdGVybSBgTWFjaGluZWAgaW4gdGhlIGBmbTJNYWNoaW5lYCBtb2RlbCBpcyBvdXRlciB0byBgTWFjaGluZSAlaW4lIFdvcmtlcmAgYW5kIGlubmVyIHRvIGBXb3JrZXJgLCBzbyBpdCBpcyBlc3RpbWF0ZWQgYXQgbGV2ZWwgMiAoYE1hY2hpbmUgJWluJSBXb3JrZXJgKS4gSWYgYSB0ZXJtIGlzIGlubmVyIHRvIGFsbCAkUSQgZ3JvdXBpbmcgZmFjdG9ycyBpbiBhIG1vZGVsLCBpdCBpcyBlc3RpbWF0ZWQgYXQgdGhlIGxldmVsIG9mIHRoZSB3aXRoaW4tZ3JvdXAgZXJyb3JzLCB3aGljaCB3ZSBkZW5vdGUgYXMgdGhlICRRKzEkc3QgbGV2ZWwuCj4KPiAgVGhlIGludGVyY2VwdCwgd2hpY2ggaXMgdGhlIHBhcmFtZXRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW4gb2YgYWxsIDEncyBpbiB0aGUgbW9kZWwgbWF0cmljZXMgJFhfaSQsIGlzIHRyZWF0ZWQgZGlmZmVyZW50bHkgZnJvbSBhbGwgdGhlIG90aGVyIHBhcmFtZXRlcnMsIHdoZW4gaXQgaXMgcHJlc2VudC4gQXMgYSBwYXJhbWV0ZXIgaXQgaXMgcmVnYXJkZWQgYXMgYmVpbmcgZXN0aW1hdGVkIGF0IGxldmVsIDAgYmVjYXVzZSBpdCBpcyBvdXRlciB0byBhbGwgdGhlIGdyb3VwaW5nIGZhY3RvcnMuIEhvd2V2ZXIsIGl0cyBkZW5vbWluYXRvciBkZWdyZWVzIG9mIGZyZWVkb20gYXJlIGNhbGN1bGF0ZWQgYXMgaWYgaXQgd2VyZSBlc3RpbWF0ZWQgYXQgbGV2ZWwgJFErMSQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgaW50ZXJjZXB0IGlzIHRoZSBvbmUgcGFyYW1ldGVyIHRoYXQgcG9vbHMgaW5mb3JtYXRpb24gZnJvbSBhbGwgdGhlIG9ic2VydmF0aW9ucyBhdCBhIGxldmVsIGV2ZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gJFhfaSQgZG9lc24ndCBjaGFuZ2Ugd2l0aCB0aGUgbGV2ZWwuCj4KPiAgICBMZXR0aW5nICRtX2kkIGRlbm90ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGdyb3VwcyBpbiBsZXZlbCAkaSQgKHdpdGggdGhlIGNvbnZlbnRpb24gdGhhdCAkbV8wPTEkIHdoZW4gdGhlIGZpeGVkIGVmZmVjdHMgbW9kZWwgaW5jbHVkZXMgYW4gaW50ZXJjZXB0IGFuZCAwIG90aGVyd2lzZSwgYW5kICRtX3tRKzF9PU4kKSBhbmQgJHBfaSQgZGVub3RlIHRoZSBzdW0gb2YgdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0ZXJtcyBlc3RpbWF0ZWQgYXQgbGV2ZWwgJGkkLCB0aGUgJGkkdGggbGV2ZWwgZGVub21pbmF0b3IgZGVncmVlcyBvZiBmcmVlZG9tIGlzIGRlZmluZWQgYXMKPgo+ICQkIFxtYXRocm17ZGVuREZ9X2kgPSBtX2kgLSAobV97aS0xfSArIHBfaSksIGkgPSAxLCBcZG90cywgUSAkJAo+IAo+IFRoaXMgZGVmaW5pdGlvbiBjb2luY2lkZXMgd2l0aCB0aGUgY2xhc3NpY2FsIGRlY29tcG9zaXRpb24gb2YgZGVncmVlcyBvZiBmcmVlZG9tIGluIGJhbGFuY2VkLCBtdWx0aWxldmVsIEFOT1ZBIGRlc2lnbnMgYW5kIGdpdmVzIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uIGZvciBtb3JlIGdlbmVyYWwgbWl4ZWQtZWZmZWN0cyBtb2RlbHMuCgpOb3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgaW4gYGxtZWAgKipnZXRzIHRoZSB3cm9uZyBhbnN3ZXIgZm9yIHJhbmRvbS1zbG9wZXMgbW9kZWxzKio6CmBgYHtyIGxtZURGLG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkobmxtZSkKbG1lREYgPC0gZnVuY3Rpb24oZm9ybXVsYT1kaXN0YW5jZX5hZ2UscmFuZG9tPX4xfFN1YmplY3QpIHsKICAgICBtb2QgPC0gbG1lKGZvcm11bGEscmFuZG9tLGRhdGE9T3J0aG9kb250KQogICAgIGFhIDwtIGFub3ZhKG1vZCkKICAgIHJldHVybihzZXROYW1lcyhhYVssImRlbkRGIl0scm93bmFtZXMoYWEpKSkKfQpsbWVERigpCmxtZURGKHJhbmRvbT1+YWdlfFN1YmplY3QpICMjIHdyb25nIQpgYGAKSSAoQkIpIGhhdmUgcmUtaW1wbGVtZW50ZWQgdGhpcyBhbGdvcml0aG0gaW4gYSB3YXkgdGhhdCBkb2VzIHNsaWdodGx5IGJldHRlciBmb3IgcmFuZG9tLXNsb3BlcyBtb2RlbHMgKGJ1dCBtYXkgc3RpbGwgZ2V0IGNvbmZ1c2VkISksIHNlZSBbaGVyZV0oUi9jYWxjRGVuREYuUikuCgpgYGB7ciBjYWxjRGVuREZ9CnNvdXJjZSgiUi9jYWxjRGVuREYuUiIpCmNhbGNEZW5ERih+YWdlLCJTdWJqZWN0IixubG1lOjpPcnRob2RvbnQpCmNhbGNEZW5ERih+YWdlLGRhdGE9bmxtZTo6T3J0aG9kb250LHJhbmRvbT1+MXxTdWJqZWN0KQpjYWxjRGVuREYofmFnZSxkYXRhPW5sbWU6Ok9ydGhvZG9udCxyYW5kb209fmFnZXxTdWJqZWN0KSAjIyBvZmYgYnkgMQpgYGAKCi0gdXNlIFNBUywgR2Vuc3RhdCAoQVMtUkVNTCksIFN0YXRhPwotIEFzc3VtZSBpbmZpbml0ZSBkZW5vbWluYXRvciBkZiAoaS5lLiAkWiQvJFxjaGleMiQgdGVzdCByYXRoZXIgdGhhbiAkdCQvJEYkKSBpZiBudW1iZXIgb2YgZ3JvdXBzIGlzIGxhcmdlICg+NDU/IFZhcmlvdXMgcnVsZXMgb2YgdGh1bWIgZm9yIGhvdyBsYXJnZSBpcyAiYXBwcm94aW1hdGVseSBpbmZpbml0ZSIgaGF2ZSBiZWVuIHBvc2VkLCBpbmNsdWRpbmcgW2luIEBhbmdyaXN0X21vc3RseV8yMDA5XSwgNDIgKGluIGhvbWFnZSB0byBEb3VnbGFzIEFkYW1zKQoKIyMjIFRlc3Rpbmcgc2lnbmlmaWNhbmNlIG9mIHJhbmRvbSBlZmZlY3RzCgotIHRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gZG8gdGhpcyBpcyB0byB1c2UgYSBsaWtlbGlob29kIHJhdGlvIHRlc3QsIGkuZS4gZml0IHRoZSBmdWxsIGFuZCByZWR1Y2VkIG1vZGVscyAodGhlIHJlZHVjZWQgbW9kZWwgaXMgdGhlIG1vZGVsIHdpdGggdGhlIGZvY2FsIHZhcmlhbmNlKHMpIHNldCB0byB6ZXJvKS4gRm9yIGV4YW1wbGU6CmBgYHtyIHJhbmVmZl90ZXN0LG1lc3NhZ2U9RkFMU0UsY2FjaGU9VFJVRX0KbGlicmFyeShsbWU0KQptMiA8LSBsbWVyKFJlYWN0aW9ufkRheXMrKDF8U3ViamVjdCkrKDArRGF5c3xTdWJqZWN0KSxzbGVlcHN0dWR5LFJFTUw9RkFMU0UpCm0xIDwtIHVwZGF0ZShtMiwufkRheXMrKDF8U3ViamVjdCkpCm0wIDwtIGxtKFJlYWN0aW9ufkRheXMsc2xlZXBzdHVkeSkKYW5vdmEobTIsbTEsbTApICMjIHR3byBzZXF1ZW50aWFsIHRlc3RzCmBgYApXaXRoIHJlY2VudCB2ZXJzaW9ucyBvZiBgbG1lNGAsIGdvb2RuZXNzLW9mLWZpdCAoZGV2aWFuY2UpIGNhbiBiZSBjb21wYXJlZCBiZXR3ZWVuIGAoZylsbWVyYCBhbmQgYChnKWxtYCBtb2RlbHMsIGFsdGhvdWdoIGBhbm92YSgpYCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBtaXhlZCAoYChnKWxtZXJgKSBtb2RlbCBsaXN0ZWQgZmlyc3QuCktlZXAgaW4gbWluZCB0aGF0IExSVC1iYXNlZCBudWxsIGh5cG90aGVzaXMgdGVzdHMgYXJlIGNvbnNlcnZhdGl2ZSB3aGVuIHRoZSBudWxsIHZhbHVlIChzdWNoIGFzICRcc2lnbWFeMj0wJCkgaXMgb24gdGhlIGJvdW5kYXJ5IG9mIHRoZSBmZWFzaWJsZSBzcGFjZSBbQHNlbGZfYXN5bXB0b3RpY18xOTg3O0BzdHJhbV92YXJpYW5jZV8xOTk0O0BHb2xkbWFuV2hlbGFuMjAwMF07IGluIHRoZSBzaW1wbGVzdCBjYXNlIChzaW5nbGUgcmFuZG9tIGVmZmVjdCB2YXJpYW5jZSksIHRoZSBwLXZhbHVlIGlzIGFwcHJveGltYXRlbHkgdHdpY2UgYXMgbGFyZ2UgYXMgaXQgc2hvdWxkIGJlIFtAcGluaGVpcm9fbWl4ZWQtZWZmZWN0c18yMDAwXS4KCi0gQ29uc2lkZXIgKm5vdCogdGVzdGluZyB0aGUgc2lnbmlmaWNhbmNlIG9mIHJhbmRvbSBlZmZlY3RzLiBJZiB0aGUgcmFuZG9tIGVmZmVjdCBpcyBwYXJ0IG9mIHRoZSBleHBlcmltZW50YWwgZGVzaWduLCB0aGlzIHByb2NlZHVyZSBtYXkgYmUgY29uc2lkZXJlZCAnc2FjcmlmaWNpYWwgcHNldWRvcmVwbGljYXRpb24nIFtASHVybGJlcnQxOTg0XS4gVXNpbmcgc3RlcHdpc2UgYXBwcm9hY2hlcyB0byBlbGltaW5hdGUgbm9uLXNpZ25pZmljYW50IHRlcm1zIGluIG9yZGVyIHRvIHNxdWVlemUgbW9yZSBzaWduaWZpY2FuY2Ugb3V0IG9mIHRoZSByZW1haW5pbmcgdGVybXMgaXMgZGFuZ2Vyb3VzIGluIGFueSBjYXNlLgotIGNvbnNpZGVyIHVzaW5nIHRoZSBgUkxSc2ltYCBwYWNrYWdlLCB3aGljaCBoYXMgYSBmYXN0IGltcGxlbWVudGF0aW9uIG9mIHNpbXVsYXRpb24tYmFzZWQgdGVzdHMgb2YgbnVsbCBoeXBvdGhlc2VzIGFib3V0IHplcm8gdmFyaWFuY2VzLCBmb3Igc2ltcGxlIHRlc3RzLiAoSG93ZXZlciwgaXQgb25seSBhcHBsaWVzIHRvIGBsbWVyYCBtb2RlbHMsIGFuZCBpcyBhIGJpdCB0cmlja3kgdG8gdXNlIGZvciBtb3JlIGNvbXBsZXggbW9kZWxzLikKCmBgYHtyIFJMUnNpbV9jaGVjayxlY2hvPUZBTFNFfQppZiAocGFja2FnZVZlcnNpb24oIlJMUnNpbSIpPCIzLjEtNiIpIHsKICBzdG9wKCJuZWVkIHJlY2VudCB2ZXJzaW9uIG9mIFJMUnNpbTogY29uc2lkZXIiLAogICAgICAgIidyZW1vdGVzOjppbnN0YWxsX2dpdGh1YihcImZhYmlhbi1zL1JMUnNpbVwiKSciKQp9CmBgYApgYGB7ciBSTFJzaW0sbWVzc2FnZT1GQUxTRX0KbGlicmFyeShSTFJzaW0pCiMjIGNvbXBhcmUgbTAgYW5kIG0xCmV4YWN0TFJUKG0xLG0wKQojIyBjb21wYXJlIG0xIGFuZCBtMgptQSA8LSB1cGRhdGUobTIsUkVNTD1UUlVFKQptMEIgPC0gdXBkYXRlKG1BLCAuIH4gLiAtICgwICsgRGF5c3xTdWJqZWN0KSkKbS5zbG9wZSAgPC0gdXBkYXRlKG1BLCAuIH4gLiAtICgxfFN1YmplY3QpKQpleGFjdFJMUlQobTA9bTBCLG09bS5zbG9wZSxtQT1tQSkKYGBgCgotIFBhcmFtZXRyaWMgYm9vdHN0cmFwOiBmaXQgdGhlIHJlZHVjZWQgbW9kZWwsIHRoZW4gcmVwZWF0ZWRseSBzaW11bGF0ZSBmcm9tIGl0IGFuZCBjb21wdXRlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBkZXZpYW5jZSBvZiB0aGUgcmVkdWNlZCBhbmQgdGhlIGZ1bGwgbW9kZWwgZm9yIGVhY2ggc2ltdWxhdGVkIGRhdGEgc2V0LiAgQ29tcGFyZSB0aGlzIG51bGwgZGlzdHJpYnV0aW9uIHRvIHRoZSBvYnNlcnZlZCBkZXZpYW5jZSBkaWZmZXJlbmNlLiBUaGlzIHByb2NlZHVyZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgYHBia3J0ZXN0YCBwYWNrYWdlIChtZXNzYWdlcyBhbmQgd2FybmluZ3Mgc3VwcHJlc3NlZCkuCmBgYHtyIHBib290X3ZhcnRlc3RfY29tcCxjYWNoZT1UUlVFLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9CihwYiA8LSBwYmtydGVzdDo6UEJtb2Rjb21wKG0yLG0xLHNlZWQ9MTAxKSkKYGBgCgojIyMgU3RhbmRhcmQgZXJyb3JzIG9mIHZhcmlhbmNlIGVzdGltYXRlcwoKPGEgaWQ9InZhcmlhbmNlLXN0YW5kYXJkLWVycm9ycyI+PC9hPgoKLSBQYXJhcGhyYXNpbmcgRG91ZyBCYXRlczogdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB2YXJpYW5jZSBlc3RpbWF0ZXMgaXMgaW4gZ2VuZXJhbCBzdHJvbmdseSBhc3ltbWV0cmljOiB0aGUgc3RhbmRhcmQgZXJyb3IgbWF5IGJlIGEgcG9vciBjaGFyYWN0ZXJpemF0aW9uIG9mIHRoZSB1bmNlcnRhaW50eS4KLSBgbG1lNGAgYWxsb3dzIGZvciBjb21wdXRpbmcgbGlrZWxpaG9vZCBwcm9maWxlcyBvZiB2YXJpYW5jZXMgYW5kIGNvbXB1dGluZyBjb25maWRlbmNlIGludGVydmFscyBvbiB0aGVpciBiYXNpczsgdGhlc2UgbGlrZWxpaG9vZCBwcm9maWxlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBzdWJqZWN0IHRvIHRoZSB1c3VhbCBjYXZlYXRzIGFib3V0IHRoZSBMUlQgd2l0aCBmaW5pdGUgc2FtcGxlIHNpemVzLgotIFVzaW5nIGFuIE1DTUMtYmFzZWQgYXBwcm9hY2ggKHRoZSBzaW1wbGVzdC9tb3N0IGNhbm5lZCBpcyBwcm9iYWJseSB0byB1c2UgdGhlIGBNQ01DZ2xtbWAgcGFja2FnZSwgYWx0aG91Z2ggaXRzIG1vZGUgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBpZGVudGljYWwgdG8gdGhvc2Ugb2YgbG1lNCkgd2lsbCBwcm92aWRlIHBvc3RlcmlvciBkaXN0cmlidXRpb25zIG9mIHRoZSB2YXJpYW5jZSBwYXJhbWV0ZXJzOiBxdWFudGlsZXMgb3IgY3JlZGlibGUgaW50ZXJ2YWxzIChgSFBEaW50ZXJ2YWwoKWAgaW4gdGhlIGBjb2RhYCBwYWNrYWdlKSB3aWxsIGNoYXJhY3Rlcml6ZSB0aGUgdW5jZXJ0YWludHkuCi0gKGRvbid0IHNheSB3ZSBkaWRuJ3Qgd2FybiB5b3UgLi4uKSBgW25dbG1lYCBmaXRzIGNvbnRhaW4gYW4gZWxlbWVudCBjYWxsZWQgYGFwVmFyYCB3aGljaCBjb250YWlucyB0aGUgYXBwcm94aW1hdGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggKGRlcml2ZWQgZnJvbSB0aGUgSGVzc2lhbiwgdGhlIG1hdHJpeCBvZiAobnVtZXJpY2FsbHkgYXBwcm94aW1hdGVkKSBzZWNvbmQgZGVyaXZhdGl2ZXMgb2YgdGhlIGxpa2VsaWhvb2QgKFJFTUw/KSBhdCB0aGUgbWF4aW11bSAocmVzdHJpY3RlZD8pIGxpa2VsaWhvb2QgdmFsdWVzKTogeW91IGNhbiBkZXJpdmUgdGhlIHN0YW5kYXJkIGVycm9ycyBmcm9tIHRoaXMgbGlzdCBlbGVtZW50IHZpYSBgc3FydChkaWFnKGxtZS5vYmokYXBWYXIpKWAuIEZvciB3aGF0ZXZlciBpdCdzIHdvcnRoLCB0aG91Z2gsIFt0aGVzZSBlc3RpbWF0ZXMgbWlnaHQgbm90IG1hdGNoXShodHRwOi8vd3d3LmJpb3N0YXQud3VzdGwuZWR1L2FyY2hpdmVzL2h0bWwvcy1uZXdzLzIwMDMtMDcvbXNnMDAxMjcuaHRtbCkgdGhlIFtlc3RpbWF0ZXMgdGhhdCBTQVMgZ2l2ZXNdKGh0dHA6Ly93d3cudGF1LmFjLmlsL2NjL3BhZ2VzL2RvY3Mvc2FzOC9zdGF0L2NoYXA0MS9zZWN0MjUuaHRtI21peGVkY3BlKSB3aGljaCBhcmUgc3VwcG9zZWRseSBkZXJpdmVkIGluIHRoZSBzYW1lIHdheS4KLSBpdCdzIG5vdCBhIGZ1bGwgc29sdXRpb24sIGJ1dCB0aGVyZSBpcyBzb21lIG1vcmUgaW5mb3JtYXRpb24gW2hlcmVdKGh0dHBzOi8vcnB1YnMuY29tL2Jib2xrZXIvd2FsZHZhcikuIEkgaGF2ZSBzb21lIGRlbHRhLW1ldGhvZCBjb21wdXRhdGlvbnMgdGhlcmUgdGhhdCBhcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDIgZm9yIHRoZSByZXNpZHVhbCBzdGFuZGFyZCBkZXZpYXRpb24sIGFzIHdlbGwgYXMgc29tZSBjb21wdXRhdGlvbnMgYmFzZWQgb24gcmVwYXJhbWV0ZXJpemluZyB0aGUgZGV2aWFuY2UgZnVuY3Rpb24uCgojIyMgUC12YWx1ZXM6IE1DTUMgYW5kIHBhcmFtZXRyaWMgYm9vdHN0cmFwIAoKQWJhbmRvbmluZyB0aGUgYXBwcm94aW1hdGUgJEYkLyR0JC1zdGF0aXN0aWMgcm91dGUsIG9uZSBlbmRzIHVwIHdpdGggdGhlIG1vcmUgZ2VuZXJhbCBwcm9ibGVtIG9mIGVzdGltYXRpbmcgJHAkLXZhbHVlcy4gIFRoZXJlIGlzIGEgd2lkZXIgcmFuZ2Ugb2Ygb3B0aW9ucyBoZXJlLCBhbHRob3VnaCBtYW55IG9mIHRoZW0gYXJlIGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUgLi4uCgojIyMjIE1hcmtvdiBjaGFpbiBNb250ZSBDYXJsbyBzYW1wbGluZzoKLSBwc2V1ZG8tQmF5ZXNpYW46IHBvc3QtaG9jIHNhbXBsaW5nLCB0eXBpY2FsbHkgKDEpIGFzc3VtaW5nIGZsYXQgcHJpb3JzIGFuZCAoMikgc3RhcnRpbmcgZnJvbSB0aGUgTUxFLCBwb3NzaWJseSB1c2luZyB0aGUgYXBwcm94aW1hdGUgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZSB0byBjaG9vc2UgYSBjYW5kaWRhdGUgZGlzdHJpYnV0aW9uCiAgICAtIHZpYSBgbWNtY3NhbXBgIChpZiBhdmFpbGFibGUgZm9yIHlvdXIgcHJvYmxlbTogaS5lLiBMTU1zIHdpdGggc2ltcGxlIHJhbmRvbSBlZmZlY3RzIC0tIG5vdCBHTE1NcyBvciBjb21wbGV4IHJhbmRvbSBlZmZlY3RzKQogICAgLSB2aWEgYHB2YWxzLmZuY2AgaW4gdGhlIGBsYW5ndWFnZVJgIHBhY2thZ2UsIGEgd3JhcHBlciBmb3IgbWNtY3NhbXApCiAgICAtIGluIEFEIE1vZGVsIEJ1aWxkZXIsIHBvc3NpYmx5IHZpYSB0aGUgYGdsbW1BRE1CYCBwYWNrYWdlICh1c2UgdGhlIGBtY21jPVRSVUVgIG9wdGlvbikgb3IgdGhlIGBSMmFkbWJgIHBhY2thZ2UgKHdyaXRlIHlvdXIgb3duIG1vZGVsIGRlZmluaXRpb24gaW4gQUQgTW9kZWwgQnVpbGRlciksIG9yIG91dHNpZGUgb2YgUgogICAgLSB2aWEgdGhlIGBzaW1gIGZ1bmN0aW9uIGZyb20gdGhlIGBhcm1gIHBhY2thZ2UgKHNpbXVsYXRlcyB0aGUgcG9zdGVyaW9yIG9ubHkgZm9yIHRoZSBiZXRhIChmaXhlZC1lZmZlY3QpIGNvZWZmaWNpZW50czsgbm90IHlldCB3b3JraW5nIHdpdGggZGV2ZWxvcG1lbnQgbG1lNDsgd291bGQgbGlrZSBhIGJldHRlciBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSAuLi4/KQotIGZ1bGx5IEJheWVzaWFuIGFwcHJvYWNoZXMKICAgIC0gdmlhIHRoZSBgTUNNQ2dsbW1gIHBhY2thZ2UKICAgIC0gYGdsbW1CVUdTYCAoYSBXaW5CVUdTIHdyYXBwZXIvUiBpbnRlcmZhY2UpCiAgICAtIEpBR1MvV2luQlVHUy9PcGVuQlVHUyBldGMuLCB2aWEgdGhlIGByamFnc2AvYHIyamFnc2AvYFIyV2luQlVHU2AvYEJSdWdzYCBwYWNrYWdlcwoKIyMjIyBTdGF0dXMgb2YgbWNtY3NhbXAKCmBtY21jc2FtcGAgaXMgYSBmdW5jdGlvbiBmb3IgbG1lNCB0aGF0IGlzIHN1cHBvc2VkIHRvIHNhbXBsZSBmcm9tIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzLCBiYXNlZCBvbiBmbGF0L2ltcHJvcGVyIHByaW9ycyBmb3IgdGhlIHBhcmFtZXRlcnMgW2VkOiBJIGJlbGlldmUsIGJ1dCBhbSBub3Qgc3VyZSwgdGhhdCB0aGVzZSBwcmlvcnMgYXJlIGZsYXQgKipvbiB0aGUgc2NhbGUgb2YgdGhlIHRoZXRhIChDaG9sZXNreS1mYWN0b3IpIHBhcmFtZXRlcnMqKl0uICBBdCBwcmVzZW50LCBpbiB0aGUgQ1JBTiB2ZXJzaW9uIChsbWU0IDAuOTk5OTk5LTApIGFuZCB0aGUgUi1mb3JnZSAic3RhYmxlIiB2ZXJzaW9uIChsbWU0LjAgMC45OTk5OTktMSksIHRoaXMgY292ZXJzIG9ubHkgbGluZWFyIG1peGVkIG1vZGVscyB3aXRoIHVuY29ycmVsYXRlZCByYW5kb20gZWZmZWN0cy4KCkFzIGhhcyBiZWVuIGRpc2N1c3NlZCBpbiBhIHZhcmlldHkgb2YgcGxhY2VzIChlLmcuIFtvbiByLXNpZy1taXhlZCBtb2RlbHNdKGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxhbmcuci5sbWU0LmRldmVsLzE3ODgvKSwgYW5kIFtvbiB0aGUgci1mb3JnZSBidWcgdHJhY2tlcl0oaHR0cHM6Ly9yLWZvcmdlLnItcHJvamVjdC5vcmcvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYWlkPTY4Jmdyb3VwX2lkPTYwJmF0aWQ9Mjk4KSwgaXQgaXMgY2hhbGxlbmdpbmcgdG8gY29tZSB1cCB3aXRoIGEgc2FtcGxlciB0aGF0IGFjY291bnRzIHByb3Blcmx5IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbnMgZm9yIHNvbWUgb2YgdGhlIHZhcmlhbmNlIGNvbXBvbmVudHMgbWF5IGJlIG1peHR1cmVzIG9mIHBvaW50IG1hc3NlcyBhdCB6ZXJvIGFuZCBjb250aW51b3VzIGRpc3RyaWJ1dGlvbnMuICBOYWl2ZSBzYW1wbGVycyBhcmUgbGlrZWx5IHRvIGdldCBzdHVjayBhdCBvciBuZWFyIHplcm8uICBEb3VnIEJhdGVzIGhhcyBhbHdheXMgYmVlbiBhIGJpdCB1bnN1cmUgdGhhdCBgbWNtY3NhbXBgIGlzIHJlYWxseSBwZXJmb3JtaW5nIGFzIGludGVuZGVkLCBldmVuIGluIHRoZSBsaW1pdGVkIGNhc2VzIGl0IG5vdyBoYW5kbGVzLgoKR2l2ZW4gdGhpcyB1bmNlcnRhaW50eSBhYm91dCBob3cgZXZlbiB0aGUgYmFzaWMgdmVyc2lvbiB3b3JrcywgdGhlIGBsbWU0YCBkZXZlbG9wZXJzIGhhdmUgYmVlbiByZWx1Y3RhbnQgdG8gbWFrZSB0aGUgZWZmb3J0IHRvIGV4dGVuZCBpdCB0byBHTE1NcyBvciBtb3JlIGNvbXBsZXggTE1Ncywgb3IgdG8gaW1wbGVtZW50IGl0IGZvciB0aGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBsbWU0IC4uLiBzbyB1bmxlc3Mgc29tZXRoaW5nIG1pcmFjdWxvdXMgaGFwcGVucywgaXQgd2lsbCBub3QgYmUgaW1wbGVtZW50ZWQgZm9yIHRoZSBuZXcgdmVyc2lvbiBvZiBgbG1lNGAuIEFzIGFsd2F5cywgdXNlcnMgYXJlIGVuY291cmFnZWQgdG8gd3JpdGUgYW5kIHNoYXJlIHRoZWlyIG93biBjb2RlIHRoYXQgaW1wbGVtZW50cyB0aGVzZSBjYXBhYmlsaXRpZXMgLi4uCgojIyMjIFBhcmFtZXRyaWMgYm9vdHN0cmFwCgpUaGUgaWRlYSBoZXJlIGlzIHRoYXQgaW4gb3JkZXIgdG8gZG8gaW5mZXJlbmNlIG9uIHRoZSBlZmZlY3Qgb2YgKGEpIHByZWRpY3RvcihzKSwgeW91ICgxKSBmaXQgdGhlIHJlZHVjZWQgbW9kZWwgKHdpdGhvdXQgdGhlIHByZWRpY3RvcnMpIHRvIHRoZSBkYXRhOyAoMikgbWFueSB0aW1lcywgKDJhKSBzaW11bGF0ZSBkYXRhIGZyb20gdGhlIHJlZHVjZWQgbW9kZWw7ICgyYikgZml0IGJvdGggdGhlIHJlZHVjZWQgYW5kIHRoZSBmdWxsIG1vZGVsIHRvIHRoZSBzaW11bGF0ZWQgKG51bGwpIGRhdGE7ICgyYykgY29tcHV0ZSBzb21lIHN0YXRpc3RpYyhzKSBbZS5nLiB0LXN0YXRpc3RpYyBvZiB0aGUgZm9jYWwgcGFyYW1ldGVyLCBvciB0aGUgbG9nLWxpa2VsaWhvb2Qgb3IgZGV2aWFuY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtb2RlbHNdOyAoMykgY29tcGFyZSB0aGUgb2JzZXJ2ZWQgdmFsdWVzIG9mIHRoZSBzdGF0aXN0aWMgZnJvbSBmaXR0aW5nIHlvdXIgZnVsbCBtb2RlbCB0byB0aGUgZGF0YSB0byB0aGUgbnVsbCBkaXN0cmlidXRpb24gZ2VuZXJhdGVkIGluIHN0ZXAgMi4KLSBgUEJtb2Rjb21wYCBpbiB0aGUgYHBia3J0ZXN0YCBwYWNrYWdlCi0gc2VlIHRoZSBleGFtcGxlIGluIGBoZWxwKCJzaW11bGF0ZS1tZXIiKWAgaW4gdGhlIGBsbWU0YCBwYWNrYWdlIHRvIHJvbGwgeW91ciBvd24sIHVzaW5nIGEgY29tYmluYXRpb24gb2YgYHNpbXVsYXRlKClgIGFuZCBgcmVmaXQoKWAuCi0gYGJvb3RNZXJgIGluIGBsbWU0YCB2ZXJzaW9uID4xLjAuMAotIGEgcHJlc2VudGF0aW9uIGF0IFVzZVIhIDIwMDkgKFthYnN0cmFjdF0oaHR0cDovL3d3dy5hZ3JvY2FtcHVzLW91ZXN0LmZyL21hdGgvdXNlUi0yMDA5L2Fic3RyYWN0cy9wZGYvU2FuY2hlekVzcGlnYXJlcytPY2FuYS5wZGYpLCBbc2xpZGVzXShodHRwOi8vd3d3LmFncm9jYW1wdXMtb3Vlc3QuZnIvbWF0aC91c2VSLTIwMDkvc2xpZGVzL1NhbmNoZXpFc3BpZ2FyZXMrT2NhbmEucGRmKSkgd2VudCBpbnRvIGRldGFpbCBhYm91dCBhIHByb3Bvc2VkIGBib290TWVyYCBwYWNrYWdlIGFuZCBzdWdnZXN0ZWQgaXQgY291bGQgd29yayBmb3IgR0xNTXMgdG9vIC0tIApidXQgaXQgZG9lcyBub3Qgc2VlbSB0byBiZSBhY3RpdmUuCgojIyBQcmVkaWN0aW9ucyBhbmQvb3IgY29uZmlkZW5jZSAob3IgcHJlZGljdGlvbikgaW50ZXJ2YWxzIG9uIHByZWRpY3Rpb25zCgpOb3RlIHRoYXQgbm9uZSBvZiB0aGUgZm9sbG93aW5nIGFwcHJvYWNoZXMgdGFrZXMgdGhlIHVuY2VydGFpbnR5Cm9mIHRoZSByYW5kb20gZWZmZWN0cyBwYXJhbWV0ZXJzIGludG8gYWNjb3VudCAuLi4gaWYgeW91IHdhbnQgdG8gdGFrZSBSRSBwYXJhbWV0ZXIgdW5jZXJ0YWludHkgaW50byBhY2NvdW50LCBhIEJheWVzaWFuIGFwcHJvYWNoIGlzIHByb2JhYmx5IHRoZSBlYXNpZXN0IHdheSB0byBkbyBpdC4KClRoZSBnZW5lcmFsIHJlY2lwZSBmb3IgY29tcHV0aW5nIHByZWRpY3Rpb25zIGZyb20gYSBsaW5lYXIgb3IgZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVsIGlzIHRvIAoKLSBmaWd1cmUgb3V0IHRoZSBtb2RlbCBtYXRyaXggJFgkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5ldyBkYXRhOwotICBtYXRyaXgtbXVsdGlwbHkgJFgkIGJ5IHRoZSBwYXJhbWV0ZXIgdmVjdG9yICRcYmV0YSQgdG8gZ2V0IHRoZSBwcmVkaWN0aW9ucyAob3IgbGluZWFyIHByZWRpY3RvciBpbiB0aGUgY2FzZSBvZiBHTE0oTSlzKTsgCi0gZXh0cmFjdCB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggb2YgdGhlIHBhcmFtZXRlcnMgJFYkIAotIGNvbXB1dGUgJFggViBYXntccHJpbWV9JCB0byBnZXQgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IG9mIHRoZSBwcmVkaWN0aW9uczsgCi0gZXh0cmFjdCB0aGUgZGlhZ29uYWwgb2YgdGhpcyBtYXRyaXggdG8gZ2V0IHZhcmlhbmNlcyBvZiBwcmVkaWN0aW9uczsKLSBpZiBjb21wdXRpbmcgcHJlZGljdGlvbiByYXRoZXIgdGhhbiBjb25maWRlbmNlIGludGVydmFscywgYWRkIHRoZSByZXNpZHVhbCB2YXJpYW5jZTsgCi0gdGFrZSB0aGUgc3F1YXJlLXJvb3Qgb2YgdGhlIHZhcmlhbmNlcyB0byBnZXQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgKGVycm9ycykgb2YgdGhlIHByZWRpY3Rpb25zOyAKLSBjb21wdXRlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGJhc2VkIG9uIGEgTm9ybWFsIGFwcHJveGltYXRpb247Ci0gZm9yIEdMKE0pTXMsIHJ1biB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBib3VuZGFyaWVzIChub3QgdGhlIHN0YW5kYXJkIGVycm9ycykgdGhyb3VnaCB0aGUgaW52ZXJzZS1saW5rIGZ1bmN0aW9uLgoKIyMjIGxtZQoKYGBge3IgbG1lcHJlZCxjYWNoZT1UUlVFLG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkobmxtZSkgCmZtMSA8LSBsbWUoZGlzdGFuY2UgfiBhZ2UqU2V4LCByYW5kb20gPSB+IDEgKyBhZ2UgfCBTdWJqZWN0LAogICAgICAgICAgIGRhdGEgPSBPcnRob2RvbnQpIApwbG90KE9ydGhvZG9udCxhc3A9ImZpbGwiKSAjIyBwbG90IHJlc3BvbnNlcyBieSBpbmRpdmlkdWFsCiMjIG5vdGUgdGhhdCBleHBhbmQuZ3JpZCgpIG9yZGVycyBmYWN0b3IgbGV2ZWxzIGJ5ICpvcmRlciBvZgojIyBhcHBlYXJhbmNlKiAtLSBtdXN0IG1hdGNoIGxldmVscyhPcnRob2RvbnQkU2V4KQpuZXdkYXQgPC0gZXhwYW5kLmdyaWQoYWdlPWMoOCwxMCwxMiwxNCksIFNleD1jKCJGZW1hbGUiLCJNYWxlIikpIApuZXdkYXQkcHJlZCA8LSBwcmVkaWN0KGZtMSwgbmV3ZGF0LCBsZXZlbCA9IDApCgojIyBbLTJdIGRyb3BzIHJlc3BvbnNlIGZyb20gZm9ybXVsYQpEZXNpZ25tYXQgPC0gbW9kZWwubWF0cml4KGZvcm11bGEoZm0xKVstMl0sIG5ld2RhdCkKcHJlZHZhciA8LSBkaWFnKERlc2lnbm1hdCAlKiUgdmNvdihmbTEpICUqJSB0KERlc2lnbm1hdCkpIApuZXdkYXQkU0UgPC0gc3FydChwcmVkdmFyKSAKbmV3ZGF0JFNFMiA8LSBzcXJ0KHByZWR2YXIrZm0xJHNpZ21hXjIpCgpsaWJyYXJ5KGdncGxvdDIpIApwZCA8LSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjQpIApnMCA8LSBnZ3Bsb3QobmV3ZGF0LGFlcyh4PWFnZSx5PXByZWQsY29sb3VyPVNleCkpKyAKICAgZ2VvbV9wb2ludChwb3NpdGlvbj1wZCkKY211bHQgPC0gMiAgIyMgY291bGQgdXNlIDEuOTYgaW5zdGVhZApnMCArIGdlb21fbGluZXJhbmdlKGFlcyh5bWluPXByZWQtY211bHQqU0UseW1heD1wcmVkK2NtdWx0KlNFKSwgcG9zaXRpb249cGQpCgojIyBwcmVkaWN0aW9uIGludGVydmFscyAKZzAgKyBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbj1wcmVkLWNtdWx0KlNFMix5bWF4PXByZWQrY211bHQqU0UyKSwgcG9zaXRpb249cGQpIApgYGAKCkEgc2ltaWxhciBhbnN3ZXIgaXMgbGFpZCBvdXQgaW4gdGhlIHJlc3BvbnNlcyB0byB0aGlzIFtTdGFja092ZXJmbG93IHF1ZXN0aW9uXShodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0MzU4ODExL2V4dHJhY3QtcHJlZGljdGlvbi1iYW5kLWZyb20tbG1lLWZpdCkuCgojIyMgbG1lNAoKQ3VycmVudCB2ZXJzaW9ucyBvZiBsbWU0IGhhdmUgYSBgcHJlZGljdGAgbWV0aG9kLgoKYGBge3IgbG1lNHByZWQsY2FjaGU9VFJVRX0KbGlicmFyeShsbWU0KQpsaWJyYXJ5KGdncGxvdDIpCmRhdGEoIk9ydGhvZG9udCIscGFja2FnZT0iTUVNU1MiKQpmbTEgPC0gbG1lcigKCWZvcm11bGEgPSBkaXN0YW5jZSB+IGFnZSpTZXggKyAoYWdlfFN1YmplY3QpCgksIGRhdGEgPSBPcnRob2RvbnQKKQpuZXdkYXQgPC0gZXhwYW5kLmdyaWQoCglhZ2U9Yyg4LDEwLDEyLDE0KQoJLCBTZXg9YygiRmVtYWxlIiwiTWFsZSIpCgksIGRpc3RhbmNlID0gMAopCm5ld2RhdCRkaXN0YW5jZSA8LSBwcmVkaWN0KGZtMSxuZXdkYXQscmUuZm9ybT1OQSkKbW0gPC0gbW9kZWwubWF0cml4KHRlcm1zKGZtMSksbmV3ZGF0KQojIyBvciBuZXdkYXQkZGlzdGFuY2UgPC0gbW0gJSolIGZpeGVmKGZtMSkKcHZhcjEgPC0gZGlhZyhtbSAlKiUgdGNyb3NzcHJvZCh2Y292KGZtMSksbW0pKQp0dmFyMSA8LSBwdmFyMStWYXJDb3JyKGZtMSkkU3ViamVjdFsxXSAgIyMgbXVzdCBiZSBhZGFwdGVkIGZvciBtb3JlIGNvbXBsZXggbW9kZWxzCmNtdWx0IDwtIDIgIyMgY291bGQgdXNlIDEuOTYKbmV3ZGF0IDwtIGRhdGEuZnJhbWUoCgluZXdkYXQKCSwgcGxvID0gbmV3ZGF0JGRpc3RhbmNlLWNtdWx0KnNxcnQocHZhcjEpCgksIHBoaSA9IG5ld2RhdCRkaXN0YW5jZStjbXVsdCpzcXJ0KHB2YXIxKQoJLCB0bG8gPSBuZXdkYXQkZGlzdGFuY2UtY211bHQqc3FydCh0dmFyMSkKCSwgdGhpID0gbmV3ZGF0JGRpc3RhbmNlK2NtdWx0KnNxcnQodHZhcjEpCikKI3Bsb3QgY29uZmlkZW5jZQpnMCA8LSBnZ3Bsb3QobmV3ZGF0LCBhZXMoeD1hZ2UsIHk9ZGlzdGFuY2UsIGNvbG91cj1TZXgpKStnZW9tX3BvaW50KCkKZzAgKyBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBwbG8sIHltYXggPSBwaGkpKSsKICAgIGxhYnModGl0bGU9IkNJIGJhc2VkIG9uIGZpeGVkLWVmZmVjdHMgdW5jZXJ0YWludHkgT05MWSIpCiNwbG90IHByZWRpY3Rpb24KZzAgKyBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSB0bG8sIHltYXggPSB0aGkpKSsKICAgIGxhYnModGl0bGU9IkNJIGJhc2VkIG9uIEZFIHVuY2VydGFpbnR5ICsgUkUgdmFyaWFuY2UiKQpybSgiT3J0aG9kb250IikgIyMgY2xlYW4gdXAKYGBgCgojIyMgZ2xtbVRNQgoKYGBge3IgZ2xtbVRNQnByZWQsY2FjaGU9VFJVRX0KbGlicmFyeShnbG1tVE1CKQpkYXRhKE9ydGhvZG9udCxwYWNrYWdlPSJubG1lIikKZm0yIDwtIGdsbW1UTUIoZGlzdGFuY2UgfiBhZ2UqU2V4ICsgKGFnZSB8IFN1YmplY3QpLAogICAgICAgICAgICAgICAgZGF0YSA9IE9ydGhvZG9udCwKICAgICAgICAgICAgICAgIGZhbWlseT0iZ2F1c3NpYW4iKQoKIyMgbWFrZSBwcmVkaWN0aW9uIGRhdGEgZnJhbWUKbmV3ZGF0IDwtIGV4cGFuZC5ncmlkKGFnZT1jKDgsMTAsMTIsMTQpLCBTZXg9YygiRmVtYWxlIiwiTWFsZSIpKQojIyBkZXNpZ24gbWF0cml4IChmaXhlZCBlZmZlY3RzKQptbSA8LSBtb2RlbC5tYXRyaXgoZGVsZXRlLnJlc3BvbnNlKHRlcm1zKGZtMikpLG5ld2RhdCkKIyMgbGluZWFyIHByZWRpY3RvciAoZm9yIEdMTU1zLCBiYWNrLXRyYW5zZm9ybSB0aGlzIHdpdGggdGhlCiMjICBpbnZlcnNlIGxpbmsgZnVuY3Rpb24gKGUuZy4gcGxvZ2lzKCkgZm9yIGJpbm9taWFsLCBiZXRhOwojIyAgZXhwKCkgZm9yIFBvaXNzb24sIG5lZ2F0aXZlIGJpbm9taWFsCm5ld2RhdCRkaXN0YW5jZSA8LSBkcm9wKG1tICUqJSBmaXhlZihmbTIpW1siY29uZCJdXSkKcHJlZHZhciA8LSBkaWFnKG1tICUqJSB2Y292KGZtMilbWyJjb25kIl1dICUqJSB0KG1tKSkKbmV3ZGF0JFNFIDwtIHNxcnQocHJlZHZhcikgCm5ld2RhdCRTRTIgPC0gc3FydChwcmVkdmFyK3NpZ21hKGZtMileMikKYGBgCgooUHJvYmFibHkgb3Zlcmx5IGNvbXBsaWNhdGVkKSBgZ2dwbG90YCBjb2RlOgpgYGB7ciBnZ3Bsb3R9CmxpYnJhcnkoZ2dwbG90Mik7ICB0aGVtZV9zZXQodGhlbWVfYncoKSkKcGQgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MC40KQpnMCA8LSBnZ3Bsb3QoT3J0aG9kb250LGFlcyh4PWFnZSx5PWRpc3RhbmNlLGNvbG91cj1TZXgpKSsKICAgIHN0YXRfc3VtKGFscGhhPTAuMixhZXMoc2l6ZT0uLm4uLikpKwogICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGJyZWFrcz0xOjQscmFuZ2U9YygyLDUpKQpnMSA8LSBnMCtnZW9tX2xpbmUoZGF0YT1uZXdkYXQscG9zaXRpb249cGQpKwogICAgZ2VvbV9wb2ludChkYXRhPW5ld2RhdCxzaGFwZT0xNyxzaXplPTMscG9zaXRpb249cGQpCiMjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCmcyIDwtIGcxICsgZ2VvbV9saW5lcmFuZ2UoZGF0YT1uZXdkYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHltaW49ZGlzdGFuY2UtMipTRSx5bWF4PWRpc3RhbmNlKzIqU0UpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGx3ZD0yLCBwb3NpdGlvbj1wZCkKIyMgcHJlZGljdGlvbiBpbnRlcnZhbHMgCmcyICsgZ2VvbV9saW5lcmFuZ2UoZGF0YT1uZXdkYXQsCiAgICAgICAgICAgICAgICAgICAgYWVzKHltaW49ZGlzdGFuY2UtMipTRTIseW1heD1kaXN0YW5jZSsyKlNFMiksIHBvc2l0aW9uPXBkKQpgYGAKClRoZSBgZWZmZWN0c2AsIGBlbW1lYW5zYCwgYW5kIGBzalBsb3RgIHBhY2thZ2VzIGFyZSBhbHNvIHVzZWZ1bCBoZXJlLgoKIyMgQ29uZmlkZW5jZSBpbnRlcnZhbHMgb24gY29uZGl0aW9uYWwgbWVhbnMvQkxVUHMvcmFuZG9tIGVmZmVjdHMKCiMjIyBsbWU0IAoKKEZyb20gSGFyb2xkIERvcmFuLCB1cGRhdGVkIGJ5IEFzc2FmIE9yb24gTm92LiAyMDEzOikKCklmIHlvdSB3YW50IHRoZSBzdGFuZGFyZCBlcnJvcnMgb2YgdGhlIGNvbmRpdGlvbmFsIG1lYW5zLCB5b3UgY2FuIGV4dHJhY3QgdGhlbSBhcyBmb2xsb3dzOgpgYGB7ciBzdGRlcl9jb25kbWVhbnN9CmxpYnJhcnkobG1lNCkKZm0xIDwtIGxtZXIoUmVhY3Rpb24gfiBEYXlzICsgKERheXN8U3ViamVjdCksIHNsZWVwc3R1ZHkpCmNWIDwtIHJhbmVmKGZtMSwgY29uZFZhciA9IFRSVUUpICAgCmBgYApgY1ZgIGlzIGEgbGlzdDsgZWFjaCBlbGVtZW50IGlzIGEgZGF0YSBmcmFtZSBjb250YWluaW5nIHRoZSBjb25kaXRpb25hbCBtb2RlcyBmb3IgYSBwYXJ0aWN1bGFyIGdyb3VwaW5nIGZhY3Rvci4gSWYgeW91IHVzZSBzY2FsYXIgcmFuZG9tIGVmZmVjdHMgKHR5cGljYWxseSByYW5kb20gaW50ZXJjZXB0cyksIHRoZW4gc3BlY2lmeWluZyBgcmFuZWYoLi4uLGRyb3A9VFJVRSlgIHdpbGwgcmV0dXJuIHRoZSBjb25kaXRpb25hbCBtb2RlcyBhcyBhIHNpbmdsZSBuYW1lZCB2ZWN0b3IgaW5zdGVhZC4KClRoZSBjb25kaXRpb25hbCB2YXJpYW5jZXMgYXJlIHJldHVybmVkIGFzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY29uZGl0aW9uYWwgbW9kZXMuCkl0IG1heSBiZSBlYXNpZXN0IHRvIHVzZSBgYXMuZGF0YS5mcmFtZShjVilgLCBvciBgYnJvb20ubWl4ZWQ6OnRpZHkoZm0xLCBlZmZlY3RzPSJyYW5fdmFscyIpYCwgdG8gZXh0cmFjdCBhbGwgb2YgdGhlIGNvbmRpdGlvbmFsIG1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zLgoKT3IsIGRpZ2dpbmcgaW4gdG8gdGhlIGRhdGEgc3RydWN0dXJlIGJ5IGhhbmQ6IGlmIHdlIHNldApgYGB7ciByYW52YXJ9CnJhbnZhciA8LSBhdHRyKGNWW1sxXV0sICJwb3N0VmFyIikKYGBgCnRoZW4gYHJhbnZhcmAgaXMgYSAzLUQgYXJyYXkgKHRoZSBhdHRyaWJ1dGUgaXMgc3RpbGwgY2FsbGVkIGBwb3N0VmFyYCwgcmF0aGVyIHRoYW4gYGNvbmRWYXJgLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkpLiBJbmRpdmlkdWFsLWxldmVsIGNvdmFyaWFuY2UgbWF0cmljZXMgb2YgdGhlIGNvbmRpdGlvbmFsIG1vZGVzIHdpbGwgc2l0IG9uIHRoZSBgWywsaV1gIGZhY2VzLiBGb3IgZXhhbXBsZSwgYHJhbnZhclssLDFdYCBpcyB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggb2YgdGhlIGNvbmRpdGlvbmFsIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGZpcnN0IGdyb3VwLCBzbwpgYGB7ciBzcXJ0ZGlhZ3JhbnZhcnN9CnNxcnQoZGlhZyhyYW52YXJbLCwxXSkpCmBgYAp3aWxsIHByb3ZpZGUgdGhlIGludGVyY2VwdCBhbmQgc2xvcGUgc3RhbmRhcmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgdGhlIGZpcnN0IGdyb3VwJ3MgY29uZGl0aW9uYWwgbW9kZXMuIElmIHlvdSBoYXZlIGEgc2NhbGFyIHJhbmRvbSBlZmZlY3QgYW5kIHVzZWQgYGRyb3A9VFJVRWAgaW4gYHJhbmVmKClgLCB0aGVuIHlvdSB3aWxsIChtZXJjaWZ1bGx5KSByZWNlaXZlIG9ubHkgYSB2ZWN0b3Igb2YgaW5kaXZpZHVhbCB2YXJpYW5jZXMgaGVyZSAob25lIGZvciBlYWNoIGxldmVsIG9mIHRoZSBncm91cGluZyBmYWN0b3IpLiBUaGUgZm9sbG93aW5nIGluY2FudGF0aW9uIHdpbGwgZ2l2ZSBhIG1hdHJpeCBvZiBjb25kaXRpb25hbCB2YXJpYW5jZXMgd2l0aCBvbmUgcm93IGZvciBlYWNoIGdyb3VwIGFuZCBvbmUgY29sdW1uIGZvciBlYWNoIHBhcmFtZXRlcnM6CmBgYHtyIHJhbnNlfQpuZyA8LSBkaW0ocmFudmFyKVszXQpucCA8LSBkaW0ocmFudmFyKVsyXQptbSA8LSBtYXRyaXgocmFudmFyW2NiaW5kKHJlcChzZXEobnApLG5nKSwKICAgICAgICAgICAgIHJlcChzZXEobnApLG5nKSwKICAgICAgICAgICAgIHJlcChuZyxlYWNoPW5wKSldLAogICAgICAgYnlyb3c9VFJVRSwKICAgICAgIG5yb3c9bmcpCmBgYCAgICAgICAgICAgICAKCkdldHRpbmcgdGhlIHVuY2VydGFpbnR5IG9mIHRoZSBjb2VmZmljaWVudHMgKGkuZS4sIHdoYXQncyByZXR1cm5lZCBieSBgY29lZigpYDogdGhlIHN1bSBvZiB0aGUgZml4ZWQtZWZmZWN0IGFuZCByYW5kb20tZWZmZWN0IHByZWRpY3Rpb25zIGZvciBhIHBhcnRpY3VsYXIgbGV2ZWwpIGlzIG5vdCAoYWxhcykgY3VycmVudGx5IGVhc3kgd2l0aCBgbG1lNGAuIElmIHRoZSBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdHMgd2VyZSBpbmRlcGVuZGVudCB0aGVuIHdlIGNvdWxkIHNpbXBseSBhZGQgdGhlIGNvbmRpdGlvbmFsIHZhcmlhbmNlIGFuZCB0aGUgdmFyaWFuY2Ugb2YgdGhlIGZpeGVkLWVmZmVjdCBwcmVkaWN0aW9ucywgYnV0IHRoZXkgYXJlbid0IGluIGdlbmVyYWwuIFRoZXJlIGlzIGEgbG9uZyBbci1zaWctbWl4ZWQtbW9kZWxzIG1haWxpbmcgbGlzdCB0aHJlYWRdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL3BpcGVybWFpbC9yLXNpZy1taXhlZC1tb2RlbHMvMjAxM3ExLzAxOTc5NS5odG1sKSB0aGF0IGRpc2N1c3NlcyB0aGUgaXNzdWVzLCBmb2N1c2luZyBvbiAoMSkgaG93IHRvIGV4dHJhY3QgdGhlIGNvdmFyaWFuY2UgYmV0d2VlbiBmaXhlZC1lZmZlY3QgZXN0aW1hdGUgYW5kIHRoZSByYW5kb20tZWZmZWN0IHByZWRpY3Rpb247ICgyKSB3aGV0aGVyIHRoaXMgdmFsdWUgKHRoZSBjb3ZhcmlhbmNlIGJldHdlZW4gYW4gKmVzdGltYXRlZCogcGFyYW1ldGVyIGFuZCBhICpwcmVkaWN0ZWQqIG1vZGUgb2YgYSBjb25kaXRpb25hbCBkaXN0cmlidXRpb24gb2YgYSByYW5kb20gdmFyaWFibGUpIGV2ZW4gbWFrZXMgc2Vuc2UgaW4gYSBmcmVxdWVudGlzdCBmcmFtZXdvcmsuIElmIHlvdSdyZSB3aWxsaW5nIHRvICphc3N1bWUqIGluZGVwZW5kZW5jZSBvZiB0aGUgY29uZGl0aW9uYWwgdmFyaWFuY2UgYW5kIHRoZSBmaXhlZC1lZmZlY3Qgc2FtcGxpbmcgdmFyaWFuY2UsIHRoZW4gKGUuZy4pIHRoZSB2YXJpYW5jZSBvZiB0aGUgaW50ZXJjZXB0cyBmb3IgZWFjaCBncm91cCB3b3VsZCBiZSB0aGUgc3VtIG9mIHRoZSBmaXhlZC1lZmZlY3QgaW50ZXJjZXB0IHZhcmlhbmNlIGFuZCB0aGUgY29uZGl0aW9uYWwgdmFyaWFuY2Ugb2YgdGhlIGludGVyY2VwdCBmb3IgZWFjaCBncm91cDoKCmBgYHtyIGNvbWJ9CnZjb3YoZm0xKVsxLDFdK21tWywxXQpgYGAKCiMjIFBvd2VyIGFuYWx5c2lzCgpQb3dlciBhbmFseXNpcyBmb3IgKEcpTE1NcyBpcyBtb3N0bHkgZG9uZSBieSBzaW11bGF0aW9uLCBhbHRob3VnaAp0aGVyZSBhcmUgc29tZSBjbG9zZWQtZm9ybSBzb2x1dGlvbnMgYW5kIGFwcHJveGltYXRpb25zLCBlLmcuCkBzbmlqZGVyc19zdGFuZGFyZF8xOTkzIChTbmlqZGVycyBoYXMgbGlua3MgdG8gcHJvZ3JhbXMgYW5kIG90aGVyIHJlc291cmNlcwpvbiBbaGlzIHdlYiBwYWdlXShodHRwczovL3d3dy5zdGF0cy5veC5hYy51ay9+c25pamRlcnMvbXVsdGlsZXZlbC5odG0pKS4gVGhlcmUgYXJlIHJlc291cmNlcyBhbmQgYml0cyBvZiBjb2RlIGV4YW1wbGVzIHNwcmVhZCBhbGwgb3ZlciB0aGUgaW50ZXJuZXQuIGUuZy4gW2hlcmVdKGh0dHBzOi8vcnB1YnMuY29tL2Jib2xrZXIvMTE3MDMpLgoKQGthaW5fcHJhY3RpY2FsXzIwMTUgYW5kIEBqb2huc29uX3Bvd2VyXzIwMTUgYXJlIHBlZXItcmV2aWV3ZWQgcGFwZXJzCnRoYXQgZGlzY3VzcyBwb3dlciBhbmFseXNpcyB2aWEgc2ltdWxhdGlvbiBpbiBtb3JlIGRldGFpbC4KCmBgYHtyIGV2YWw9RkFMU0V9CmxpYnJhcnkoc29zKTsgZmluZEZuKCJ7cG93ZXIgYW5hbHlzaXN9IG1peGVkIHNpbXVsYXRpb24iKQpgYGAKbG9jYXRlcyB0aGUgYGZ1bGxmYWN0YCwgYHBhbW1gLCBgc2ltcmAsIGFuZCBgc2ltZ2xtYCBwYWNrYWdlcy4KRGVwZW5kaW5nIG9uIHRoZSBnb2FsLCBvbmUgb2YgdGhlc2UgcGFja2FnZXMgbWF5IGhhdmUgc3VmZmljaWVudApmbGV4aWJpbGl0eSB0byBkbyB3aGF0IHlvdSB3YW50LgoKIyBNb2RlbCBzZWxlY3Rpb24gYW5kIGF2ZXJhZ2luZwoKIyMgQ2FuIEkgdXNlIEFJQyBmb3IgbWl4ZWQgbW9kZWxzPyAgSG93IGRvIEkgY291bnQgdGhlIG51bWJlciBvZiBkZWdyZWVzIG9mIGZyZWVkb20gZm9yIGEgcmFuZG9tIGVmZmVjdD8KCi0gWWVzLCB3aXRoIGNhdXRpb24uCi0gSXQgZGVwZW5kcyBvbiB0aGUgImxldmVsIG9mIGZvY3VzIiAoKnNlbnN1KiBAc3BpZWdlbGhhbHRlcl9iYXllc2lhbl8yMDAyKSB3aGV0aGVyIChlLmcuKSBhIHNpbmdsZSByYW5kb20tZWZmZWN0IHZhcmlhbmNlIHNob3VsZCBiZSBjb3VudGVkIGFzIDEgZGVncmVlIG9mIGZyZWVkb20gKGkuZS4sIHRoZSB2YXJpYW5jZSBwYXJhbWV0ZXIgb3IgYXMgYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIE4tMSAod2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGdyb3Vwcyk6IHNlZSBAdmFpZGFfY29uZGl0aW9uYWxfMjAwNSBhbmQgQGdyZXZlbl9iZWhhdmlvdXJfMjAxMC4gIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBwb3B1bGF0aW9uLWxldmVsIHByZWRpY3Rpb24vaW5mZXJlbmNlLCB0aGVuIHRoZSBmb3JtZXIgKGNhbGxlZCAqbWFyZ2luYWwgQUlDKiBbbUFJQ10pOyBpZiBpbmRpdmlkdWFsLWxldmVsIHByZWRpY3Rpb24vaW5mZXJlbmNlIChpLmUuLCB1c2luZyB0aGUgQkxVUHMvY29uZGl0aW9uYWwgbW9kZXMpLCB0aGVuIHRoZSBsYXR0ZXIgKGNhbGxlZCAqY29uZGl0aW9uYWwgQUlDKiBbY0FJQ10pLiBHcmV2ZW4gYW5kIEtuZWliIHByZXNlbnQgcmVzdWx0cyBmb3IgbGluZWFyIG1vZGVscywgZ2l2aW5nIGEgdmVyc2lvbiBvZiBjQUlDIHRoYXQgaXMgYm90aCBjb21wdXRhdGlvbmFsbHkgZWZmaWNpZW50IGFuZCB0YWtlcyB1bmNlcnRhaW50eSBpbiB0aGUgZXN0aW1hdGlvbiBvZiB0aGUgdmFyaWFuY2VzIGludG8gYWNjb3VudC4gIChCb2IgTydIYXJhIGhhcyBhIHZlcnkgbmljZSwgaWxsdXN0cmF0aXZlIFtibG9nIHBvc3RdKGh0dHA6Ly9kZWVwdGhvdWdodHNhbmRzaWxsaW5lc3MuYmxvZ3Nwb3QuY2EvMjAwNy8xMi9mb2N1cy1vbi1kaWMuaHRtbCkgb24gdGhpcyB0b3BpYyBpbiB0aGUgY29udGV4dCBvZiBESUMgLi4uKQotIGluIGNhc2VzIHdoZW4gdGVzdGluZyBhIHZhcmlhbmNlIHBhcmFtZXRlciwgQUlDIG1heSBiZSBzdWJqZWN0IHRvIHRoZSBzYW1lIGtpbmRzIG9mIGJvdW5kYXJ5IGVmZmVjdHMgYXMgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IHAtdmFsdWVzIChpLmUuLCBBSUNzIG1heSBiZSBjb25zZXJ2YXRpdmUvb3ZlcmZpdCBzbGlnaHRseSB3aGVuIHRoZSBuZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGlzIG9uIHRoZSBib3VuZGFyeSBvZiB0aGUgZmVhc2libGUgc3BhY2UpLiBAZ3JldmVuX2JlaGF2aW91cl8yMDEwIGV4cGxvcmUgdGhlIHByb2JsZW1zIHdpdGggbUFJQyBpbiB0aGlzIGNvbnRleHQsIGJ1dCBkbyBub3Qgc3VnZ2VzdCBhIHNvbHV0aW9uICh0aGV5IHBvaW50IG91dCB0aGF0IEBodWdoZXNfbW9kZWxfMjAwMyBwcmVzZW50IGEgJ29uZS1zaWRlZCcgQUlDLCBidXQgbm90IG9uZSB0aGF0IGRlYWxzIHdpdGggdGhlIG5vbi1pbmRlcGVuZGVuY2Ugb2YgZGF0YSBwb2ludHMuICBJIGhhdmVuJ3QgcmVhZCBIdWdoZXMgYW5kIEtpbmcsIEkgc2hvdWxkIGdvIGRvIHRoYXQpLgotIEFJQyBhbHNvIGluaGVyaXRzIHRoZSBwcmltYXJ5IHByb2JsZW0gb2YgbGlrZWxpaG9vZCByYXRpbyB0ZXN0cyBpbiB0aGUgR0xNTSBjb250ZXh0IC0tIHRoYXQgaXMsIHRoYXQgTFJUcyBhcmUgYXN5bXB0b3RpYyB0ZXN0cy4gQSBmaW5pdGUtc2l6ZSBjb3JyZWN0aW9uIGZvciBBSUMgZG9lcyBleGlzdCAoQUlDYykgLS0gYnV0IGl0IHdhcyBkZXZlbG9wZWQgaW4gdGhlIGNvbnRleHQgb2YgbGluZWFyIG1vZGVscy4gQXMgZmFyIGFzIEkga25vdyBpdHMgYWRlcXVhY3kgaW4gdGhlIEdMTU0gY2FzZSBoYXMgbm90IGJlZW4gZXN0YWJsaXNoZWQuIFNlZSBlLmcuIEByaWNoYXJkc190ZXN0aW5nXzIwMDUgZm9yIGNhdXRpb24gYWJvdXQgQUlDYyBpbiB0aGUgR0xNIChub3QgR0xNTSkgY2FzZS4KLSBsbWU0IGFuZCBubG1lIGNvdW50IHBhcmFtZXRlcnMgZm9yIEFJQyhjKSBhcyBmb2xsb3dzOgogICAgLSB0aGUgbnVtYmVyIG9mIGZpeGVkLWVmZmVjdCBwYXJhbWV0ZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZCAodGhlIGxlbmd0aCBvZiB0aGUgZml4ZWQtZWZmZWN0IHBhcmFtZXRlciB2ZWN0b3IgYmV0YSwgaS5lLiBgbGVuZ3RoKGZpeGVmKG1vZGVsKSlgKQoJLSBlYWNoIHJhbmRvbSB0ZXJtIGluIHRoZSBtb2RlbCB3aXRoICRxJCBjb21wb25lbnRzIGNvdW50cyBmb3IgJHEocSsxKS8yJCBwYXJhbWV0ZXJzIC0tIGZvciBleGFtcGxlLCBhIHRlcm0gb2YgdGhlIGZvcm0gKHNsb3BlfGdyb3VwKSBoYXMgMyBwYXJhbWV0ZXJzIChpbnRlcmNlcHQgdmFyaWFuY2UsIHNsb3BlIHZhcmlhbmNlLCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGludGVyY2VwdCBhbmQgc2xvcGUpLgogICAgLSBtb2RlbHMgdGhhdCB1c2UgYSBzY2FsZSBwYXJhbWV0ZXIgKGUuZy4gdGhlIHZhcmlhbmNlIHBhcmFtZXRlciBvZiBsaW5lYXIgbWl4ZWQgbW9kZWxzLCBvciB0aGUgc2NhbGUgcGFyYW1ldGVyIG9mIGEgR2FtbWEgR0xNTSAtLSBzdGFuZGFyZCBHTE1NcyBzdWNoIGFzIGJpbm9taWFsIGFuZCBQb2lzc29uIGRvIG5vdCkgZ2V0IGFuIGV4dHJhIHBhcmFtZXRlciBjb3VudGVkLiBXaGV0aGVyIHRvIGFkZCBudWlzYW5jZSBwYXJhbWV0ZXJzIG9yIG5vdCwgc3VjaCBhcyB0aGUgcmVzaWR1YWwgdmFyaWFuY2UgcGFyYW1ldGVyIChlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIHJlc2lkdWFsIHZhcmlhbmNlLCByYXRoZXIgdGhhbiBhbiBleHBsaWNpdCBwYXJhbWV0ZXIgaW4gdGhlIG9wdGltaXphdGlvbikgaXMgYXMgZmFyIGFzIEkga25vdyBhbiBvcGVuIHF1ZXN0aW9uLiAgSW4gdGhlIGNsYXNzaWMgQUlDIGNvbnRleHQgaXQgZG9lc24ndCBtYXR0ZXIgYXMgbG9uZyBhcyBvbmUgaXMgY29uc2lzdGVudC4gIEluIHRoZSBBSUNjIGNvbnRleHQsIEkgZG9uJ3QgdGhpbmsgYW55b25lIHJlYWxseSBrbm93cyB0aGUgYW5zd2VyIC4uLiBhZGRpbmcgKzEgZm9yIHRoZSByZXNpZHVhbCB2YXJpYW5jZSBwYXJhbWV0ZXIgKGFzIGxtZTQgZG9lcykgd291bGQgbWFrZSB0aGUgbW9kZWwgc2VsZWN0aW9uIHByb2Nlc3Mgc2xpZ2h0bHkgbW9yZSBjb25zZXJ2YXRpdmUuCgojIE1vZGVsIHN1bW1hcmllcyAoZ29vZG5lc3Mtb2YtZml0LCBkZWNvbXBvc2l0aW9uIG9mIHZhcmlhbmNlLCBldGMuKQoKIyMgSG93IGRvIEkgY29tcHV0ZSBhIGNvZWZmaWNpZW50IG9mIGRldGVybWluYXRpb24gKCRSXjIkKSwgb3IgYW4gYW5hbG9ndWUsIGZvciAoRylMTU1zPwoKIyMjIFByb2JsZW0KCigqVGhpcyB0b3BpYyBhcHBsaWVzIHRvIGJvdGggTE1NcyBhbmQgR0xNTXMsIHBlcmhhcHMgbW9yZSBzbyB0byBMTU1zLCBiZWNhdXNlIHRoZSBpc3N1ZXMgYXJlIGV2ZW4gaGFyZGVyIGZvciBHTE1Ncy4qKQoKUmVzZWFyY2hlcnMgb2Z0ZW4gd2FudCB0byBrbm93IGlmIHRoZXJlIGlzIGEgc2ltcGxlIChvciBhdCBsZWFzdCBpbXBsZW1lbnRlZC1pbi1SKSB3YXkgdG8gZ2V0IGFuIGFuYWxvZ3VlIG9mICRSXjIkIG9yIGFub3RoZXIgc2ltcGxlIGdvb2RuZXNzLW9mLWZpdCBtZXRyaWMgZm9yIExNTXMgb3IgR0xNTXMuIFRoaXMgaXMgYSBjaGFsbGVuZ2luZyBxdWVzdGlvbiBpbiBib3RoIHRoZSBHTE0gYW5kIExNTSB3b3JsZHMgKGFuZCB0aGVyZWZvcmUgZG91Ymx5IHNvIGZvciBHTE1NcyksIGJlY2F1c2UgaXQgdHVybnMgb3V0IHRoYXQgdGhlIHdvbmRlcmZ1bCBzaW1wbGljaXR5IG9mICRSXjIkIGJyZWFrcyBkb3duIGluIHRoZSBleHRlbnNpb24gdG8gR0xNcyBvciBMTU1zLiBJZiB5b3UncmUgdHJ5aW5nIHRvIHF1YW50aWZ5ICJmcmFjdGlvbiBvZiB2YXJpYW5jZSBleHBsYWluZWQiIGluIHRoZSBHTE0gY29udGV4dCwgc2hvdWxkIHlvdSBpbmNsdWRlIG9yIGV4Y2x1ZGUgc2FtcGxpbmcgdmFyaWF0aW9uIChlLmcuLCBQb2lzc29uIHZhcmlhdGlvbiBhcm91bmQgdGhlIGV4cGVjdGVkIG1lYW4pPyBbQWNjb3JkaW5nIHRvIGFuIGBzb3M6OmZpbmRGbmAgc2VhcmNoIGZvciAiTmFnZWxrZXJrZSIsIG9uZSBvZiB0aGUgY29tbW9uIHNvbHV0aW9ucyB0byB0aGlzIHByb2JsZW0sIHRoZSBgTG9nUmVnUjJgIGZ1bmN0aW9uIGluIHRoZSBgZGVzY3JgIHBhY2thZ2UgY29tcHV0ZXMgc2V2ZXJhbCBkaWZmZXJlbnQgInBzZXVkby0kUl4yJCIgbWVhc3VyZXMgZm9yIGxvZ2lzdGljIHJlZ3Jlc3Npb24uXSAgSWYgeW91J3JlIHRyeWluZyB0byBxdWFudGlmeSBpdCBpbiB0aGUgTE1NIGNvbnRleHQsIHNob3VsZCB5b3UgaW5jbHVkZSBvciBleGNsdWRlIHZhcmlhdGlvbiBvZiBkaWZmZXJlbnQgcmFuZG9tLWVmZmVjdHMgdGVybXM/CgpUaGUgc2FtZSBxdWVzdGlvbnMgYXBwbHkgbW9yZSBnZW5lcmFsbHkgdG8gZGVjb21wb3NpdGlvbiBvZiB2YXJpYW5jZSAoaS5lLiB0cnlpbmcgdG8gYXNzZXNzIHRoZSBjb250cmlidXRpb24gb2YgdmFyaW91cyBtb2RlbCBjb21wb25lbnRzIHRvIHRoZSBvdmVyYWxsIGZpdCwgbm90IGp1c3QgdHJ5aW5nIHRvIGFzc2VzcyB0aGUgb3ZlcmFsbCBnb29kbmVzcy1vZi1maXQgb2YgdGhlIG1vZGVsKTsgdGhlcmUgaXMgdW5saWtlbHkgdG8gYmUgYSBzaW5nbGUgcmVjaXBlIHRoYXQgZG9lcyBldmVyeXRoaW5nIHlvdSB3YW50LgoKVGhpcyBoYXMgYmVlbiBkaXNjdXNzZWQgYXQgdmFyaW91cyB0aW1lcyBvbiB0aGUgbWFpbGluZyBsaXN0cy4gW1RoaXMgdGhyZWFkXShodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxhbmcuci5sbWU0LmRldmVsLzMyODEpIGFuZCBbdGhpcyB0aHJlYWRdKGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAubGFuZy5yLmxtZTQuZGV2ZWwvNjg0KSBvbiB0aGUgci1zaWctbWl4ZWQtbW9kZWxzICBtYWlsaW5nIGxpc3QgYXJlIGdvb2Qgc3RhcnRpbmcgcG9pbnRzLCBhbmQgW3RoaXMgcG9zdF0oaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5sYW5nLnIubG1lNC5kZXZlbC8yMTQzKSBpcyB1c2VmdWwgdG9vLgoKSW4gb25lIG9mIHRob3NlIHRocmVhZHMsIERvdWcgQmF0ZXMgc2FpZDoKCj4gQXNzdW1pbmcgdGhhdCBvbmUgd2FudHMgdG8gZGVmaW5lIGFuIFJeMiBtZWFzdXJlLCBJIHRoaW5rIGFuCj4gYXJndW1lbnQgY291bGQgYmUgbWFkZSBmb3IgdHJlYXRpbmcgdGhlIHBlbmFsaXplZCByZXNpZHVhbCBzdW0gb2YKPiBzcXVhcmVzIGZyb20gYSBsaW5lYXIgbWl4ZWQgbW9kZWwgaW4gdGhlIHNhbWUgd2F5IHRoYXQgd2UgY29uc2lkZXIgdGhlCj4gcmVzaWR1YWwgc3VtIG9mIHNxdWFyZXMgZnJvbSBhIGxpbmVhciBtb2RlbC4gIE9yIG9uZSBjb3VsZCB1c2UganVzdAo+IHRoZSByZXNpZHVhbCBzdW0gb2Ygc3F1YXJlcyB3aXRob3V0IHRoZSBwZW5hbHR5IG9yIHRoZSBtaW5pbXVtCj4gcmVzaWR1YWwgc3VtIG9mIHNxdWFyZXMgb2J0YWluYWJsZSBmcm9tIGEgZ2l2ZW4gc2V0IG9mIHRlcm1zLCB3aGljaAo+IGNvcnJlc3BvbmRzIHRvIGFuIGluZmluaXRlIHByZWNpc2lvbiBtYXRyaXguICBJIGRvbid0IGtub3csIHJlYWxseS4KPiBJdCBkZXBlbmRzIG9uIHdoYXQgeW91IGFyZSB0cnlpbmcgdG8gY2hhcmFjdGVyaXplLgoKIyMjIFNpbXBsZS9jcnVkZSBzb2x1dGlvbnMKCkluIG9uZSBvZiB0aG9zZSB0aHJlYWRzLCBKYXJyZXR0IEJ5cm5lcyBjb250cmlidXRlZCB0aGUgZm9sbG93aW5nIGNvZGU6CmBgYHtyIHIyY29ycn0KcjIuY29yci5tZXIgPC0gZnVuY3Rpb24obSkgewogICBsbWZpdCA8LSAgbG0obW9kZWwucmVzcG9uc2UobW9kZWwuZnJhbWUobSkpIH4gZml0dGVkKG0pKQogICBzdW1tYXJ5KGxtZml0KSRyLnNxdWFyZWQKfQpgYGAKCiRcT21lZ2FeMl8wJCBbQHh1X21lYXN1cmluZ18yMDAzXSwgd2hpY2ggaXMgYWxtb3N0IHRoZSBzYW1lLCBpcyBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIHJlc2lkdWFsIHZhcmlhbmNlIG9mIHRoZSBmdWxsIG1vZGVsIGFnYWluc3QgdGhlIHJlc2lkdWFsIHZhcmlhbmNlIG9mIGEgKGZpeGVkKSBpbnRlcmNlcHQtb25seSBudWxsIG1vZGVsOiAKCmBgYHtyIHJlc3ZhcixldmFsPUZBTFNFfQoxLXZhcihyZXNpZHVhbHMobSkpL3Zhcihtb2RlbC5yZXNwb25zZShtb2RlbC5mcmFtZShtKSkpCmBgYAoKQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0aGUgc3F1YXJlZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhbmQgdGhlIHByZWRpY3RlZCB2YWx1ZXM6CgpgYGB7ciByZXNjb3JzcSwgZXZhbD1GQUxTRX0KY29yKG1vZGVsLnJlc3BvbnNlKG1vZGVsLmZyYW1lKG0pKSxwcmVkaWN0KG0sdHlwZT0icmVzcG9uc2UiKSleMgpgYGAKCiMjIyBTb3BoaXN0aWNhdGVkIHNvbHV0aW9ucwoKQGdlbG1hbl9iYXllc2lhbl8yMDA2IHByb3Bvc2UvZGlzY3VzcyBCYXllc2lhbiBtZWFzdXJlcyBvZiAkUl4yJCAoSSBkb24ndCBrbm93IGlmIGFueW9uZSBoYXMgY3JlYXRlZCBhIGNhbm5lZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZWFzdXJlcyBpbiBSKS4KQG5ha2FnYXdhX2dlbmVyYWxfMjAxMyBhbmQgQGpvaG5zb25fZXh0ZW5zaW9uXzIwMTQgaGF2ZSBhbHNvIHByb3Bvc2VkIGEgZ2VuZXJhbCBtZXRob2RvbG9neSBmb3IgY29tcHV0aW5nICRSXjIkOyBKLiBMZWZjaGVjayBnaXZlcyBleGFtcGxlcyBbaGVyZV0oaHR0cHM6Ly9qb25sZWZjaGVjay5uZXQvMjAxMy8wMy8xMy9yMi1mb3ItbGluZWFyLW1peGVkLWVmZmVjdHMtbW9kZWxzLykgYW5kIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vanNsZWZjaGUvcGllY2V3aXNlU0VNL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNnZXQtcjItZm9yLWluZGl2aWR1YWwtbW9kZWxzKSwgYmFzZWQgb24gaGlzIGltcGxlbWVudGF0aW9uIGluIHRoZSBgcGllY2V3aXNlU0VNYCBwYWNrYWdlIChbQ1JBTl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BpZWNld2lzZVNFTS9pbmRleC5odG1sKSwgW0dpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2pzbGVmY2hlL3BpZWNld2lzZVNFTSkpLiBTZWUgYWxzbyBAamFlZ2VyX3IyXzIwMTcsIEByaWdodHNfcXVhbnRpZnlpbmdfMjAxOCAuLi4KCkEgcmVsYXRlZCBxdWVzdGlvbiBpcyBob3cgdG8gcXVhbnRpZnkgInJlcGVhdGFiaWxpdHkiIChpLmUuLCByYXRpb3Mgb2YgdmFyaWFuY2UgYXQgZGlmZmVyZW50IGxldmVscykgaW4gR0xNTXMsIGVzcGVjaWFsbHkgaG93IHRvIGNvbXB1dGUgdGhlICJyZXNpZHVhbCBlcnJvciIgdGVybSBmb3IgR0xNTXM6IHNlZSBAbmFrYWdhd2FfcmVwZWF0YWJpbGl0eV8yMDEwIGFuZCB0aGUgW3JwdFIgcGFja2FnZV0oaHR0cDovL3JwdHIuci1mb3JnZS5yLXByb2plY3Qub3JnLykuCgpUaGUgYm90dG9tIGxpbmUgaXMgdGhhdCB0aGVyZSBhcmUgc29tZSBzaW1wbGUgcmVjaXBlcyAoYW5kIHNvbWUgbW9yZSBjb21wbGV4IHJlY2lwZXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGJlZW4gY29kZWQgdXAgYnkgc29tZW9uZSksIGJ1dCB0aGF0ICcnJ3lvdSBoYXZlIHRvIHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGF0IGluZm9ybWF0aW9uIHlvdSB3YW50IHRvIGdldCBvdXQgb2YgdGhlIGNvZWZmaWNpZW50IG9mIGRldGVybWluYXRpb24nJycsIGJlY2F1c2Ugbm8gcmVjaXBlIHdpbGwgaGF2ZSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgJFJeMiQgaW4gdGhlIHNpbXBsZSBsaW5lYXIgbW9kZWwgY2FzZS4KCioqUGFja2FnZXMvZnVuY3Rpb25zKio6IFNlZSBbYHBlcmZvcm1hbmNlOjpyMigpYF0oaHR0cHM6Ly9lYXN5c3RhdHMuZ2l0aHViLmlvL3BlcmZvcm1hbmNlL3JlZmVyZW5jZS9yMi5odG1sKSwgYE11TUluOjpyLnNxdWFyZWRHTE1NKClgLCB0aGUgW2ByMmdsbW1gIHBhY2thZ2VdKGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9cjJnbG1tKSwgdGhlIHN0YW5kYWxvbmUgW3IyTUxNIGZ1bmN0aW9uXShodHRwczovL215LnZhbmRlcmJpbHQuZWR1L2phc29ucmlnaHRzL3NvZnR3YXJlL3IyTUxNKSwgc3R1ZmYgaW4gdGhlIGBwaWVjZXdpc2VTRU1gIHBhY2thZ2UsIFtgcHN5Y2hvOjpSMl9uYWthZ2F3YWBdKGh0dHA6Ly9maW56aS5wc3ljaC51cGVubi5lZHUvUi9saWJyYXJ5L3BzeWNoby9odG1sL1IyX25ha2FnYXdhLmh0bWwpLCBbcGFydFIyXShodHRwczovL2dpdGh1Yi5jb20vbWFzdG9mZmVsL3BhcnRSMikgcGFja2FnZSAuLi4gKHRyeSBlLmcuIGBzb3M6OmZpbmRGbigiTmFrYWdhd2EgU2NoaWVsemV0aCIpYCBmb3IgYW4gdXAtdG8tZGF0ZSBsaXN0IC4uLikKCiMjIFZhcmlhYmxlIGltcG9ydGFuY2UKCi0gVGhlIHNpbXBsZXN0IHdheSB0byBnZXQgKHdpdGhpbi1zdHVkeSkgbWVhc3VyZXMgb2YgdmFyaWFibGUgaW1wb3J0YW5jZSBpcyB0byBzdGFuZGFyZGl6ZSB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyAoc2NhbGluZyBieSAxIFNEIG9yIDJTRDogQGdlbG1hbl9zY2FsaW5nXzIwMDgsIEBzY2hpZWx6ZXRoX3NpbXBsZV8yMDEwKQotIFRoZSBgcjJnbG1tYCBwYWNrYWdlIGNvbXB1dGVzIHBhcnRpYWwgJFJeMiQgdmFsdWVzIGZvciBmaXhlZCBlZmZlY3RzIChvbmx5IGZvciBgbG1lcmAsIGBsbWVgLCBhbmQgYGdsbW1QUUxgIG1vZGVscykKLSBIZW5yaWsgU2luZ21hbm4gaGFzIGEgZGV0YWlsZWQgYW5zd2VyIFtoZXJlXShodHRwczovL2FmZXguc2luZ21hbm4uc2NpZW5jZS9mb3J1bXMvdG9waWMvY29tcHV0ZS1lZmZlY3Qtc2l6ZXMtZm9yLW1peGVkLW9iamVjdHMpIG9uIHdoeSBzdGFuZGFyZGl6ZWQgbWVhc3VyZXMgc3VjaCBhcyBwYXJ0aWFsIGV0YS1zcXVhcmVkIGFyZSBwcm9ibGVtYXRpYzoKCiAgICA+IFRoZSBmYWN0IHRoYXQgY2FsY3VsYXRpbmcgYSBnbG9iYWwgbWVhc3VyZSBvZiBtb2RlbCBmaXQgKHN1Y2ggYXMgUjIpIGlzIGFscmVhZHkgcmlkZGxlZCB3aXRoIGNvbXBsaWNhdGlvbnMgYW5kIHRoYXQgbm8gc2ltcGxlIHNpbmdsZSBudW1iZXIgY2FuIGJlIGZvdW5kLCBzaG91bGQgYmUgYSBoaW50IHRoYXQgZG9pbmcgc28gZm9yIGEgc3Vic2V0IG9mIHRoZSBtb2RlbCBwYXJhbWV0ZXJzIChpLmUuLCBtYWluLWVmZmVjdHMgb3IgaW50ZXJhY3Rpb25zKSBpcyBldmVuIG1vcmUgZGlmZmljdWx0LiBHaXZlbiB0aGlzLCBJIHdvdWxkIG5vdCByZWNvbW1lbmQgdG8gdHJ5IGZpbmRpbmcgYSBtZWFzdXJlIG9mIHN0YW5kYXJkaXplZCBlZmZlY3Qgc2l6ZXMgZm9yIG1peGVkIG1vZGVscy4KCiAgICBIZSBldmVuIGdpdmVzIHN1Z2dlc3RlZCB3b3JkaW5nIGZvciByZXNwb25kaW5nIHRvIHJldmlld2VycyB3aG8gd2FudCBzdGFuZGFyZGl6ZWQgbWVhc3VyZXMhCgojIyBEbyBJIGhhdmUgdG8gc3BlY2lmeSB0aGUgbGV2ZWxzIG9mIGZpeGVkIGVmZmVjdHMgaW4gbG1lcj8KCk5vLiBTZWUgRG91ZyBCYXRlcyByZXBseSB0byB0aGlzIHF1ZXN0aW9uIFtoZXJlXShodHRwOi8vci43ODk2OTUubjQubmFiYmxlLmNvbS9sbWU0LWFuZC1WYXJpYWJsZS1sZXZlbC1kZXRlY3Rpb24tdGQ4ODE2ODAuaHRtbCkKCiMgTWlzY2VsbGFuZW91cy9wcm9jZWR1cmFsCgojIyBQcm9udW5jaWF0aW9uIG9mIGBsbWVyYC9gZ2xtZXJgL2V0Yy4KCi0gYGxtZXJgOiBJIGhhdmUgaGVhcmQgImVsbCBlbW0gZWUgYXJyIiAoaS5lLiBwcm9ub3VuY2luZyBlYWNoIGxldHRlcik7ICJlbG1lciIgKHByb2JhYmx5IG1vc3QgY29tbW9uKTsgYW5kICJsZW11ciIKLSBgZ2xtZXJgOiAiZ2VlIGVsbCBlbW0gZWUgYXJyIiwgImdlZSBlbG1lciIsICJnbGltbWVyIiwgb3IgImdsZWFtZXIiCi0gZm9yIGBsbWVgIGFuZCBgbmxtZWAgcGVvcGxlIGp1c3Qgc2VlbSB0byBzcGVsbCBvdXQgdGhlIG5hbWVzIChyYXRoZXIgdGhhbiBzYXlpbmcgZS5nLiAibGVtbXkiIGFuZCAibmVsbXkiKQoKIyMgU3RvcmluZyBpbmZvcm1hdGlvbgoKUmVjZW50IHZlcnNpb25zIG9mIGBsbWU0YCBvdXRwdXQgY29udGFpbiBhbiBgQG9wdGluZm9gIHNsb3QgdGhhdCBzdG9yZXMgd2FybmluZ3MuCgpDb3BpZWQgZnJvbSBodHRwczovL3N0YXQuZXRoei5jaC9waXBlcm1haWwvci1oZWxwLzIwMTItRmVicnVhcnkvMzAyNzY3Lmh0bWwgOgoKPiBUaGVyZSdzIGEgc29tZXdoYXQgaGFjay1pc2ggc29sdXRpb24sIHdoaWNoIGlzIHRvIHVzZSBvcHRpb25zKHdhcm49MikgdG8gJ3VwZ3JhZGUnIHdhcm5pbmdzIHRvIGVycm9ycywgYW5kIHRoZW4gdXNlIHRyeSgpIG9yIHRyeUNhdGNoKCkgdG8gY2F0Y2ggdGhlbS4KCj4gTW9yZSBmYW5jaWx5LCBJIHVzZWQgY29kZSB0aGF0IGxvb2tlZCBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHNhdmUgd2FybmluZ3MgYXMgSSB3ZW50IGFsb25nIChzb3JyeSBhYm91dCB0aGUgPDwtICkgaW4gYSByZWNlbnQgc2ltdWxhdGlvbiBzdHVkeS4gIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHckbWVzc2FnZSB0byBkbyBkaWZmZXJlbnQgdGhpbmdzIGluIHRoZSBjYXNlIG9mIGRpZmZlcmVudCB3YXJuaW5ncy4KCmBgYHtyIGNhdGNoX2Vycm9ycyxldmFsPUZBTFNFfQojIyBuLmIuIGhhdmUgdG8gc2V0IHVwIGEgM0Qgd2FybiBhcnJheSBmaXJzdCAuLi4Kd2l0aENhbGxpbmdIYW5kbGVycyh0cnlDYXRjaChmdW4obj1udmVjW2pdLHRhdT10YXV2ZWNbaV0sLi4uKSwKICAgICAgICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICB3YXJuW2ssaSxqXSA8PC0gcGFzdGUoIkVSUk9SOiIsZSRtZXNzYWdlKQogICAgICAgICAgICAgIE5BX2Fuc30pLAogICAgICAgICAgICAgICB3YXJuaW5nID0gZnVuY3Rpb24odykgewogICAgICAgICAgICAgICAgICB3YXJuW2ssaSxqXSA8PC0gdyRtZXNzYWdlCiAgICAgICAgICAgICAgICAgIGludm9rZVJlc3RhcnQoIm11ZmZsZVdhcm5pbmciKQogICAgICAgICAgICAgfSkKYGBgCgojIE1peGVkIG1vZGVsaW5nIHBhY2thZ2VzIAoKLSBhbHNvIHNlZSB0aGUgW3BhY2thZ2UgY29tcGFyaXNvbl0oaHR0cDovL2dsbW0ud2lraWRvdC5jb20vcGtnLWNvbXBhcmlzb24pIG9uIGBnbG1tLndpa2lkb3QuY29tYAoKIyMgV2hpY2ggUiBwYWNrYWdlcyAoZnVuY3Rpb25zKSBmaXQgR0xNTXM/CgotIE1BU1M6OmdsbW1QUUwgKHBlbmFsaXplZCBxdWFzaS1saWtlbGlob29kKQotIGxtZTQ6OmdsbWVyIChMYXBsYWNlIGFwcHJveGltYXRpb24gYW5kIGFkYXB0aXZlIEdhdXNzLUhlcm1pdGUgcXVhZHJhdHVyZSBbQUdIUV0pCi0gTUNNQ2dsbW0gKE1hcmtvdiBjaGFpbiBNb250ZSBDYXJsbykKLSBnbG1tTUwgKEFHSFEpCi0gZ2xtbUFLIChBR0hRPykKLSBnbG1tQURNQiAoTGFwbGFjZSkKLSBnbG1tIChmcm9tIEppbSBMaW5kc2V5J3MgYHJlcGVhdGVkYCBwYWNrYWdlOiBBR0hRKQotIGdhbWxzcy5teAotIEFTUkVNTC1SCi0gc2FicmVSCgojIyBTaG91bGQgSSB1c2UgYGFvdigpYCwgYG5sbWVgLCBvciBgbG1lNGAsIG9yIHNvbWUgb3RoZXIgcGFja2FnZT8KCi0gYGFvdigpYCAoaW4gdGhlIGBzdGF0c2AgcGFja2FnZSBpbiBiYXNlIFI6IGJhbGFuY2VkLCBvcnRob2dvbmFsIGRlc2lnbnMgb25seSAoUiBhbmFsb2d1ZSBvZiBTQVMgUFJPQyBHTE0pCi0gYG5sbWVgIChhbmFsb2d1ZSBvZiBTQVMgYFBST0MgTUlYRURgL2BOTE1JWEVEYCkKICAgIC0gYWxsb3dzIG1vcmUgY29tcGxleCBkZXNpZ25zIHRoYW4gYGFvdmAgKHVuYmFsYW5jZWQsIGhldGVyb3NjZWRhc3RpY2l0eSBhbmQvb3IgY29ycmVsYXRpb24gYW1vbmcgcmVzaWR1YWwgZXJyb3JzKQogICAgLSBtb3JlIG1hdHVyZSB0aGFuIGBsbWU0YAogICAgLSB3ZWxsLWRvY3VtZW50ZWQgW0BwaW5oZWlyb19taXhlZC1lZmZlY3RzXzIwMDBdCiAgICAtIGltcGxlbWVudHMgUi1zaWRlIGVmZmVjdHMgKGhldGVyb3NjZWRhc3RpY2l0eSBhbmQgY29ycmVsYXRpb24pCiAgICAtIGVzdGltYXRlcyAiZGVub21pbmF0b3IgZGVncmVlcyBvZiBmcmVlZG9tIiBmb3IgJEYkIHN0YXRpc3RpY3MsIGFuZCBoZW5jZSAkcCQgdmFsdWVzLCBmb3IgTE1NcyAoYnV0IHNlZSBhYm92ZSkKLSBgbG1lNGAgKGFsc28gU0FTIGBQUk9DIE1JWEVEYC9gTkxNSVhFRGApOiAKICAgIC0gZmFzdGVzdAogICAgLSBiZXN0IGZvciBjcm9zc2VkIGRlc2lnbnMgKGFsdGhvdWdoIHRoZXkgYXJlIHBvc3NpYmxlIGluIGBsbWVgKQogICAgLSBHTE1NcwogICAgLSBjdXR0aW5nLWVkZ2UgKGZvciBiZXR0ZXIgb3Igd29yc2UhKQogICAgLSBsaWtlbGlob29kIHByb2ZpbGVzCiAgICAtIHVzZSBgbG1lNGAgZm9yIEdMTU1zLCBvciBpZiB5b3UgaGF2ZSBiaWcgZGF0YSAodGhvdXNhbmRzIHRvIHRlbnMgb2YgdGhvdXNhbmRzIG9mIHJlY29yZHMpCgpUaGUgZm9sbG93aW5nIGlzIG1vZGlmaWVkIGZyb20gYSBjb250cmlidXRpb24gYnkgS2luZ3Nmb3JkIEpvbmVzLCBmb3VuZCAyMDEwLTAzLTE2CgojIyMgbGluZWFyIGFuZCBub25saW5lYXIgbWl4ZWQgbW9kZWxzCgotIFtsbWVdKGh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2xtZTQvaW5kZXguaHRtbCkgLS0gTGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWxzIHVzaW5nIFM0IGNsYXNzZXMKLSBgbG1tYCAtLSBMaW5lYXIgbWl4ZWQgbW9kZWxzCi0gYG5sbWVgIC0tIExpbmVhciBhbmQgTm9ubGluZWFyIE1peGVkIEVmZmVjdHMgTW9kZWxzCi0gYHNhYnJlUmAKLSBbcmVncmVzc10oaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcmVncmVzcy9pbmRleC5odG1sKSBMaW5lYXIgbWl4ZWQgbW9kZWxzCgojIyMgR0xNTXMKLSBnbG1tQUsgLS0gR2VuZXJhbGl6ZWQgTGluZWFyIE1peGVkIE1vZGVscwotIE1BU1MgLS0gTWFpbiBQYWNrYWdlIG9mIFZlbmFibGVzIGFuZCBSaXBsZXkncyBNQVNTIChzZWUgZnVuY3Rpb24gZ2xtbVBRTCkKLSBNQ01DZ2xtbSAtLSBNQ01DIEdlbmVyYWxpc2VkIExpbmVhciBNaXhlZCBNb2RlbHMKLSBsbWU0IChnbG1lcikKLSBnbG1tTUwKLSBnYW1sc3MubXgKLSBzYWJyZVIKIAojIyMgQWRkaXRpdmUgYW5kIGdlbmVyYWxpemVkLWFkZGl0aXZlIG1peGVkIG1vZGVscwotIGFtZXIgLS0gQWRkaXRpdmUgbWl4ZWQgbW9kZWxzIHdpdGggbG1lNAotIGdhbW00IC0tIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyB1c2luZyBtZ2N2IGFuZCBsbWU0Ci0gbWdjdiAoZ2FtbSBmdW5jdGlvbiwgdmlhIGdsbW1QUUwgaW4gTUFTUyBwYWNrYWdlKQotIGdhbWxzcy5teAoKIyMjIEhpZXJhcmNoaWNhbCBHTE1zCi0gaGdsbSAtLSBoZ2xtIGlzIHVzZWQgdG8gZml0IGhpZXJhcmNoaWNhbCBnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWxzCi0gSEdMTU1NIC0tIEhpZXJhcmNoaWNhbCBHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzCgojIyMgZGlhZ25vc3RpYyBhbmQgbW9kZWxpbmcgZnJhbWV3b3JrcwotIGluZmx1ZW5jZS5NRSAtLSBUb29scyBmb3IgZGV0ZWN0aW5nIGluZmx1ZW50aWFsIGRhdGEgaW4gbWl4ZWQgZWZmZWN0cyBtb2RlbHMKLSBhcm0gLS0gRGF0YSBBbmFseXNpcyBVc2luZyBSZWdyZXNzaW9uIGFuZCBNdWx0aWxldmVsL0hpZXJhcmNoaWNhbCBNb2RlbHMKLSBwYW1tIC0tIFBvd2VyIGFuYWx5c2lzIGZvciByYW5kb20gZWZmZWN0cyBpbiBtaXhlZCBtb2RlbHMKLSBSTFJzaW0gLS0gRXhhY3QgKFJlc3RyaWN0ZWQpIExpa2VsaWhvb2QgUmF0aW8gdGVzdHMgZm9yIG1peGVkIGFuZCBhZGRpdGl2ZSBtb2RlbHMKLSBucGRlIC0tIE5vcm1hbGlzZWQgcHJlZGljdGlvbiBkaXN0cmlidXRpb24gZXJyb3JzIGZvciBub25saW5lYXIgbWl4ZWQtZWZmZWN0IG1vZGVscwotIG11bHRpbGV2ZWwgLS0gTXVsdGlsZXZlbCBGdW5jdGlvbnMgKHBzeWNob2xvZ3ktb3JpZW50ZWQ7IHdpdGhpbi1ncm91cCBhZ3JlZW1lbnQsIHJhbmRvbSBncm91cCByZXNhbXBsaW5nLCBldGMuKQotIGxhbmd1YWdlUgotIHBia3J0ZXN0IC0tIHBhcmFtZXRyaWMgYm9vdHN0cmFwIGFuZCBLZW53YXJkLVJvZ2VyIHRlc3RzCgojIyMgZGF0YSBhbmQgZXhhbXBsZXMKLSBNRU1TUyAtLSBEYXRhIHNldHMgZnJvbSBNaXhlZC1lZmZlY3RzIE1vZGVscyBpbiBTCi0gbWxtUmV2IC0tIEV4YW1wbGVzIGZyb20gTXVsdGlsZXZlbCBNb2RlbGxpbmcgU29mdHdhcmUgUmV2aWV3Ci0gU0FTbWl4ZWQgLS0gRGF0YSBzZXRzIGZyb20gIlNBUyBTeXN0ZW0gZm9yIE1peGVkIE1vZGVscyIKCiMjIyBleHRlbnNpb25zCi0gbG1lU3BsaW5lcyAtLSBsbWVTcGxpbmVzCi0gbG1lYyAtLSBMaW5lYXIgTWl4ZWQtRWZmZWN0cyBNb2RlbHMgd2l0aCBDZW5zb3JlZCBSZXNwb25zZXMKLSBraW5zaGlwIC0tIG1peGVkLWVmZmVjdHMgQ294IG1vZGVscywgc3BhcnNlIG1hdHJpY2VzLCBhbmQgbW9kZWxpbmcgZGF0YSBmcm9tIGxhcmdlIHBlZGlncmVlcwotIGNveG1lIC0tIE1peGVkIEVmZmVjdHMgQ294IE1vZGVscwotIG9yZGluYWwgLS0gUmVncmVzc2lvbiBNb2RlbHMgZm9yIE9yZGluYWwgRGF0YQotIHBobW0gLS0gUHJvcG9ydGlvbmFsIEhhemFyZHMgTWl4ZWQtZWZmZWN0cyBNb2RlbCAoUEhNTSkKLSBwZWRpZ3JlZW1tIC0tIFBlZGlncmVlLWJhc2VkIG1peGVkLWVmZmVjdHMgbW9kZWxzCi0gKHNlZSBhbHNvIE1DTUNnbG1tIGZvciBwZWRpZ3JlZS1iYXNlZCBhcHByb2FjaGVzKQotIGhlYXZ5IC0tIEVzdGltYXRpb24gaW4gdGhlIGxpbmVhciBtaXhlZCBtb2RlbCB1c2luZyBoZWF2eS10YWlsZWQgZGlzdHJpYnV0aW9ucwotIEdMTU1hcnAgLS0gR2VuZXJhbGl6ZWQgTGluZWFyIE11bHRpbGV2ZWwgTW9kZWwgd2l0aCBBUihwKSBFcnJvcnMgUGFja2FnZQotIGdsbW1sYXNzbyAtLSBwZW5hbGl6ZWQgR0xNTSBmaXR0aW5nCi0gc3BhdGlhbENvdmFyaWFuY2UgLS0gc3BhdGlhbCBjb3ZhcmlhbmNlIG1hdHJpeCBjYWxjdWxhdGlvbnMKCiMjIyBJbnRlcmZhY2VzIHRvIG90aGVyIHN5c3RlbXMKLSBnbG1tQlVHUyAtLSBHZW5lcmFsaXNlZCBMaW5lYXIgTWl4ZWQgTW9kZWxzIGFuZCBTcGF0aWFsIE1vZGVscyB3aXRoIEJVR1MKLSBJbnRlcmZhY2VzIHRvIFdpbkJVR1MvT3BlbkJVR1MvSkFHUyAocm9sbCB5b3VyIG93biBtb2RlbCBmaWxlKToKICogUjJXaW5CVUdTCiAqIHIyamFncwogKiByamFncwogKiBSQnVncwoKIyMjIG1vZGVsaW5nIGJhc2VkIG9uIExNTXMKCi0gYG5sbWVPREVgIC0tIE5vbi1saW5lYXIgbWl4ZWQtZWZmZWN0cyBtb2RlbGxpbmcgaW4gbmxtZSB1c2luZyBkaWZmZXJlbnRpYWwgZXF1YXRpb25zCi0gYGxvbmdSUGFydGAgLS0gUmVjdXJzaXZlIHBhcnRpdGlvbmluZyBvZiBsb25naXR1ZGluYWwgZGF0YSB1c2luZyBtaXhlZC1lZmZlY3RzIG1vZGVscwotIGBQU01gIC0tIE5vbi1MaW5lYXIgTWl4ZWQtRWZmZWN0cyBtb2RlbGxpbmcgdXNpbmcgU3RvY2hhc3RpYyBEaWZmZXJlbnRpYWwgRXF1YXRpb25zCgojIyBPZmYtQ1JBTiBtaXhlZCBtb2RlbGluZyBwYWNrYWdlczoKCiMjIyBSLWZvcmdlIGFuZCBHaXRodWI6CgotIGBnbG1tQURNQmAgKFItZm9yZ2UsIGludGVyZmFjZSB0byBBRCBNb2RlbCBCdWlsZGVyKQotIGBzcGlkYWAsIGBwM2RgIChHZW9yZ2VzIE1vbmV0dGUpCgojIyMgT3RoZXIgb3BlbiBzb3VyY2U6Ci0gW2Jlcm5vcl0oaHR0cDovL3d3dy5zdGF0LnVtbi5lZHUvZ2V5ZXIvYmVybm9yLyBiZXJub3IpIHBhY2thZ2UgKGxvZ2l0LW5vcm1hbCBmaXR0aW5nKSwgYnkgWXVuIEp1IFN1bmcgYW5kIENoYXJsZXMgSi4gR2V5ZXIKLSBgZ2xtbWAgKGluIEppbSBMaW5kc2V5J3MgYHJlcGVhdGVkYCBwYWNrYWdlOiBhdCBbTGluZHNleSdzIHdlYiBzaXRlXShodHRwOi8vd3d3LmNvbW1hbnN0ZXIuZXUvcmNvZGUuaHRtbCkKCgojIyMgQ29tbWVyY2lhbDoKLSBgT3Blbk14YCAtLSBBZHZhbmNlZCBTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVsaW5nCi0gYEFTUmVtbC1SYCAoY29tbWVyY2lhbCwgYnV0IDMwIGRheXMnIGZyZWUgdXNlL2ZyZWUgbGljZW5zZSBmb3IgYWNhZGVtaWMgb3IgZGV2ZWxvcGluZy1jb3VudHJ5IHVzZSBhdmFpbGFibGUpLiAgVmVyeSBnb29kIGF0IGNvbXBsZXggTE1NcyAoZmFzdCwgZmxleGlibGUgY292YXJpYW5jZSBzdHJ1Y3R1cmVzLCBldGMuKSwgYnV0IG9ubHkgb2ZmZXJzIFBRTCBmb3IgR0xNTXMsIGFuZCB0aGUgbWFudWFsIHNheXM6IAo+IHdlIGNhbm5vdCByZWNvbW1lbmQgdGhlIHVzZSBvZiB0aGlzIHRlY2huaXF1ZSBmb3IgZ2VuZXJhbCB1c2UuIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYXNyZW1sKCkgZm9yIGFkdmFuY2VkIHVzZXJzLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBpdHMgdXNlIGJlIGFjY29tcGFuaWVkIGJ5IHNvbWUgZm9ybSBvZiBjcm9zcy12YWxpZGF0b3J5IGFzc2Vzc21lbnQgZm9yIHRoZSBzcGVjaWZpYyBkYXRhc2V0IGNvbmNlcm5lZC4iClJlc291cmNlczoKLSBbc2hvcnQgUiB3aWtpIHR1dG9yaWFsXShodHRwOi8vcndpa2kuc2Npdmlld3Mub3JnL2Rva3UucGhwP2lkPWd1aWRlczp0dXRvcmlhbHM6YXNyZW1sKQotIFtyZWZlcmVuY2UgbWFudWFsXShodHRwOi8vd3d3LnZzbmkuY28udWsvZG93bmxvYWRzL2FzcmVtbC9yZWxlYXNlMy9hc3JlbWwtUi5wZGYgcmVmZXJlbmNlIG1hbnVhbCkgKFBERikKLSBMdWlzIEFwaW9sYXphJ3MgW2FzcmVtbC1yIGNvb2tib29rXShodHRwOi8vYXBpb2xhemEubmV0L2FzcmVtbC1yLykKCgojIyBQYWNrYWdlIHZlcnNpb25zIHVzZWQKCmBgYHtyIHNlc3Npb25pbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoKIyMgVG8gZG8KCi0gYWRkIGxpbmtzIHRvIGBtZXJEZXJpdmAgZm9yIHN0YW5kYXJkIGRldnMgb2YgdmFyaWFuY2VzLCByb2J1c3QgZXN0aW1hdGVzLiBNb3JlIG9uIFJpem9wb3Vsb3MgcGFja2FnZQotIHVwZGF0ZSBwYWNrYWdlIGRlc2NyaXB0aW9uczsgY3Jvc3MtbGluayB3aXRoIFtUYXNrIFZpZXddKGh0dHA6Ly9iYm9sa2VyLmdpdGh1Yi5pby9taXhlZG1vZGVscy1taXNjL01peGVkTW9kZWxzLmh0bWwpID8gYHJldGhpbmtpbmdgLCBgYnJtc2AsIC4uLgotIG1vcmUgb24gcG9zdC1hbmFseXNpcyAoYGJyb29tKC5taXhlZClgLCBgZW1tZWFuc2AsIGBtdWx0Y29tcGAsIC4uLikKLSBtb3JlIG9uIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBzaW11bGF0aW5nIGZyb20gY29uZGl0aW9uYWwgZGlzdHJpYnV0aW9ucywgZXRjLikKCiMgQmlibGlvZ3JhcGh5Cgo=