Preprocessing
Read ../rawdata_huprot/Control_1256587_2000143978.gpr
Read ../rawdata_huprot/Control_1311449_2000143966.gpr
Read ../rawdata_huprot/Control_1312497_2000143964.gpr
Read ../rawdata_huprot/Control_1313058_2000143976.gpr
Read ../rawdata_huprot/Grade_L_CJ_14434_2000143958.gpr
Read ../rawdata_huprot/Grade_L_CH_27096_2000155729.gpr
Read ../rawdata_huprot/Grade_L_CJ_3659_2000143955.gpr
Read ../rawdata_huprot/Grade_III_CH_15796_2000143692.gpr
Read ../rawdata_huprot/Grade_III_CJ_11032_2000143957.gpr
Read ../rawdata_huprot/Grade_III_CJ_27572_2000144442.gpr
Read ../rawdata_huprot/Grade_III_CJ_9761_2000144443.gpr
Read ../rawdata_huprot/Grade_III_CK_5121_2000144441.gpr
Read ../rawdata_huprot/Grade_III_CK_6451_2000144440.gpr
Read ../rawdata_huprot/Grade_IV_CH_12724_2000143977.gpr
Read ../rawdata_huprot/Grade_IV_CH_29738_2000143975.gpr
Read ../rawdata_huprot/Grade_IV_CH_31148_2000143961.gpr
Read ../rawdata_huprot/Grade_IV_CH_32705_2000155727.gpr
Read ../rawdata_huprot/Grade_IV_CJ_11291_2000143969.gpr
Read ../rawdata_huprot/Grade_IV_CJ_12441_2000143979.gpr
Read ../rawdata_huprot/Grade_IV_CK_6570_2000143967.gpr


Intensity distribution pre normalization

Intensity distribution post normalization

PCA pre normalization
Performing principle component analysis on raw intensities, which have not been background corrected yields no separation for Low or high grade samples from the controls.

PCA post normalization

MDS post normalization

Heatmap post normalization


Differential Expression
Since the sample size is too less, we do not remove any samples even though they look like outliers on the MDS plot.
Similarity with Protoarray results
In terms of total common genes between the two assays, we obtain the following table. It is meant to be presented as a sanity check.
targets.protoarray <- readTargets('../rawdata/Protoarray_annotation.csv', sep=',')
targets.protoarray
targets
Conclusion
The table above represents the number of DE genes (adjusted p-value < 0.01) for protoarray and huprot assays. The ‘common’ column represents the number of common genes. ‘jaccard’ is a similarity metric.
We do not see ANY overlap between the two assays. There are two chief reasons:
The experiment is not balanaced: there are different number of samples involved at each level: control, grade2, grade3, grade4.
Sample size is too small: As evident from the PCA and MDS plots, there is too much heterogenity intra-grade and among controls.
Ideally point #2 should not affect the similarity we expect between huprot and protoarray results, but probably problems arising from #1 overshadow it.
At present, the results make little sense since there is no overlap at all.
LS0tCnRpdGxlOiAiSHVQcm90IENTRiBBbmFseXNpcyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfaGVpZ2h0OiAzMAogICAgZmlnX3dpZHRoOiAzMAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKZGF0ZTogIjAzLzE1LzIwMTciCi0tLQoKIyMgUHJlcHJvY2Vzc2luZwpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkobGltbWEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShwaGVhdG1hcCkKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwbG90SGVhdE1hcCA8LSBmdW5jdGlvbih5LCBjb25kaXRpb24pewogIHNhbXBsZURpc3RzIDwtIGRpc3QodChsb2cyKHkkRSkpKQogIHNhbXBsZURpc3RNYXRyaXggPC0gYXMubWF0cml4KHNhbXBsZURpc3RzKQogIHJvd25hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIHBhc3RlKGNvbmRpdGlvbiwgY29sbmFtZXMoeSRFKSwgc2VwPSItIikKICBjb2xuYW1lcyhzYW1wbGVEaXN0TWF0cml4KSA8LSBOVUxMCiAgY29sb3JzIDwtIGNvbG9yUmFtcFBhbGV0dGUoIHJldihicmV3ZXIucGFsKDksICJCbHVlcyIpKSApKDI1NSkKICBwaGVhdG1hcChzYW1wbGVEaXN0TWF0cml4LAogICAgICAgICAgIGNsdXN0ZXJpbmdfZGlzdGFuY2Vfcm93cz1zYW1wbGVEaXN0cywKICAgICAgICAgIGNsdXN0ZXJpbmdfZGlzdGFuY2VfY29scz1zYW1wbGVEaXN0cywKICAgICAgICAgICBjb2w9Y29sb3JzKQp9CmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQp0YXJnZXRzIDwtIHJlYWRUYXJnZXRzKCcuLi9yYXdkYXRhX2h1cHJvdC9odXByb3RfY29tbW9uLmNzdicsIHNlcD0nLCcpCnRhcmdldHMkQ29uZGl0aW9uIDwtIGFzLmZhY3Rvcih0YXJnZXRzJENvbmRpdGlvbikKdGFyZ2V0Q29sb3JzIDwtCiAgICB3aXRoKHRhcmdldHMsCiAgICAgICAgIGRhdGEuZnJhbWUoQ29uZGl0aW9uID0gbGV2ZWxzKENvbmRpdGlvbiksCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBJKGJyZXdlci5wYWwobmxldmVscyhDb25kaXRpb24pLCBuYW1lID0gJ0RhcmsyJykpKSkKeCA8LSByZWFkLm1haW1hZ2VzKHRhcmdldHMkRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICBwYXRoPWZpbGUucGF0aCgnLi4nLCAncmF3ZGF0YV9odXByb3QnKSwKICAgICAgICAgICAgICAgICAgIHNvdXJjZT0nZ2VuZXBpeCcsCiAgICAgICAgICAgICAgICAgICBjb2x1bW5zPWxpc3QoRz0nRjYzNSBNZWFuJywgR2I9J0I2MzUgTWVkaWFuJyksCiAgICAgICAgICAgICAgICAgICBncmVlbi5vbmx5PVRSVUUpCgp4JGdlbmVzJE5hbWUgPC0gZ3N1YignXFxuJywgJycsIHgkZ2VuZXMkTmFtZSkKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpuZWdhdGl2ZS5jb250cm9scyA8LSB4JGdlbmVzJE5hbWUgJWluJSBjKCdCU0EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGVMYSBjZWxsIGx5c2F0ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwMzAwLUJIQycpCgpwb3NpdGl2ZS5jb250cm9scyA8LSB4JGdlbmVzJE5hbWUgJWluJSBjKCdIMkEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSDJCJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSDQnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dTVDEwbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHU1Q1MG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUMTAwbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1NUNTAwbicpCiNwYXIobWZyb3c9YygxLDIpKQpwYXIobWFyPWMoOCw0LDQsNCkrLjEpCgpib3hwbG90KGxvZzIoeCRFW25lZ2F0aXZlLmNvbnRyb2xzLF0pLGxhcz0yLCBtYWluPSJOZWdhdGl2ZSBDb250cm9scyByYXcgaW50ZW5zaXRpZXMiLHlsYWI9ImxvZzItaW50ZW5zaXR5IiwgY2V4LmF4aXM9MC43KQpwYXIobWFyPWMoOCw0LDQsNCkrLjEpCgpib3hwbG90KGxvZzIoeCRFW3Bvc2l0aXZlLmNvbnRyb2xzLF0pLGxhcz0yLCBtYWluPSJQb3NpdGl2ZSBDb250cm9scyByYXcgaW50ZW5zaXRpZXMiLHlsYWI9ImxvZzItaW50ZW5zaXR5IiwgY2V4LmF4aXM9MC43KQpgYGAKCiMjIEludGVuc2l0eSBkaXN0cmlidXRpb24gcHJlIG5vcm1hbGl6YXRpb24KCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CngkZ2VuZXMkU3RhdHVzICA8LSByZXAoJ3JlZ3VsYXInLCBucm93KHgpKQp4JGdlbmVzJFN0YXR1c1twb3NpdGl2ZS5jb250cm9sc10gPC0gJ1BPU0lUSVZFJwp4JGdlbmVzJFN0YXR1c1tuZWdhdGl2ZS5jb250cm9sc10gPC0gJ05FR0FUSVZFJwp5IDwtIG5lcWMoeCkKCnBhcihtYXI9Yyg4LDQsNCw0KSsuMSkKCmJveHBsb3QobG9nMih4JEUpLGxhcz0yLCBtYWluPSJQcmUtbm9ybWFsaXphdGlvbiBpbnRlbnNpdGllcyIseWxhYj0ibG9nMi1pbnRlbnNpdHkiLCBjb2w9dGFyZ2V0Q29sb3JzJGNvbG9yW21hdGNoKHRhcmdldHNbY29sbmFtZXMoeCRFKSxdJENvbmRpdGlvbiwgdGFyZ2V0Q29sb3JzJENvbmRpdGlvbildLCBwY2g9MTksIGNleC5heGlzPTAuNywgY2V4PTAuNykKYGBgCgojIyBJbnRlbnNpdHkgZGlzdHJpYnV0aW9uIHBvc3Qgbm9ybWFsaXphdGlvbgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwYXIobWFyPWMoOCw0LDQsNCkrLjEpCmJveHBsb3QobG9nMih5JEUpLGxhcz0yLCBtYWluPSJQb3N0LW5vcm1hbGl6YXRpb24gaW50ZW5zaXRpZXMiLHlsYWI9ImxvZzItaW50ZW5zaXR5IiwgY29sPXRhcmdldENvbG9ycyRjb2xvclttYXRjaCh0YXJnZXRzW2NvbG5hbWVzKHgkRSksXSRDb25kaXRpb24sIHRhcmdldENvbG9ycyRDb25kaXRpb24pXSwgcGNoPTE5LCBjZXguYXhpcz0wLjcsIGNleD0wLjcpCmBgYAoKIyMgUENBIHByZSBub3JtYWxpemF0aW9uCgpQZXJmb3JtaW5nIHByaW5jaXBsZSBjb21wb25lbnQgYW5hbHlzaXMgb24gcmF3IGludGVuc2l0aWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGJhY2tncm91bmQgY29ycmVjdGVkIHlpZWxkcyBubyBzZXBhcmF0aW9uIGZvciBMb3cgb3IgaGlnaCBncmFkZSBzYW1wbGVzIGZyb20gdGhlIGNvbnRyb2xzLgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kb3BhciA8LSBwYXIocGNoID0gMTkpCgpwYyA9IHByY29tcCggdCggeCRFICApLCBzY2FsZT1UUlVFICkKcGMuc3VtbWFyeSA8LSBzdW1tYXJ5KHBjKQpwYzEudmFyIDwtIHBjLnN1bW1hcnkkaW1wb3J0YW5jZVsyLDFdCnBjMi52YXIgPC0gcGMuc3VtbWFyeSRpbXBvcnRhbmNlWzIsMl0KCnBsb3QocGMkeFssIDE6Ml0sIAogICAgIGNvbD10YXJnZXRDb2xvcnMkY29sb3JbbWF0Y2godGFyZ2V0cyRDb25kaXRpb24sIHRhcmdldENvbG9ycyRDb25kaXRpb24pXSwgCiAgICAgY2V4PTEuNSwgCiAgICAgeGxhYiA9IHBhc3RlKCdQQzE6ICcsIDEwMCpwYzEudmFyLCAnJScsIHNlcD0nJyksIAogICAgIHlsYWIgPSAgcGFzdGUoJ1BDMjogJywgMTAwKnBjMi52YXIsICclJywgc2VwPScnKSwKICAgICBtYWluPSAiUENBIG9uIHJhdyBpbnRlbnNpdGllcyIpCgpsZWdlbmQoeCA9ICdib3R0b21yaWdodCcsIAogICAgICAgbGVnZW5kID0gYXMuY2hhcmFjdGVyKHRhcmdldENvbG9ycyRDb25kaXRpb24pLAogICAgICAgY29sID0gdGFyZ2V0Q29sb3JzJGNvbG9yLCBwY2ggPSBwYXIoInBjaCIpLCBidHkgPSAnbicsIHhqdXN0ID0gMSkKCmBgYAoKCiMjIFBDQSBwb3N0IG5vcm1hbGl6YXRpb24KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kb3BhciA8LSBwYXIocGNoID0gMTkpCgpwYyA9IHByY29tcCggdCggeSRFICApLCBzY2FsZT1UUlVFICkKcGMuc3VtbWFyeSA8LSBzdW1tYXJ5KHBjKQpwYzEudmFyIDwtIHBjLnN1bW1hcnkkaW1wb3J0YW5jZVsyLDFdCnBjMi52YXIgPC0gcGMuc3VtbWFyeSRpbXBvcnRhbmNlWzIsMl0KCnBsb3QocGMkeFssIDE6Ml0sIGNvbD10YXJnZXRDb2xvcnMkY29sb3JbbWF0Y2godGFyZ2V0cyRDb25kaXRpb24sIHRhcmdldENvbG9ycyRDb25kaXRpb24pXSwgY2V4PTEuNSwgeGxhYiA9IHBhc3RlKCdQQzE6ICcsIDEwMCpwYzEudmFyLCAnJScsIHNlcD0nJyksIHlsYWIgPSAgcGFzdGUoJ1BDMjogJywgMTAwKnBjMi52YXIsICclJywgc2VwPScnKSwgICAgIG1haW49ICJQQ0Egb24gYmFja2dyb3VuZCBjb3JyZWN0ZWQgYW5kIG5vcm1hbGl6ZWQgaW50ZW5zaXRpZXMiKQpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIAogICAgICAgbGVnZW5kID0gYXMuY2hhcmFjdGVyKHRhcmdldENvbG9ycyRDb25kaXRpb24pLAogICAgICAgY29sID0gdGFyZ2V0Q29sb3JzJGNvbG9yLCBwY2ggPSBwYXIoInBjaCIpLCBidHkgPSAnbicsIHhqdXN0ID0gMSkKYGBgCgoKIyMgTURTIHBvc3Qgbm9ybWFsaXphdGlvbgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kb3BhciA8LSBwYXIocGNoID0gMTkpCnBsb3RNRFMoeSwgIGNvbD10YXJnZXRDb2xvcnMkY29sb3JbbWF0Y2godGFyZ2V0cyRDb25kaXRpb24sIHRhcmdldENvbG9ycyRDb25kaXRpb24pXSwgY2V4PTEuMiwgcGNoPTE5KQpsZWdlbmQoeCA9ICdib3R0b21sZWZ0JywgCiAgICAgICBsZWdlbmQgPSBhcy5jaGFyYWN0ZXIodGFyZ2V0Q29sb3JzJENvbmRpdGlvbiksCiAgICAgICBjb2wgPSB0YXJnZXRDb2xvcnMkY29sb3IsIHBjaCA9IHBhcigicGNoIiksIGJ0eSA9ICduJywgeGp1c3QgPSAxKQoKYGBgCgojIyBIZWF0bWFwIHBvc3Qgbm9ybWFsaXphdGlvbgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBsb3RIZWF0TWFwKHksIHRhcmdldHMkQ29uZGl0aW9uKQpgYGAKCgojIyBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbgoKU2luY2UgdGhlIHNhbXBsZSBzaXplIGlzIHRvbyBsZXNzLCB3ZSBkbyBub3QgcmVtb3ZlIGFueSBzYW1wbGVzIGV2ZW4gdGhvdWdoIHRoZXkgbG9vayBsaWtlIG91dGxpZXJzIG9uIHRoZSBNRFMgcGxvdC4KCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiBmIDwtIGZhY3Rvcih0YXJnZXRzJENvbmRpdGlvbiwgbGV2ZWxzID0gdW5pcXVlKHRhcmdldHMkQ29uZGl0aW9uKSkKIGRlc2lnbiA8LSBtb2RlbC5tYXRyaXgofjAgKyBmKQogY29sbmFtZXMoZGVzaWduKSA8LSBsZXZlbHMoZikKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpjb3JmaXQgPC0gZHVwbGljYXRlQ29ycmVsYXRpb24oeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kdXBzPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nPTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKZml0IDwtIGxtRml0KHksCiAgICAgICAgICAgICBkZXNpZ24sCiAgICAgICAgICAgICBuZHVwcz0yLAogICAgICAgICAgICAgY29ycmVsYXRpb249Y29yZml0JGNvbnNlbnN1cy5jb3JyZWxhdGlvbikKCmNvbnRyYXN0Lm1hdHJpeCA8LSBtYWtlQ29udHJhc3RzKEdyYWRlMnZzR3JhZGUxPUdyYWRlMi1HcmFkZTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTN2c0dyYWRlMj1HcmFkZTMtR3JhZGUyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGU0dnNHcmFkZTM9R3JhZGU0LUdyYWRlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGUxdnNDb250cm9sPUdyYWRlMS1Db250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTJ2c0NvbnRyb2w9R3JhZGUyLUNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRlM3ZzQ29udHJvbD1HcmFkZTMtQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZGU0dnNDb250cm9sPUdyYWRlNC1Db250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRldnNDb250cm9sPShHcmFkZTErR3JhZGUyK0dyYWRlMytHcmFkZTQpLzQtQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlnaEdyYWRldnNDb250cm9sPShHcmFkZTMrR3JhZGU0KS8yLUNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvd0dyYWRldnNDb250cm9sPShHcmFkZTErR3JhZGUyKS8yLUNvbnRyb2wsCiAgICAgICAgICAgICAgICAgIEhpZ2hHcmFkZXZzTG93R3JhZGU9KEdyYWRlMytHcmFkZTQpLzItKEdyYWRlMStHcmFkZTIpLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRlM3ZzTG93R3JhZGU9R3JhZGUzLShHcmFkZTErR3JhZGUyKS8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkZTR2c0xvd0dyYWRlPUdyYWRlNC0oR3JhZGUxK0dyYWRlMikvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWRlc2lnbikKZml0MiA8LSBjb250cmFzdHMuZml0KGZpdCwgY29udHJhc3QubWF0cml4KQpmaXQyIDwtIGVCYXllcyhmaXQyKQpjb2VmcyA8LSBjKCdHcmFkZTJ2c0dyYWRlMScsCiAgICAgICAgICAgJ0dyYWRlM3ZzR3JhZGUyJywKICAgICAgICAgICAnR3JhZGU0dnNHcmFkZTMnLAogICAgICAgICAgICdHcmFkZTF2c0NvbnRyb2wnLAogICAgICAgICAgICdHcmFkZTJ2c0NvbnRyb2wnLAogICAgICAgICAgICdHcmFkZTN2c0NvbnRyb2wnLAogICAgICAgICAgICdHcmFkZTR2c0NvbnRyb2wnLAogICAgICAgICAgICdHcmFkZXZzQ29udHJvbCcsCiAgICAgICAgICAgJ0hpZ2hHcmFkZXZzQ29udHJvbCcsCiAgICAgICAgICAgJ0xvd0dyYWRldnNDb250cm9sJywKICAgICAgICAgICAnSGlnaEdyYWRldnNMb3dHcmFkZScsCiAgICAgICAgICAgJ0dyYWRlM3ZzTG93R3JhZGUnLAogICAgICAgICAgICdHcmFkZTR2c0xvd0dyYWRlJykKZXhwcmVzc2lvblZhbHVlcyA8LSBhcy5kYXRhLmZyYW1lKHkkRSkKd3JpdGUudGFibGUoZXhwcmVzc2lvblZhbHVlcywgCiAgICAgICAgICAgIGZpbGUucGF0aCgnLi4nLCAgJ3Jlc3VsdHNfaHVwcm90YXJyYXknLHBhc3RlKCdodXByb3Rfbm9ybWFsaXplZF92YWx1ZXMnLCdjc3YnLCBzZXA9Jy4nKSApKQpmb3IgKGNvZWYgaW4gY29lZnMpewogIHR0IDwtIHRvcFRhYmxlKGZpdDIsIGNvZWY9Y29lZiwgbnVtYmVyID0gSW5mKQogIHR0LnNpZyA8LSBzdWJzZXQodHQsIHR0JGFkai5QLlZhbDwwLjAxKQogIHdyaXRlLnRhYmxlKHR0LCBmaWxlLnBhdGgoJy4uJywgJ3Jlc3VsdHNfaHVwcm90YXJyYXknLCBwYXN0ZShjb2VmLCdjc3YnLCBzZXA9Jy4nKSApLCByb3cubmFtZXMgPSBGQUxTRSkKICB3cml0ZS50YWJsZSh0dC5zaWcsIGZpbGUucGF0aCgnLi4nLCAncmVzdWx0c19odXByb3RhcnJheScsICdzaWduaWZpY2FudF9maWx0ZXJlZCcsIHBhc3RlKGNvZWYsJ2NzdicsIHNlcD0nLicpICksIHJvdy5uYW1lcyA9IEZBTFNFKQp9CgpgYGAKCiMjIFNpbWlsYXJpdHkgd2l0aCBQcm90b2FycmF5IHJlc3VsdHMKCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmNsZWFuX25hbWUgPC0gZnVuY3Rpb24obmFtZSl7CiAgbmFtZSA8LSBzdHJzcGxpdChuYW1lLCAiOiIpW1sxXV1bMl0KICBuYW1lIDwtIHN0cnNwbGl0KG5hbWUsICJ+IilbWzFdXVsxXQogIHJldHVybihuYW1lKQp9CnN1bW1hcnkuZGYgPC0gZGF0YS5mcmFtZShjb2VmZmljaWVudD1jb2VmcywgaHVwcm90PTAsIHByb3RvYXJyYXk9MCwgY29tbW9uPTAsIGphY2NhcmQ9MCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpyb3cubmFtZXMoc3VtbWFyeS5kZikgPC0gY29lZnMKZm9yIChjb2VmIGluIGNvZWZzKXsKICBodXByb3QucmVzdWx0cyA8LSByZWFkLnRhYmxlKGZpbGUucGF0aCgnLi4nLCAncmVzdWx0c19odXByb3RhcnJheScsICdzaWduaWZpY2FudF9maWx0ZXJlZCcsIHBhc3RlKGNvZWYsJ2NzdicsIHNlcD0nLicpICksIGhlYWRlciA9IFQpCiAgcHJvdG9hcnJheS5yZXN1bHRzIDwtIHJlYWQudGFibGUoZmlsZS5wYXRoKCcuLicsICdyZXN1bHRzJywgJ3NpZ25pZmljYW50X2ZpbHRlcmVkJywgcGFzdGUoY29lZiwnY3N2Jywgc2VwPScuJykgKSwgaGVhZGVyID0gVCkKICBuZXdfbmFtZSA8LSBzYXBwbHkoYXMudmVjdG9yKHByb3RvYXJyYXkucmVzdWx0cyROYW1lKSwgY2xlYW5fbmFtZSkKICBwcm90b2FycmF5LnJlc3VsdHMkTmFtZSA8LSBuZXdfbmFtZQogIHRvdGFsIDwtIGxlbmd0aChodXByb3QucmVzdWx0cyRJRCkrIGxlbmd0aChwcm90b2FycmF5LnJlc3VsdHMkTmFtZSkKICBjb21tb24gPC0gbGVuZ3RoKGludGVyc2VjdChodXByb3QucmVzdWx0cyRJRCwgcHJvdG9hcnJheS5yZXN1bHRzJE5hbWUpKQogIHN1bW1hcnkuZGZbY29lZixdJGh1cHJvdCA8LSAgIGxlbmd0aChodXByb3QucmVzdWx0cyRJRCkKICBzdW1tYXJ5LmRmW2NvZWYsXSRwcm90b2FycmF5IDwtICAgbGVuZ3RoKHByb3RvYXJyYXkucmVzdWx0cyROYW1lKQogIHN1bW1hcnkuZGZbY29lZixdJGNvbW1vbiA8LSBjb21tb24gIAogIHN1bW1hcnkuZGZbY29lZixdJGphY2NhcmQgPC0gY29tbW9uL3RvdGFsICAKfQpzdW1tYXJ5LmRmCmBgYAoKSW4gdGVybXMgb2YgdG90YWwgY29tbW9uIGdlbmVzIGJldHdlZW4gdGhlIHR3byBhc3NheXMsIHdlIG9idGFpbiB0aGUgZm9sbG93aW5nIHRhYmxlLiBJdCBpcyBtZWFudCB0byBiZSBwcmVzZW50ZWQgYXMgYSBzYW5pdHkgY2hlY2suCgpgYGB7ciwgZWNobz1GQUxTRX0Kc3VtbWFyeS5kZiA8LSBkYXRhLmZyYW1lKGNvZWZmaWNpZW50PWNvZWZzLCBodXByb3Q9MCwgcHJvdG9hcnJheT0wLCBjb21tb249MCwgamFjY2FyZD0wLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCnJvdy5uYW1lcyhzdW1tYXJ5LmRmKSA8LSBjb2Vmcwpmb3IgKGNvZWYgaW4gY29lZnMpewogIGh1cHJvdC5yZXN1bHRzIDwtIHJlYWQudGFibGUoZmlsZS5wYXRoKCcuLicsICdyZXN1bHRzX2h1cHJvdGFycmF5JywgIHBhc3RlKGNvZWYsJ2NzdicsIHNlcD0nLicpICksIGhlYWRlciA9IFQpCiAgcHJvdG9hcnJheS5yZXN1bHRzIDwtIHJlYWQudGFibGUoZmlsZS5wYXRoKCcuLicsICdyZXN1bHRzJywgIHBhc3RlKGNvZWYsJ2NzdicsIHNlcD0nLicpICksIGhlYWRlciA9IFQpCiAgbmV3X25hbWUgPC0gc2FwcGx5KGFzLnZlY3Rvcihwcm90b2FycmF5LnJlc3VsdHMkTmFtZSksIGNsZWFuX25hbWUpCiAgcHJvdG9hcnJheS5yZXN1bHRzJE5hbWUgPC0gbmV3X25hbWUKICB0b3RhbCA8LSBsZW5ndGgoaHVwcm90LnJlc3VsdHMkSUQpKyBsZW5ndGgocHJvdG9hcnJheS5yZXN1bHRzJE5hbWUpCiAgY29tbW9uIDwtIGxlbmd0aChpbnRlcnNlY3QoaHVwcm90LnJlc3VsdHMkSUQsIHByb3RvYXJyYXkucmVzdWx0cyROYW1lKSkKICBzdW1tYXJ5LmRmW2NvZWYsXSRodXByb3QgPC0gICBsZW5ndGgoaHVwcm90LnJlc3VsdHMkSUQpCiAgc3VtbWFyeS5kZltjb2VmLF0kcHJvdG9hcnJheSA8LSAgIGxlbmd0aChwcm90b2FycmF5LnJlc3VsdHMkTmFtZSkKICBzdW1tYXJ5LmRmW2NvZWYsXSRjb21tb24gPC0gY29tbW9uICAKICBzdW1tYXJ5LmRmW2NvZWYsXSRqYWNjYXJkIDwtIGNvbW1vbi90b3RhbCAgCn0Kc3VtbWFyeS5kZgpgYGAKCgoKYGBge3J9CnRhcmdldHMucHJvdG9hcnJheSA8LSByZWFkVGFyZ2V0cygnLi4vcmF3ZGF0YS9Qcm90b2FycmF5X2Fubm90YXRpb24uY3N2Jywgc2VwPScsJykKCmBgYAoKYGBge3J9CnRhcmdldHMucHJvdG9hcnJheQpgYGAKCmBgYHtyfQp0YXJnZXRzCmBgYAoKIyMgQ29uY2x1c2lvbgpUaGUgdGFibGUgYWJvdmUgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIERFIGdlbmVzIChhZGp1c3RlZCBwLXZhbHVlIDwgMC4wMSkgZm9yIHByb3RvYXJyYXkgYW5kIGh1cHJvdCBhc3NheXMuIFRoZSAnY29tbW9uJyBjb2x1bW4gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGNvbW1vbiBnZW5lcy4gJ2phY2NhcmQnIGlzIGEgc2ltaWxhcml0eSBtZXRyaWMuCgpXZSBkbyBub3Qgc2VlIEFOWSBvdmVybGFwIGJldHdlZW4gdGhlIHR3byBhc3NheXMuIFRoZXJlIGFyZSB0d28gY2hpZWYgcmVhc29uczoKCjEuIFRoZSBleHBlcmltZW50IGlzIG5vdCBiYWxhbmFjZWQ6IHRoZXJlIGFyZSBkaWZmZXJlbnQgbnVtYmVyIG9mIHNhbXBsZXMgaW52b2x2ZWQgYXQgZWFjaCBsZXZlbDogY29udHJvbCwgZ3JhZGUyLCBncmFkZTMsIGdyYWRlNC4gCgoyLiBTYW1wbGUgc2l6ZSBpcyB0b28gc21hbGw6IEFzIGV2aWRlbnQgZnJvbSB0aGUgUENBIGFuZCBNRFMgcGxvdHMsIHRoZXJlIGlzIHRvbyBtdWNoIGhldGVyb2dlbml0eSBpbnRyYS1ncmFkZSBhbmQgYW1vbmcgY29udHJvbHMuCgpJZGVhbGx5IHBvaW50ICMyIHNob3VsZCBub3QgYWZmZWN0IHRoZSBzaW1pbGFyaXR5IHdlIGV4cGVjdCBiZXR3ZWVuIGh1cHJvdCBhbmQgcHJvdG9hcnJheSByZXN1bHRzLCBidXQgcHJvYmFibHkgcHJvYmxlbXMgYXJpc2luZyBmcm9tICMxIG92ZXJzaGFkb3cgaXQuCgpBdCBwcmVzZW50LCB0aGUgcmVzdWx0cyBtYWtlIGxpdHRsZSBzZW5zZSBzaW5jZSB0aGVyZSBpcyBubyBvdmVybGFwIGF0IGFsbC4=